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

 C Discussion :

Date/Time en nanoseconds


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2010
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 34
    Par défaut Date/Time en nanoseconds
    Bonjour,

    j'aimerai, en C, récuperer la date et l'heure du système (ou local, encore mieux) en nanosecondes, réferencé par exemple par rapport au 1er janvier 1970.

    Après consultation de la FAQ, j'ai vu qu'on pouvait récuper cette valeur en s (time(NULL)) ou utiliser GetLocalTime, mais ça renvoit un structure, donc je n'ai pas accès à l'info.

    Une idée ?

    Merci,
    Benoit

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 484
    Par défaut
    Le plus répandu sur les systèmes POSIX est gettimeofday(), car il tient compte, en plus des spécificités de l'heure que tu lis, comme les fuseaux horaires ou les secondes intercalaires ajoutées au fil des années (time() ne le fait pas). Le fait qu'elle remplisse une structure ne t'empêche absolument de lire le résultat, et heureusement. Simplement, il faut le faire en deux fois.

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    struct timeval tv;
     
    gettimeofday (&tv,NULL);
    printf ("Nombre de secondes écoulées depuis le 1er janvier 1970 : %d\n",tv.tv_sec);

  3. #3
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Par défaut
    De mémoire, si ton system est compatible posix, tu peux utiliser clock_gettime() qui utilise une structure timespec qui a un membre 'tv_nsec' qui sont les nanosecondes.
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 484
    Par défaut
    Citation Envoyé par Vincent Rogier Voir le message
    De mémoire, si ton system est compatible posix, tu peux utiliser clock_gettime() qui utilise une structure timespec qui a un membre 'tv_nsec' qui sont les nanosecondes.
    C'est effectivement recommandé par POSIX 2008 mais j'ai préféré m'abstenir parce que d'une part, je pense que même sur des machines récentes, une précision à la nanoseconde ne vient rien dire, et parce qu'il faut choisir l'horloge à utiliser. À priori, il faut utiliser CLOCK_REALTIME mais je ne suis pas persuadé que cet appel n'aille pas lire directement l'horloge matérielle plutôt que l'heure gérée par le système, ce qui provoque une latence beaucoup plus importante.

  5. #5
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2010
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 34
    Par défaut
    Merci pour les infos.
    J'ai par contre oublié de préciser que j'étais sous Windows...

    J'ai trouvé une solution (vous me direz si c'est convenable, en tout cas ça marche), mais je n'ai le temps qu'en ms (c'est déjà pas mal)

    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
     
    # include <windows.h>
    # include <time.h>
     
    FILETIME    ft;
    SYSTEMTIME  st;
    ULONGLONG   ms_time, ux_time;
     
     
    GetLocalTime(&st);
    SystemTimeToFileTime(&st, &ft);
     
    /* Time since January 1, 1601 (UTC) in microseconds: */
    ms_time = (((ULONGLONG)ft.dwHighDateTime)<<32 | ft.dwLowDateTime) / 10;
     
    /* Time since the EPOCH (January 1, 1970 (UTC)) in microseconds */
    ux_time = ms_time - 11644473600000000ULL;
     
    tv->tv_sec  = (long)(ux_time / 1000000UL);
    tv->tv_usec = (long)(ux_time % 1000000UL);
    et le tour est joué

  6. #6
    Membre émérite
    Avatar de Montor
    Homme Profil pro
    Autre
    Inscrit en
    Avril 2008
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 879
    Par défaut
    Bouben
    Obsidian
    je vous demande pour quoi on peut pas utiliser la fonction QueryPerformanceCounter

    ou en asm
    Code asm : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        DW  310Fh
        MOV DWORD PTR PS   ,EAX
        MOV DWORD PTR PS[4],EDX

  7. #7
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 484
    Par défaut
    Citation Envoyé par Montor Voir le message
    Bouben
    Obsidian
    je vous demande pour quoi on peut pas utiliser la fonction QueryPerformanceCounter
    Parce que ce n'est pas portable et que, même sous Windows, ce n'est disponible qu'à partir de W2K ? Bouben n'a précisé sa plateforme qu'à partir du cinquième post.

Discussions similaires

  1. Controle Date Time Picker en mode 24h
    Par MarieMtl dans le forum MFC
    Réponses: 1
    Dernier message: 24/11/2005, 16h38
  2. ERROR: date/time
    Par MaitrePylos dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 17/08/2005, 10h15
  3. Date time picker
    Par Steph4 dans le forum MFC
    Réponses: 3
    Dernier message: 01/03/2005, 14h30
  4. comparer des champs date time
    Par HULK dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 25/01/2005, 14h02
  5. [DATE][TIME] Manque 1 heure
    Par cpr0 dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 01/07/2004, 16h43

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