2012-03-03 14 views

Respuesta

2

C (POSIX) proporciona una función para esto. Use strptime() para convertir la cadena en un valor de struct tm. A continuación, puede convertir el struct tm en time_t usando mktime().

+2

Eso no es estándar, C, es POSIX. –

2

Extracto de las piezas con un sscanf, pueblan struct tm (de <time.h>) con los datos extraídos, y finalmente utilizar mktime para convertirlo en time_t.

time_t ParseDate(const char * str) 
{ 
    struct tm ti={0}; 
    if(sscanf(str, "%d-%d-%d", &ti.tm_year, &ti.tm_mon, &ti.tm_day)!=3) 
    { 
     /* ... error parsing ... */ 
    } 
    ti.tm_year-=1900 
    ti.tm_mon-=1 
    return mktime(&ti); 
} 
0

Leer en una struct tm y llamar mktime para obtener su time_t.

1

¿La hora local o el UTC? Si se trata de UTC, la forma más fácil para hacer la conversión es evitar la API C Tiempo completo y utilizar la fórmula en POSIX para segundos desde la época:

tm_sec + tm_min*60 + tm_hour*3600 + tm_yday*86400 + 
    (tm_year-70)*31536000 + ((tm_year-69)/4)*86400 - 
    ((tm_year-1)/100)*86400 + ((tm_year+299)/400)*86400 

Fuente: http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html#tag_04_15

si es hora local, el problema se convierte en infierno debido a que no se garantiza que time_t se represente como segundos desde la época excepto en los sistemas POSIX, y el hecho de que es difícil calcular un valor time_t correspondiente a la época (mktime no funcionará porque usa hora local). Una vez que calcule el time_t para la época, es solo una cuestión de usar mktime para el valor de tiempo que analizó y luego llamar al difftime.

Cuestiones relacionadas