2009-09-12 11 views
6

È uno conoscenza di una funzione di data parsing per c. Sto cercando qualcosa di simile:C libreria per l'analisi Data Ora

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") 

Grazie

+0

quale piattaforma stai usando? –

+0

Come menzionato da blak3r in un commento, le vostre specifiche sono ambigue. Nel primo esempio, la data può essere analizzata come il 10 settembre o il 9 ottobre, a seconda del paese in cui ti trovi. Devi specificare un formato. – bortzmeyer

risposta

2

Il Julian Library fa molto di quello che chiedi - vedi in particolare come funziona il suo parsing. Comunque io non credo che sia del tutto estende fino alle proprie esigenze (che Monday, credo, sarebbe buttare per un giro ;-).

3

Purtroppo, l'unica cosa nella libreria standard è getdate(), definito da POSIX, non lo standard C. Sarà gestire molti formati di tempo, ma è necessario conoscere il formato in anticipo - non solo passare una stringa generica alla funzione.

E 'anche non supportato su Visual C++, se questo è un problema per voi. Il runtime GNU C supporta tuttavia questa routine.

+0

c'è qualcosa che non è nello standard e poratble? – adk

0

In time.h avete 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) 

che fa il contrario di

// 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 su Wikipedia

+0

Cosa succede se non conosco il formato? – adk

+0

Non in VC++ o .... –

+1

@adk hmm ... beh, devi dare qualche istruzione in modo che sappia se lo stai mangiando un mese o un giorno o anno ... sai? Tuttavia, per una determinata stringa di input è possibile provare ad analizzarlo con più formati e continuare a provare finché la funzione non restituisce null. – blak3r

11

Ci sono due approcci abbastanza comuni in C:

  1. Usa strptime() con una serie di formati supportati accettati.

  2. Scuotere la testa contro il tavolo molto, quindi rinunciare o utilizzare un altro linguaggio che ha già una libreria utilizzabile (come perl o python).

2

Git ha un portatile date parsing library, rilasciato sotto GPLv2. Potresti essere in grado di usarlo. Penso che tu voglia approxidate_careful().

5

Se il formato è coerente è possibile utilizzare le funzioni della famiglia 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

Sono un po 'in ritardo alla festa, ma la costruzione di ciò che Mark Lodato pubblicato, ho buttato questo insieme: git's approxidate in library form. Testato su Linux/Mac.

0

In Windows, c'è VarDateFromStr che può analizzare automaticamente molti formati, se usato in questo modo:

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. */ 
} 

Sarà generalmente di riconoscere i formati numerici, ma può anche analizzare "10 Settembre, 2009 00:30", senza lunedì e sul mio computer tedesco senza th, ma che potrebbe essere dipendente dalle impostazioni internazionali. Le parole devono essere nella lingua locale, per esempio avrà bisogno di "Giugno" sui sistemi inglesi ma "Juni" sui sistemi tedeschi.

-1

Il notmuch mail project ha un parser GPLv2 + per le stringhe di data. Supporta date assolute e relative in una varietà di formati facili da usare, anche se le date relative si riferiscono solo al passato. Il codice è nel parse-time-string subdirectory of the notmuch source tree.

+0

Sebbene questo collegamento possa rispondere alla domanda, è meglio includere qui le parti essenziali della risposta e fornire il link per riferimento. Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia. - [Dalla recensione] (/ recensione/post di bassa qualità/10717629) – djhaskin987

+0

@ djhaskin987 Migliorata leggermente la risposta, ma non ci sono molte più informazioni essenziali che potrebbero essere aggiunte oltre a puntare alla fonte definitiva del codice. Com'è possibile che sia peggio delle due risposte in aumento che puntano al parser di date di git? – Jani