2010-08-05 4 views
4

Tout en faisant les données/temps d'analyse syntaxique C++ (la conversion d'une chaîne dans un format à une date), je trouve les méthodes utiles suivantesDate/heure d'analyse syntaxique C++

1) strptime() - ici le% d ,% m etc peut avoir 1 ou 2 caractères. La fonction prendra soin de cela. À la suite de cela, il sera nécessaire d'utiliser un séparateur entre deux spécificateurs de conversion. Ex: Il n'est pas valide de donner% d% m à% d /% m ou à tout autre séparateur. En outre, cela ne supporte pas les fuseaux horaires.

2) Boost date IO - ici le% d,% m doit avoir 2 caractères. Maintenant, la chaîne d'entrée que j'obtiens n'est pas garantie d'avoir ceci. En conséquence, il n'est pas possible de l'utiliser avec succès. Cependant, cela semble soutenir le fuseau horaire, mais pas sûr. parce qu'il dit pour les entrées, il supporte le fuseau horaire

Donc, je prévois d'utiliser les deux en même temps pour déterminer la date. Mais j'aimerais en avoir une où je peux aussi prendre en compte le fuseau horaire. Mais aucun ne semble soutenir cela.

Est-ce que quelqu'un a une suggestion? Mfg, AJ

Répondre

3

@AJ: Ajout d'une autre réponse de sorte que le code est formaté

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

int 
main(void) 
{ 
     struct tm tm[1] = {{0}}; 

     strptime("Tue, 19 Feb 2008 20:47:53 +0530", "%a, %d %b %Y %H:%M:%S %z", tm); 
     fprintf(stdout, "off %ld\n", tm->tm_gmtoff); 
     return 0; 
} 

Et une course ressemble (glibc 2.10.1):

[email protected]:pts/28:~/temp> ./test 
off 19800 
+0

Merci beaucoup! Juste curieux, est-ce possible avec la glibc 2.9.x ?! Savez-vous si c'est le cas ou pas? va l'essayer de toute façon, mais n'a pas accès à la machine Linux pour le moment. – AMM

+0

Fonctionne également sur 2.9. – hroptatyr

+0

est-ce que cette analyse lorsque les fuseaux horaires sont en formats 3 lettres comme CST CDT etc? – AMM

0

dépend de la version de libc, je dirais, et bien sûr ce que vous entendez par `prendre en compte»: Est-il censé lire les informations supplémentaires et l'ignorer, est-il censé stockez les informations analysées dans la structure tm, ou est-ce censé convertir en temps système/environnement?

strptime() de la glibc 2.10.1 fait des fuseaux horaires, de la page d'information

`%z' 
     The offset from GMT in ISO 8601/RFC822 format. 

`%Z' 
     The timezone name. 

     _Note:_ Currently, this is not fully implemented. The format 
     is recognized, input is consumed but no field in TM is set. 
+0

Est-il possible pour moi de convertir les dates suivantes en GMT et ont ces valeurs en tm? Mar 19 février 2008 20:47:53 0530 Mar 28 avril 2009 18:22:39 -0700 (PDT) Si oui, ce sera vraiment utile si vous pouvez me fournir le code de cette en unix (juste un deux ou trois doublure) – AMM

0

Comme vous avez remarqué strptime ne pas directement fuseaux horaires de soutien. Tout ce qu'il fait est de lire des données formatées sans fuseau horaire dans une structure tm. Vous devrez analyser vous-même un indicateur de fuseau horaire facultatif (à moins qu'il ne soit corrigé), puis définir TZ et utiliser mktime pour le convertir en time_t. Si vous réglez tm.is_dst sur -1 vous pouvez même demander à mktime de vous proposer automatiquement l'heure d'été.

Alternativement, vous pouvez construire votre propre analyseur en utilisant des vapeurs (boost prend en charge quelques formats, mais peut ne pas être assez général). Encore une fois comme ci-dessus, vous pouvez utiliser mktime pour composer un time_t.