2010-02-16 6 views

Répondre

6

Vous devez utiliser un mélange de tzset() avec les fonctions time/gmtime/localtime/mktime.

Essayez ceci:

#include <stdio.h> 
#include <stdlib.h> 

#include <time.h> 

time_t makelocal(struct tm *tm, char *zone) 
{ 
    time_t ret; 
    char *tz; 

    tz = getenv("TZ"); 
    setenv("TZ", zone, 1); 
    tzset(); 
    ret = mktime(tm); 
    if(tz) 
     setenv("TZ", tz, 1); 
    else 
     unsetenv("TZ"); 
    tzset(); 
    return ret; 
} 

int main(void) 
{ 
    time_t gmt_time; 
    time_t local_time; 
    struct tm *gmt_tm; 

    gmt_time = time(NULL); 
    gmt_tm = gmtime(&gmt_time); 
    local_time = makelocal(gmt_tm, "CET"); 

    printf("gmt: %s", ctime(&gmt_time)); 
    printf("cet: %s", ctime(&local_time)); 

    return 0; 
} 

En fait, ce programme prend le jour de l'ordinateur en cours comme GMT (heure (NULL)), et le convertir en CET:

$ ./tolocal 
gmt: Tue Feb 16 09:37:30 2010 
cet: Tue Feb 16 08:37:30 2010 
3

réponse de M. MARIE fait pas en fait travailler pour la question posée: tzset() est POSIX, mais pas ANSI C comme le titre de la question initiale posée. Il n'y a aucune mention de C90 ou C99 (de la recherche dans les projets de normes, je n'ai pas accès aux normes définitives).

OP question est peut-être un peu vague car on ne sait pas ce qu'il veut dire par "temps utc", mais il suppose sans doute des composants décomposés, disons rempli dans un struct tm.

Il est possible dans C99 de déterminer le décalage TZ local de l'UTC en analysant la sortie de strftime("%z",...) (assurez-vous de l'appeler avec vos propres valeurs de date, car ce décalage changera avec le temps); mais ce code de format n'est pas disponible en C90, donc je vous dis que vous n'avez pas de chance si vous devez vous conformer à C90, sauf si vous voulez essayer d'analyser la sortie de strftime("%Z",...), mais cela sera fondamentalement non portable.

Vous pouvez ensuite convertir vos composants UTC en time_t en utilisant mktime(), bien qu'ils soient interprétés comme dans le fuseau horaire local; puis appliquez le décalage et convertissez-le en composants décomposés à l'aide de localtime(). Vous pouvez rencontrer des cas de bordure autour du moment où votre fuseau horaire local bascule vers DST (ou lorsque les modifications du décalage de votre fuseau horaire sont effectuées), mais cela peut être facilement évité en passant à un paramètre régional qui n'utilise pas DST ou amélioré par Si vous appelez strftime() et mktime() Vous pouvez également vous limiter à ANSI C.

Questions connexes