2009-09-12 9 views
6

Est-ce que l'on sait qu'une fonction d'analyse de date pour c. Je cherche quelque chose comme:Bibliothèque C pour l'analyse de la date

time = parse_time("9/10/2009"); 
printf("%d\n", time->date); 
time2 = parse_time("Monday September 10th 2009")  
time2 = parse_time("Monday September 10th 2009 12:30 AM") 

Merci

+0

Quelle plate-forme utilisez-vous? –

+0

Comme mentionné par blak3r dans un commentaire, votre spécification est ambiguë. Dans le premier exemple, la date peut être analysée comme le 10 septembre ou le 9 octobre, selon le pays dans lequel vous vous trouvez. Vous devez spécifier un format. – bortzmeyer

Répondre

2

Le fait beaucoup de ce que vous demandez - voir en particulier comment fonctionne son parsing. Cependant, je ne pense pas qu'il s'étend tout à fait à vos besoins (que Monday, je crois, le lancerait pour un tour ;-).

3

Malheureusement, la seule chose dans la bibliothèque standard est getdate(), définie par POSIX, et non la norme C. Il gérera de nombreux formats de temps, mais vous devez connaître le format à l'avance - pas seulement passer une chaîne générique à la fonction.

Il n'est également pas pris en charge sur Visual C++, si c'est un problème pour vous. Le runtime GNU C prend en charge cette routine, cependant.

+0

Y at-il quelque chose qui n'est pas dans la norme et poratble? – adk

0

En time.h vous avez strptime:

// Scan values from buf string into tptr struct. On success it returns pointer 
// to the character following the last character parsed. Otherwise it returns null. 
char * strptime(const char* buf, const char* format, struct tm* tptr) 

qui fait le contraire de

// Format tm into a date/time string. 
size t strftime(char* s, size t n, const char* format, const struct tm* tptr) 

Click here for the complete Reference sur Wikipédia

+0

Que faire si je ne connais pas le format? – adk

+0

Pas dans VC++ non plus .... –

+1

@adk hmm ... eh bien vous avez besoin de donner quelques instructions afin qu'il sache si vous le nourrir un mois par rapport à un jour ou une année ... vous savez? Mais, vous pourriez pour une chaîne d'entrée donnée essayer de l'analyser avec plusieurs formats et continuer à l'essayer jusqu'à ce que la fonction ne renvoie pas de null. – blak3r

11

Il existe deux approches assez communes dans C:

  1. Utilisez strptime() avec un tableau de formats pris en charge que vous acceptez. Bang beaucoup contre la table, puis abandonner ou utiliser une autre langue qui a déjà une bibliothèque utilisable (comme Perl ou Python).

2

Git a un portable date parsing library, publié sous licence GPLv2. Vous pourrez peut-être l'utiliser. Je pense que vous voulez approxidate_careful().

5

Si le format est compatible, vous pouvez utiliser les fonctions de la famille scanf

#include<stdio.h> 

int main() 
{ 
    char *data = "Tue, 13 Dec 2011 16:08:21 GMT"; 
    int h, m, s, d, Y; 
    char M[4]; 
    sscanf(data, "%*[a-zA-Z,] %d %s %d %d:%d%:%d", &d, M, &Y, &h, &m, &s); 
    return 0; 
} 
1

Je suis un peu en retard à la fête, mais la construction de ce que Mark a posté Lodato, j'ai jeté cela ensemble: git's approxidate in library form. Testé sur Linux/Mac.

0

Dans Windows, il est VarDateFromStr qui peut automatiquement analyser plusieurs formats si elle est utilisée comme ceci:

LPCWSTR dateString = L" 
DATE result; 
HRESULT hr = ::VarDateFromStr(dateString, 
           LOCALE_ALL, 
           0, 
           &result); 

if (FAILED(hr)) 
{ 
    /* handle error */ 
    /* DISP_E_TYPEMISMATCH means that it didn't recognize the format. */ 
} 

Il reconnaîtra généralement les formats numériques, mais peut également analyser « 10 Septembre 2009 00:30 », sans Lundi et sur mon ordinateur allemand sans e, mais cela peut dépendre des paramètres régionaux. Les mots doivent être dans la langue locale, par exemple, il faudra "Juin" sur les systèmes anglais, mais "Juni" sur les systèmes allemands.

-1

Le notmuch mail project dispose d'un analyseur GPLv2 + pour les chaînes de date. Il prend en charge les dates absolues et relatives dans une variété de formats conviviaux, bien que les dates relatives se réfèrent uniquement au passé. Le code est dans le parse-time-string subdirectory of the notmuch source tree.

+0

Bien que ce lien puisse répondre à la question, il est préférable d'inclure les parties essentielles de la réponse ici et fournir le lien pour référence. Les réponses à lien uniquement peuvent devenir invalides si la page liée change. - [De l'examen] (/ review/low-quality-posts/10717629) – djhaskin987

+0

@ djhaskin987 Amélioré la réponse légèrement, mais il n'y a pas beaucoup plus d'informations essentielles qui pourraient être ajoutées au-delà pointant vers la source définitive du code. Comment est-ce peut-être pire que les deux réponses upvoted pointant à l'analyseur de date de git? – Jani

Questions connexes