2009-09-12 23 views
6

Conoce una función de análisis de fecha para c. Busco algo como:C Biblioteca para analizar Fecha Hora

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

Gracias

+0

¿qué plataforma estás usando? –

+0

Como lo menciona blak3r en un comentario, su especificación es ambigua. En el primer ejemplo, la fecha se puede analizar como el 10 de septiembre o el 9 de octubre, dependiendo del país en el que se encuentre. Debe especificar un formato. – bortzmeyer

Respuesta

2

El Julian Library hace mucho de lo que pregunta, vea en particular cómo funciona su parsing. Sin embargo, no creo que se alargue TODO el camino a sus requisitos (que Monday, creo, lo lanzaría a dar vueltas ;-).

3

Por desgracia, la única cosa en la biblioteca estándar es getdate(), definido por POSIX, no es el estándar C. Manejará muchos formatos de tiempo, pero necesita conocer el formato de antemano, no solo pasar una cadena genérica a la función.

Tampoco es compatible con Visual C++, si eso es un problema para usted. El tiempo de ejecución de GNU C admite esta rutina, sin embargo.

+0

¿hay algo que no está en el estándar y no puede ser procesado? – adk

0

En time.h tiene 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) 

el que hace lo contrario 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 Wikipedia

+0

¿Qué sucede si no conozco el formato? – adk

+0

No en VC++ tampoco .... –

+1

@adk hmm ... bueno, debe dar algunas instrucciones para que sepa si su alimentación es de un mes frente a un día o año ... ya sabe? Pero, puede utilizar una cadena de entrada dada para intentar analizarla con múltiples formatos y seguir intentándola hasta que la función no devuelva nulo. – blak3r

11

Hay dos enfoques bastante comunes en C:

  1. Utilice strptime() con una matriz de formatos compatibles que acepte.

  2. Golpee la cabeza contra la mesa mucho, y luego renuncie o use otro idioma que ya tenga una biblioteca utilizable (como perl o python).

2

Git tiene un date parsing library portátil, publicado bajo GPLv2. Es posible que puedas usar eso. Creo que quieres approxidate_careful().

5

Si el formato es coherente puede utilizar scanf funciones de la familia

#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; 
} 
0

En Windows, no es VarDateFromStr que puede analizar automáticamente muchos formatos si se utiliza de esta manera:

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

Es generalmente reconocerán formatos numéricos, sino que también puede analizar "10 de septiembre de 2009 12:30a.m.", sin Lunes y en mi computadora alemana sin th, pero eso podría depender de la configuración regional. Las palabras deben estar en el idioma local, por ejemplo, necesitará "junio" en los sistemas en inglés, pero "Juni" en los sistemas alemanes.

-1

El notmuch mail project tiene un analizador GPLv2 + para las cadenas de fecha. Admite fechas absolutas y relativas en una variedad de formatos fáciles de usar, aunque las fechas relativas solo se refieren al pasado. El código está en el parse-time-string subdirectory of the notmuch source tree.

+0

Si bien este enlace puede responder a la pregunta, es mejor incluir las partes esenciales de la respuesta aquí y proporcionar el enlace de referencia. Las respuestas de solo enlace pueden dejar de ser válidas si la página vinculada cambia. - [De la opinión] (/ crítica/mensajes de baja calidad/10717629) – djhaskin987

+0

@ djhaskin987 Se mejoró ligeramente la respuesta, pero no se puede agregar mucha más información esencial que señalar la fuente definitiva del código. ¿Cómo es posible que esto sea peor que las dos respuestas subidas de tono que apuntan al analizador de la fecha de git? – Jani

Cuestiones relacionadas