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

Apple Discussion :

Mac OS X / bash: comment obtenir la date courante précise (milliseconde, microseconde ou nanoseconde)


Sujet :

Apple

  1. #1
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Points : 5 851
    Points
    5 851
    Par défaut Mac OS X / bash: comment obtenir la date courante précise (milliseconde, microseconde ou nanoseconde)
    Bonjour,

    J'ai un shell script sous linux qui utilise la commande pour obtenir la date courante sous la forme <nb de sec depuis epoch>.<nb de nanosecondes> afin de faire des traitements plus précis que la seconde. Ce script utilise la nanoseconde, mais la milliseconde me suffirait amplement.

    Par contre, sous Mac OS X, dans un bash, je n'ai pas réussi à avoir mieux que la seconde avec la commande "date" qui, apparemment, d'après le "man date", ne peut pas faire mieux.

    Bref, comme dit dans le titre, y a-t-il moyen d'avoir la date courante avec plus de précision que la seconde?

    Merci d'avance

    )jack(

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 952
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 952
    Points : 4 378
    Points
    4 378
    Par défaut
    pas en shell…

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #include <sys/time.h>
    
    int gettimeofday(struct timeval *tp, struct timezone *tzp);
    timeval travaille en microsecondes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    struct timeval {
                 time_t       tv_sec;   /* seconds since Jan. 1, 1970 */
                 suseconds_t  tv_usec;  /* and microseconds */
         };
    et pour les nanosecondes, il faut descendre dans la couche Mach-O (#include <mach/clock.h>) :

    host_get_clock_service [3 services possibles: SYSTEM_CLOCK, CALENDAR_CLOCK ou REALTIME_CLOCK], clock_get_attributes, clock_get_time
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    struct mach_timespec {
            unsigned int    tv_sec;                 /* seconds */
            clock_res_t             tv_nsec;                /* nanoseconds */
    };

  3. #3
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Points : 5 851
    Points
    5 851
    Par défaut
    Citation Envoyé par JeitEmgie Voir le message
    pas en shell…

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #include <sys/time.h>
    
    int gettimeofday(struct timeval *tp, struct timezone *tzp);
    timeval travaille en microsecondes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    struct timeval {
                 time_t       tv_sec;   /* seconds since Jan. 1, 1970 */
                 suseconds_t  tv_usec;  /* and microseconds */
         };
    et pour les nanosecondes, il faut descendre dans la couche Mach-O (#include <mach/clock.h>) :

    host_get_clock_service [3 services possibles: SYSTEM_CLOCK, CALENDAR_CLOCK ou REALTIME_CLOCK], clock_get_attributes, clock_get_time
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    struct mach_timespec {
            unsigned int    tv_sec;                 /* seconds */
            clock_res_t             tv_nsec;                /* nanoseconds */
    };
    Merci JeitEmgie,

    je ne souhaite pas le faire en C.

    En fait, en cherchant "Getting current time in milliseconds", je suis tombé sur http://www.rhinocerus.net/forum/lang...liseconds.html, où j'ai trouvé ceci qui répond parfaitement à mon attente:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    t=`perl -MTime::HiRes=gettimeofday -e 'print int(1000*gettimeofday()).qq(\n);'`
    echo Time in msec is $t
    ça prend de l'ordre de 20ms sur un iMac Intel Core 2 Duo à 2.16 GHz, ce qui n'a aucune importance pour mon problème.

    Merci quand même.

    )jack(

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 952
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 952
    Points : 4 378
    Points
    4 378
    Par défaut
    Devoir invoquer Perl est quand même un peu dommage…

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    
    time mach_date
    2011-02-20 11:40:56.420308000
    
    real	0m0.003s
    user	0m0.000s
    sys	0m0.001s
    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
    
    #include "mach_date.h"
    #include <stdio.h>
    #include <sys/time.h>
    #include <mach/mach.h>
    #include <mach/clock.h>
    
    static void format(mach_timespec_t *mts)
    {
    	char buffer[128] ;
    	time_t clock = mts->tv_sec ;
    	struct tm *lt = localtime(&clock);
    	
    	strftime(buffer, 127, "%Y-%m-%d %H:%M:%S",lt);
    	sprintf(buffer+strlen(buffer),".%d",mts->tv_nsec) ;
    	printf("%s\n",buffer) ;
    }
    
    int main(int argc, char **argv)
    {
    	host_name_port_t myself = mach_host_self() ;
    	kern_return_t kr ;
    	clock_serv_t clock_serv ;
    	clock_id_t	clock_id = CALENDAR_CLOCK ;
    	mach_timespec_t timespec ;
    		
    	kr = host_get_clock_service(myself, clock_id, &clock_serv) ;
    	if (kr != KERN_SUCCESS) {
    		fprintf(stderr,"Fails to get clock service CALENDAR (%d)\n", kr) ;
    		mach_port_deallocate(mach_task_self(), myself) ;
    		return 1 ;
    	}
    	
    	kr = clock_get_time(clock_serv, &timespec) ;
    	if (kr != KERN_SUCCESS) {
    		fprintf(stderr,"Fails to get time of service CALENDAR (%d)\n", kr) ;
    		mach_port_deallocate(mach_task_self(), myself) ;
    		mach_port_deallocate(mach_task_self(), clock_serv) ;
    		return 1 ;
    	}
    	
    	format(&timespec) ;
    	
    	mach_port_deallocate(mach_task_self(), myself) ;
    	mach_port_deallocate(mach_task_self(), clock_serv) ;
    	
    	return 0 ;
    }
    Fichiers attachés Fichiers attachés

  5. #5
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Points : 5 851
    Points
    5 851
    Par défaut
    Citation Envoyé par JeitEmgie Voir le message
    Devoir invoquer Perl est quand même un peu dommage…
    Sur le fond, je suis assez d'accord... mais je n'ai pas la maîtrise complète des règles du jeu.

    "On" me demande de tout faire en langage de commande... donc je fais...

    Citation Envoyé par JeitEmgie Voir le message
    Merci quand même pour le code, qui pourra resservir à l'occasion, à moi ou d'autres...

    Encore merci

    )jack(

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 10
    Dernier message: 09/01/2006, 18h39
  2. [C#]comment obtenir la date du jour?
    Par bakonu dans le forum C#
    Réponses: 2
    Dernier message: 03/11/2005, 11h58
  3. Comment obtenir la date dans une store proc?
    Par Dnx dans le forum Langage SQL
    Réponses: 4
    Dernier message: 17/10/2005, 17h31
  4. comment obtenir une date dans une storeproc?
    Par Dnx dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 14/10/2005, 15h19
  5. Comment obtenir la date de début d'une semaine ?
    Par Vodkha dans le forum Langage
    Réponses: 5
    Dernier message: 19/08/2005, 09h54

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