Convertir la date d'horodatage unix en c++
Comme certains sites qui convertissent ces temps unix timbres dire, le cachet de la
2013/05/07 05:01:00 (yyyy/mm/dd, hh:mm:ss) is 1367902860.
La façon dont je le fais en C++, le timbre diffère de la date.
Voici le code:
time_t rawtime;
struct tm * timeinfo;
int year=2013, month=5, day=7, hour = 5, min = 1, sec = 0;
/* get current timeinfo: */
time ( &rawtime ); //or: rawtime = time(0);
/* convert to struct: */
timeinfo = localtime ( &rawtime );
/* now modify the timeinfo to the given date: */
timeinfo->tm_year = year - 1900;
timeinfo->tm_mon = month - 1; //months since January - [0,11]
timeinfo->tm_mday = day; //day of the month - [1,31]
timeinfo->tm_hour = hour; //hours since midnight - [0,23]
timeinfo->tm_min = min; //minutes after the hour - [0,59]
timeinfo->tm_sec = sec; //seconds after the minute - [0,59]
/* call mktime: create unix time stamp from timeinfo struct */
date = mktime ( timeinfo );
printf ("Until the given date, since 1970/01/01 %i seconds have passed.\n", date);
La résultante d'horodatage est
1367899260, but not 1367902860.
Quel est le problème ici? Même si je change d'heure-1 heure ou+1, il ne correspond pas. EDIT: eh Bien oui, si j'ajoute 1 à l'heure, il fonctionne. auparavant également ajouté 1 minutes.
OriginalL'auteur user2366975 | 2014-02-10
Vous devez vous connecter pour publier un commentaire.
Vous devez utiliser timegm() au lieu de mktime(), et c'est tout. Parce que mktime est pour localtime et timegm UTC/GMT temps.
La conversion Entre l'heure Locale et l'heure GMT/UTC en C/C++
Il est
mktime()
en C++, STL, est-il?!Oui:
mktime
,gmtime
,localtime
,ctime
, ... Méfiez-voustimegm
vsgmtime
.OriginalL'auteur José María
Avez-vous de l'heure d'été lorsque vous êtes? Le tm::tm_isdst paramètre est un indicateur de l'heure d'été. Cela aura rempli par le localtime appel en fonction de l'endroit où vous êtes et le moment de l'année et vous n'avez pas à zéro. Donc, même si les deux vous et la page web en utilisant le même temps, si vous avez de l'heure d'été à l'indicateur et la page web n'est pas le cas, alors vous allez vous retrouver différents en 1 heure.
Noter que vous n'avez pas vraiment besoin de la localtime appel. Vous pouvez vous suffit de remplir toutes les pièces manuellement car tm::tm_wday et tm::tm_yday sont ignorés par mktime. Découvrez http://www.cplusplus.com/reference/ctime/tm/ et http://www.cplusplus.com/reference/ctime/mktime/
OriginalL'auteur Phil Rosenberg
Ne pas utiliser un pointeur pour localtime. Enregistrer la valeur réelle
Vous ne savez pas quoi d'autre peut-être en utilisant le pointeur de localtime est de retour. mktime pourraient éventuellement être en utilisant.
OriginalL'auteur cup
On dirait que le site est en supposant que le temps est dans le fuseau horaire UTC, et votre ordinateur est défini à un autre fuseau horaire.
Vous pouvez appeler
gmtime
plutôt quelocaltime
à utiliser UTC pour cela; mais je viens de remarqué que vous n'êtes pas vraiment à l'aide delocaltime
rien à faire, sauf à obtenir un pointeur vers untm
. Vous auriez mieux fait de déclarer un localtm
; celui utilisé parlocaltime
pourraient être réutilisées à chaque fois que vous appelez une autre fois la fonction de la bibliothèque.Malheureusement, il n'y a pas de norme de la variation de
mktime
à l'aide de l'UTC. Si vous voulez UTC, vos options sont:setenv("TZ", "", 1);
. Notez que cela affecte l'ensemble du programme, de sorte que peut être gênant si vous aussi vous avez besoin pour faire face à l'heure locale.timeinfo = gmtime ( &rawtime);
et le résultat reste le même.Oh oui,
mktime
prendra en charge, heure locale, et il n'a pas un UTC version.OriginalL'auteur Mike Seymour
mktime()
convertit local calendrier de temps pour une fois depuis l'époque comme untime_t
objet, de sorte que votre résultat sera différent à partir du site web si vous êtes dans un autre fuseau horaire. Le site prend2013/05/07 05:01:00
comme un rapport à l'heure UTC. Le même code sur ma machine a un résultat de1367874060
, qui est de 8 heure à partir du site web de la valeur. Je suis à l'UTC+8:00 fuseau horaire, de sortemktime()
sur ma machine prend l'entrée2013/05/07 05:01:00
comme un UTC+8:00 le temps, provoquant la différence.PS:
localtime()
retourne un pointeur statique internestruct tm
objet. La structure peut être partagé entregmtime()
,localtime()
, etctime()
, et peut être remplacé à chaque invocation. Il est donc préférable d'avoir votre propre copie locale d'unstruct tm
objet.OriginalL'auteur neverhoodboy