IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Delphi Discussion :

Conversion date et heure texte UNIX en TDateTime


Sujet :

Langage Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 80
    Points : 56
    Points
    56
    Par défaut Conversion date et heure texte UNIX en TDateTime
    Bonjour à tous,

    Je travaille actuellement sur des fichiers qui contiennent des informations date et heure codées en texte au format UNIX (je pense).
    Exemple : 18-Sep-17 11:28 AM CEST ou 18-Sep-17 12:20 PM CEST

    Je récupère ces valeurs en tant que chaine de caractères dans les fichiers mais je voudrais ensuite les transformer en valeurs TDateTime.

    Je ne vois aucune fonction pour transformer ma chaine en valeur TDateTime !
    La seule solution que je vois c'est de décoder petit morceaux par petits morceaux (18 puis Sep puis 17 puis 11 puis...)

    Y-a-t-il une solution plus ou moins intégrée ou dois-je faire mon usine à gaz ?

    Merci d'avance.

    Greldinard

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 042
    Points : 40 955
    Points
    40 955
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    Cela serait plus aisé si votre date était en numérique
    voir : System.DateUtils.UnixToDateTime
    mais aussi
    // 4x faster than dateutils version
    function UNIXTimeToDateTimeFAST(UnixTime: LongWord): TDateTime;
    begin
    Result := (UnixTime / 86400) + 25569;
    end;

    // 10x faster than dateutils version
    function DateTimeToUNIXTimeFAST(DelphiTime : TDateTime): LongWord;
    begin
    Result := Round((DelphiTime - 25569) * 86400);
    end;
    ou encore au format ISO8601 System.DateUtils.ISO8601ToDate

    Toutefois vous avez la fonction function StrToDate(const S: string; const AFormatSettings: TFormatSettings): TDateTime; en jouant sur les formatsettings ce doit être jouable.

    [Edit]
    Voici une tentative
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    procedure TForm8.Button1Click(Sender: TObject);
    var FormatSet : TFormatSettings;
        ADate : TDateTime;
        S : String;
    begin
      FormatSet:=TFormatSettings.Create('en-US');
      Memo1.Lines.Clear;
      FormatSet.DateSeparator:='-';
      FormatSet.LongDateFormat:='dd/mmm/yyyy';
      FormatSet.ShortDateFormat:='dd/mmm/yy';
      FormatSet.LongTimeFormat:='h:mm AMPM';
      FormatSet.ShortTimeFormat:='h:mm AMPM';
      FormatSet.TimeSeparator:=':';
      FormatSet.TimeAMString:='AM';
      FormatSet.TimePMString:='PM';
      ADate:=EncodeDateTime(2017,10,18,11,28,0,0);
      Try
         S:=DateTimeToStr(ADate,FormatSet);
         memo1.Lines.Add(S);
         ADate:=StrToDateTime(S,FormatSet);  // plante
         Resultat.Caption:=FormatDateTime('dd/mm/yyyy hh:nn',ADate);
      except
       on E:Exception do
       Memo1.Lines.Add(E.Message);
      End;
    end;
    toutefois j'ai un planton incompréhensible S est formaté selon mes directives donc la conversion StrToDate devrait fonctionner mais ce n'est pas le cas !
    Si je ne modifie aucun des settings c'est OK
    A mon avis il y a une astuce avec les Long et Short format que je ne pige pas si quelqu'un a l'idée ....


    Je n'ai qu'un doute et il concerne la zone (CEST)
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 80
    Points : 56
    Points
    56
    Par défaut
    Merci SergioMaster pour ton aide et tes idées.

    Bon je me suis fait une petite fonction de décodage.
    Dans un premier temps la date que je décode en trois temps : d'abord le jour, puis le mois puis l'année.
    Je décode l'heure en une seule passe directement via la fonction TryStrToTime.
    Mais je dois avouer que j'ignore complètement la zone (CEST) puisque je n'en ai pas besoin.
    Voilà ce que ça donne (je n'en suis pas très fier mais ça fonctionne).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
      function DecodeUnixTextDateTime(const TextDate: string; var DateHeure: TDateTime): Boolean;
      const
        Months: array[1..12] of string = ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec');
     
      var
        St: string;
        I, AYear, AMonth, ADay: Integer;
        Heure: TDateTime;
        List: TStringList;
     
      begin
        Result:= True;
        //-- Jour
        St:= SeekItem(TextDate, 1, '-');
        if not TryStrToInt(St, ADay) 
          then Exit(False);
        //-- Mois
        List := TStringList.Create;
        for I:= Low(Months) to High(Months) do
          List.Add(Months[I]);
        St:= SeekItem(TextDate, 2, '-');
        AMonth:= List.IndexOf(St);
        List.Clear;
        List.Free;
        if (AMonth = -1) 
          then Exit(False);
        end;
        //-- Année
        St:= '20'+Copy(TextDate, 8, 2);
        if not TryStrToInt(St, AYear) 
          then Exit(False);
        //-- Heure
        St:= Copy(TextDate, 10, Length(TextDate)-14);
        if not TryStrToTime(St, Heure) 
          then Exit(False);
        end;
        try
          DateHeure:= DateOf(EncodeDate(AYear, AMonth, ADay))+TimeOf(Heure);
        except
          on e: Exception do begin
            Exit(False);
          end;
        end;
      end;

  4. #4
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    Explication de l'heure CEST ici
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

Discussions similaires

  1. Conversion date et heure
    Par Dominique_78 dans le forum Langage
    Réponses: 2
    Dernier message: 06/12/2006, 09h15
  2. Conversion de date et heure en Excel
    Par youcef81 dans le forum Excel
    Réponses: 2
    Dernier message: 03/10/2006, 12h39
  3. conversion UTC to date et heure
    Par tit_oune dans le forum C++
    Réponses: 6
    Dernier message: 23/06/2006, 21h01
  4. Conversion d'un fichier texte unix -> dos
    Par lejert dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 15/11/2005, 15h59
  5. Conversion date ->heures
    Par bdkiller dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 02/09/2004, 16h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo