2009-07-15 8 views
1

Comment puis-je créer un temps de UTC en C pour la date suivante:Comment créer une heure UTC en C pour un jour, un mois et une année spécifiques?

1er Juillet 2038

en utilisant des appels de fonction standard ANSI C (étant donné que l'élément tm_year de la structure tm ne peut pas être supérieure à 137)?

+0

Ce n'est pas une mauvaise question de programmation, si vous ignorez le spécifique, invalide en 32 bits, date donnée. Je pourrais diviser ceci en deux questions, ou réécrire le texte de la question pour mettre en évidence le problème 2038. – jmanning2k

+0

Comme le type 'time_t' est défini par l'implémentation, seuls les systèmes 32 bits rencontrent un problème en 2038; la plupart des systèmes 64 bits ont déjà migré vers des valeurs 'time_t' de 64 bits, et vous aurez probablement besoin de vous inquiéter du soleil qui brûle avant que ça ne se répète. (Plus précisément: Solaris 10 - code 64 bits a 'sizeof (time_t) == 8' et le code 32 bits a' sizeof (time_t) == 4'.) –

Répondre

6

Ce n'est pas le cas. Le fichier time_t ANSI C 32 bits est remplacé en 2038. C'est comme demander comment vous créez le 23 juillet 2003 dans votre ancien système COBOL à 2 chiffres.

+0

Juste pour clarifier juillet 2038 est hors de portée, il roule en janvier 2038. – Powerlord

+1

2038 19 janvier, 03:14:07 UTC étant la dernière seconde avant qu'il ne se retourne. – Powerlord

+0

Si quelqu'un se demande, c'est 2^31-1 secondes (c'est-à-dire le plus grand entier signé 32 bits) après minuit le 1er janvier 1970. –

1

Vous pouvez essayer, en utilisant l'exemple suivant:

#include <time.h> 
#include <stdio.h> 


int main(void) 
{ 
    struct tm *local; 
    time_t t; 

    t = time(NULL); 
    local = localtime(&t); 
    printf("Local time and date: %s\n", asctime(local)); 
    local = gmtime(&t); 
    printf("UTC time and date: %s\n", asctime(local)); 

    return 0; 
} 

Il devrait vous donner le résultat escompté.

+0

-1 Ne fait pas ce que David a demandé (ignorant l'aspect roll-over). t = temps (NULL) obtenir l'heure * courante *, pas une heure arbitraire. -1 pour réutiliser une variable (locale) d'une manière confuse. – mctylr

2

D'autres ont noté que la date particulière que vous donnez comme exemple tombe au-delà de la date/heure maximale représentable par un time_t de 32 bits, souvent appelé le problème Year 2038. Une solution consiste à utiliser un time_t 64 bits, ce que font certains systèmes POSIX 64 bits (linux amd64), et appeler mktime.

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

int main(void) 
{ 
     struct tm future;  /* as in future date */ 
     time_t t; 

     future.tm_sec = 0; 
     future.tm_min = 0; 
     future.tm_hour = 0; 
     future.tm_mday = 1;  /* 1st */ 
     future.tm_mon = 6;  /* July */ 
     future.tm_year = 2038 - 1900; /* 2038 in years since 1900 */ 
     future.tm_isdst = 0;   /* Daylight Saving not in affect (UTC) */ 
#ifdef _BSD_SOURCE 
     future.tm_zone = "UTC"; 
#endif 

     t = mktime(&future); 
     if (-1 == t) { 
       printf("Error converting 1 July 2038 to time_t time since Epoch\n"); 
       return EXIT_FAILURE; 
     } 

     printf("UTC time and date: %s\n", asctime(&future)); 

     return EXIT_SUCCESS; 
} 
Questions connexes