5 votes

strptime en c avec décalage des fuseaux horaires

J'ai du mal à trouver un moyen d'analyser le fuseau horaire dans des chaînes de caractères comme celles qui suivent : "Thu, 1 Sep 2011 09:06:03 -0400 (EDT)"

Ce que je dois faire dans le cadre plus large de mon programme est de prendre un char* et de le convertir en un time_t. Ce qui suit est un simple programme de test que j'ai écrit pour essayer de déterminer si strptime tenait compte du fuseau horaire, et il semble que ce ne soit pas le cas (lorsque ce programme de test est exécuté, tous les chiffres imprimés sont les mêmes alors qu'ils devraient être différents). Des suggestions ?

J'ai également essayé d'utiliser GNU getdate et getdate_r, parce que cela semble être une meilleure option pour des formats éventuellement flexibles, mais j'ai reçu un avertissement "déclaration de fonction implicite" du compilateur, ce qui implique que je n'ai pas inclus les bonnes bibliothèques. Y a-t-il quelque chose d'autre que je devrais #inclure pour utiliser getdate ?

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

#ifndef __USE_XOPEN
#define __USE_XOPEN
#endif
#include <time.h>

int main (int argc, char** argv){

char *timestr1, *timestr2, *timestr3;
struct tm time1, time2, time3;
time_t timestamp1, timestamp2, timestamp3;

timestr1 = "Thu, 1 Sep 2011 09:06:03 -0400 (EDT)"; // -4, and with timezone name
timestr2 = "Thu, 1 Sep 2011 09:06:03 -0000"; // -0

strptime(timestr1, "%a, %d %b %Y %H:%M:%S %Z", &time1); //includes UTC offset
strptime(timestr2, "%a, %d %b %Y %H:%M:%S %Z", &time2); //different UTC offset
strptime(timestr1, "%a, %d %b %Y %H:%M:%S", &time3); //ignores UTC offset

time1.tm_isdst = -1;
timestamp1 = mktime(&time1);
time2.tm_isdst = -1;
timestamp2 = mktime(&time2);
time3.tm_isdst = -1;
timestamp3 = mktime(&time3);

printf("Hello \n");
printf("%d\n%d\n%d\n", timestamp1, timestamp2, timestamp3);
printf("Check the numbers \n");
return 0;
}

4voto

Jonathan Leffler Points 299946

Sous MacOS X (10.7.1), l'un des "bogues" répertoriés dans l'avis d'alerte de la Commission européenne a été corrigé. strptime(3) la page du manuel est :

Le spécificateur de format %Z accepte uniquement les abréviations du fuseau horaire local, ou la valeur "GMT". Cette limitation est due à une ambiguïté due à la surcharge d'abréviations de fuseaux horaires. Par exemple, EST correspond à la fois à l'heure normale de l'Est et à l'heure d'été de l'Australie orientale.

Il y a quelque temps, j'ai écrit une paire de commandes - timestamp (mai 1989 pour la révision 1.1) et strptime (juillet 2007 pour la révision 1.1). Ce sont des couvertures relativement minces sur le strftime() y strptime() fonctions.

En les exécutant sur MacOS X, j'obtiens :

$ strptime -T '%Y-%m-%dT%H:%M:%S %Z' 2011-09-08T21:00:00PDT
1315540800 = 2011-09-08T21:00:00PDT
$ timestamp 1315540800
1315540800 = Thu Sep 08 21:00:00 2011
$ timestamp -u 1315540800
1315540800 = Fri Sep 09 04:00:00 2011
$ strptime -T '%Y-%m-%dT%H:%M:%S %Z' 2011-09-08T21:00:00GMT
1315515600 = 2011-09-08T21:00:00GMT
$ timestamp 1315515600
1315515600 = Thu Sep 08 14:00:00 2011
$ timestamp -T '%Y-%m-%dT%H:%M:%S %z' 1315515600
1315515600 = 2011-09-08T14:00:00 -0700
$

Je suis à US/Pacific (ou America/Los_Angeles, ou Pacific Daylight Time ; UTC-07:00), donc ce que ces commandes montrent est que (comme la page du manuel le dit), strptime() reconnaît PDT et GMT et donne les réponses appropriées pour chacun d'eux. Le site -u option pour timestamp indique "imprimer l'heure UTC (ou GMT)" plutôt que l'heure locale. Et 21 heures en UTC correspond effectivement à 14 heures en PDT.

Contactez-moi si vous souhaitez obtenir la source - voir mon profil.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X