2010-07-16 7 views
1

J'ai une série de chaînes de date dans le format suivant: "30-05-2001"une date en C++

string date1 = "30-05-2001"; 

je voudrais analyser la date en jour, mois, année. Maintenant, un moyen facile de le faire serait juste d'appeler la fonction sscanf. Mais je voudrais explorer d'autres possiblilties et de recherche sur le Web la fonction suivantes de time.h a été recommandé:

char *strptime(const char *buf, const char *format, struct tm *tm); 

Est-ce que toute Quelqu'un at-il une expérience en utilisant cette fonction? Un petit exemple serait très utile.

Merci!

+1

Jetez un coup d'œil à [Boost.Date_Time] (http://www.boost.org/doc/libs/1_43_0/doc/html/date_time/examples.html#date_time.examples.dates_as_strings). D'un coup d'œil rapide, je ne vois pas comment faire fonctionner le format américain. –

+1

Utilisez une simple regex pour cela. – anno

+0

Je suggérerais un objet std :: istringstream en faveur de sscanf() si vous l'avez fait de cette façon. strptime() ne fait pas partie de la norme ISO / donc ne serait pas supporté universellement. – Clifford

Répondre

1

Juste au cas où vous voulez comprendre comment cela fonctionne (pas Blackbox) ou si vous besoin de voler les choses (pas de fonction appelle), alors voici quelques conseils pour vous:

//   
char date[] = "30-05-2001"; // DD-MM-YYYY 
int day, month, year; 

day = (date[0] - '0') * 10 + (date[1] - '0'); 
month = (date[3] - '0') * 10 + (date[4] - '0'); 
year = (date[6] - '0') * 1000 + (date[7] - '0') * 100 + (date[8] - '0') * 10 + (date[9] - '0'); 

Ce code (non testé) est clother à la bonne façon de faire wha t vous voulait faire comme il ne fait que ce que vous devez faire (pas plus, pas de moins). Sûr, petit, simple, RAPIDE.

Si vous n'êtes pas sûr de la date (entrée de l'utilisateur) alors vous devrez vérifier sa validité (ou accepter l'idée de vivre avec des dates invalides dans votre application).

1

Source:

#include <time.h> 
... 


struct tm tm; 
time_t t; 


if (strptime("6 Dec 2001 12:33:45", "%d %b %Y %H:%M:%S", &tm) == NULL) 
    /* Handle error */; 


printf("year: %d; month: %d; day: %d;\n", 
     tm.tm_year, tm.tm_mon, tm.tm_mday); 
printf("hour: %d; minute: %d; second: %d\n", 
     tm.tm_hour, tm.tm_min, tm.tm_sec); 
printf("week day: %d; year day: %d\n", tm.tm_wday, tm.tm_yday); 


tm.tm_isdst = -1;  /* Not set by strptime(); tells mktime() 
          to determine whether daylight saving time 
          is in effect */ 
t = mktime(&tm); 
if (t == -1) 
    /* Handle error */; 
printf("seconds since the Epoch: %ld\n", (long) t);" 
+0

'strptime()' ne fait pas partie de C++. –

+0

@Georg: Vous avez raison; mais cela pourrait aider pour Windows équivalent http: // stackoverflow.com/questions/321849/strptime-equivalent-on-windows/321877 # 321877 –

+0

@Georg: Vouliez-vous plutôt dire "ne fait pas partie de la bibliothèque standard ISO C++", ce qui serait plus précis. Il ne fait pas non plus partie de la bibliothèque de normes ISO C. C'est un point juste du point de vue de la transférabilité, mais puisque c'était la suggestion du PO, aurait-on dû le faire contre son poste? Cependant, si la bibliothèque cible le fournit, elle peut être utilisée. Il serait trop restrictif de suggérer qu'aucun code ne devrait utiliser des bibliothèques tierces ou des extensions de bibliothèque standard. Selon cette logique, l'API de l'OS serait aussi hors limites! – Clifford

1

Voir here pour un exemple. Aussi bonne explication comment utiliser les indicateurs de conversion, etc.

Edit: Kman a été plus rapide :)

Edit2: Lien conduit à une desctiption de

char *strptime(const char *restrict buf, const char *restrict format, struct tm *restrict tm); 

et aussi un court exemple sur la façon d'utiliser . Le site est fourni par

L'Open Groupe de base Caractéristiques Numéro 6 IEEE Std 1003.1, édition 2004

+0

Veuillez fournir au moins un résumé et pas seulement un lien. –

3
std::istringstream buffer("30-05-2001"); 
int day = 0; 
int month = 0; 
int year = 0; 
char dummy = 0; 

buffer >> day >> dummy >> month >> dummy >> year; 
// TODO: validate values here 

Vous pouvez effectuer différentes lectures sur les données si vous souhaitez valider que le mannequin est égal à '-'.