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

Delphi Discussion :

Conversion TDateTime vers une chaine


Sujet :

Delphi

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 47
    Points : 39
    Points
    39
    Par défaut Conversion TDateTime vers une chaine
    J'utilise ce code pour connaitre le temps depuis lequel windows a démarré
    cependant la commande DateToStr() ne me renvoie que la date et pas l'heure de TDateTime. Comment obtenir les 2 ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Function DateBoot : TDateTime;
    Begin
      Result := Now-(GetTickCount/1000)/(24*3600);
    End;
    ...
    ListItem.SubItems.Add(DateToStr(TimeBoot));
    idem pour le type TTime

    Merci.

  2. #2
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 561
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 561
    Points : 3 955
    Points
    3 955
    Par défaut
    Salut

    GetTickCount renvoie le nombre de milliseconde écoulées depuis le démarrage
    de Windows (c'est assze flou en soi au vu de la durée de démarrage). C'est donc une durée. Je ne conçois donc pas l'intérêt de retrancher la date/heure courante. En outre, tu retranches un nombre de jours (c'est long pour une session Windows normal). J'ai un peu l'impression que tu mélanges instant et durée, ce qui est gênant pour les données calendaires...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    function GetSessionDuration: String
    const 
      msecInDays = 1000 * 3600 * 24;
    var
      Days, _Time: Word;
    begin
      Days := GetTickCount;
      _Time := Days mod msecInDays;
      Days := Days div msecInDays;
      Result := format('%d j. et %s',[Days, FormatDateTime('hh:nn:ss:zzz')]),
    End;
    Cette solution retourne directement la bonne chaîne.

    cdlt

  3. #3
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 561
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 561
    Points : 3 955
    Points
    3 955
    Par défaut
    Si tu veux connaître la date de démarrage (et non le temps depuis celui-ci) de ta session (ce qui retrospectivement correspond sans doute mieux à ton besoin) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ListItem.SubItems.Add(formatDateTime('dd/mm/yyyy hh:nn:ss:zzz',TimeBoot));
    devrait suffire.

    en outre une coquille se trouve dans ma solution précédente :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    function GetSessionDuration: String
    const 
      msecInDays = 1000 * 3600 * 24;
    var
      Days, _Time: Word;
    begin
      Days := GetTickCount;
      _Time := Days mod msecInDays;
      Days := Days div msecInDays;
      Result := format('%d j. et %s',[Days, FormatDateTime(_Time,'hh:nn:ss:zzz')]),
    End;
    cdlt

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 47
    Points : 39
    Points
    39
    Par défaut
    cela me renvoie une date de session du 30/12/1899 !!! avec un horaire bizarre !!

    Tu emet des doutes mais Je ne faisait que reprendre le code de développez.com: "Depuis combien de temps l'ordinateur a démarré ?"
    http://www.developpez.com/delphi/faq...=systemedivers

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Function DateBoot : TDateTime;
    Begin
      Result := Now-(GetTickCount/1000)/(24*3600);
    End;

  5. #5
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 561
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 561
    Points : 3 955
    Points
    3 955
    Par défaut
    Le code que tu mentionne donne la date/heure de démarrage et non le temps (qui est une durée dans le langage courant).

    Voici un code qui fonctionne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    function WindowsStartDate : TDateTime;
    begin
      Result := Now-(GetTickCount/1000)/(24*3600);
    End;
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      ShowMessage(formatDateTime('dd/mm/yyyy hh:nn:ss:zzz',WindowsStartDate));
    end;

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 47
    Points : 39
    Points
    39
    Par défaut
    super ! ca devrait marché (je teste ce soir)
    mias il me faut également la durée en heure:min et sec

    et la même chose pour la durée de la session Windows

    Daniel

  7. #7
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 561
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 561
    Points : 3 955
    Points
    3 955
    Par défaut
    Citation Envoyé par secretman
    super ! ca devrait marché (je teste ce soir)
    mias il me faut également la durée en heure:min et sec

    et la même chose pour la durée de la session Windows

    Daniel
    Regarde bien mes réponses, je pense que tout est déjà fait.

    cdlt

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 210
    Points : 84
    Points
    84
    Par défaut
    tu peux utiliser DateTimeToStr !

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 47
    Points : 39
    Points
    39
    Par défaut
    DateTimeToStr ! génial ! c'est cela que je cherchais depuis le début
    tout simplement

    Pour connaitre le temps passer dans la session courante de Windows (GettickCount est alors inutilisable) j'ai trouvé ce code en VB (y a t-il plus simple en Delphi ???) sinon quelqu'un a t-il le courrage faire la traduction Delphi ?

    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
     
    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" ( _
                                    ByVal lpClassName As String, _
                                    ByVal lpWindowName As String) As Long
    Private Declare Function GetWindowThreadProcessId Lib "user32" ( _
                                    ByVal hwnd As Long, _
                                    lpdwProcessId As Long) As Long
    Private Declare Function OpenProcess Lib "Kernel32.dll" ( _
                                    ByVal dwDesiredAccessas As Long, _
                                    ByVal bInheritHandle As Long, _
                                    ByVal dwProcId As Long) As Long
    Private Const PROCESS_QUERY_INFORMATION = 1024
    Private Declare Function GetProcessTimes Lib "kernel32" ( _
                                    ByVal hProcess As Long, _
                                    lpCreationTime As FILETIME, _
                                    lpExitTime As FILETIME, _
                                    lpKernelTime As FILETIME, _
                                    lpUserTime As FILETIME) As Long
    Private Type FILETIME
            dwLowDateTime As Long
            dwHighDateTime As Long
    End Type
    Private Type SYSTEMTIME
        wYear As Integer
        wMonth As Integer
        wDayOfWeek As Integer
        wDay As Integer
        wHour As Integer
        wMinute As Integer
        wSecond As Integer
        wMilliseconds As Integer
    End Type
    Private Declare Function FileTimeToLocalFileTime Lib "kernel32" ( _
                                    lpFileTime As FILETIME, _
                                    lpLocalFileTime As FILETIME) As Long
    Private Declare Function FileTimeToSystemTime Lib "kernel32" ( _
                                    lpFileTime As FILETIME, _
                                    lpSystemTime As SYSTEMTIME) As Long
    Private Declare Function CloseHandle Lib "kernel32" ( _
                                    ByVal hObject As Long) As Long
    '
     
    Private Sub Form_Load()
     
        Dim lHandle As Long, lPiD As Long, lProcessHandle As Long
        Dim mDummy0 As FILETIME, mHeure As SYSTEMTIME
        Dim mDummy1 As FILETIME, mDummy2 As FILETIME, mDummy3 As FILETIME
        Dim Temp As Date
     
        ' Récupère le handle dy SysTray (élément obligatoire du système)
        lHandle = FindWindow("Shell_traywnd", vbNullString)
        If lHandle = 0 Then Debug.Print "1 - Handle": Beep: End
     
        ' Récupère le ProcessId de cet objet
        Call GetWindowThreadProcessId(lHandle, lPiD)
        If lPiD = 0 Then Debug.Print "2 - PiD": Beep: End
     
        ' Récupère le handle associé aux paramètres
        lProcessHandle = OpenProcess(PROCESS_QUERY_INFORMATION, 0, lPiD)
        If lProcessHandle = 0 Then Debug.Print "3 - Process": Beep: End
     
        ' Récupère la date de création du cette instance
        Call GetProcessTimes(lProcessHandle, mDummy0, mDummy1, mDummy2, mDummy3)
        ' Referme le process
        Call CloseHandle(lProcessHandle)
     
        ' Corrige l'heure en fonction des données locales (fuseau horaire)
        Call FileTimeToLocalFileTime(mDummy0, mDummy1)
     
        ' Transforme le format de cette info en jj/mm/yyyy hh:nn:ss.lll
        Call FileTimeToSystemTime(mDummy1, mHeure)
     
        ' Mise en forme
        With mHeure
            Temp = CDate(CStr(.wDay) & "/" & CStr(.wMonth) & "/" & CStr(.wYear) & _
                   " " & CStr(.wHour) & ":" & CStr(.wMinute) & ":" & CStr(.wSecond))
        End With
        ' Heure de lancement de la session
        txtHeureDémarrage.Text = Temp
        ' Nombre de minutes écoulées depuis le lancement
        txtDémarréDepuis.Text = CStr(DateDiff("n", Temp, Now))
     
    End Sub

Discussions similaires

  1. Empecher la conversion html d'une chaine
    Par titan_33 dans le forum ASP.NET
    Réponses: 1
    Dernier message: 02/02/2009, 15h41
  2. Réponses: 2
    Dernier message: 30/10/2007, 17h41
  3. ensemble de données vers une chaine de caractere.
    Par Delphieur dans le forum Oracle
    Réponses: 1
    Dernier message: 06/08/2007, 17h34
  4. Réponses: 10
    Dernier message: 11/01/2007, 08h54
  5. conversion string vers une date
    Par fatati dans le forum C++Builder
    Réponses: 7
    Dernier message: 14/12/2006, 10h09

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