2009-06-16 32 views
17

el escenario es: obtengo el formato de fecha y hora en "YYYY-MM-DD HH: MM: SS" con libexif. Para minimizar el costo de ahorro, quiero convertir la fecha y hora en la marca de tiempo de Unix o similar, que solo cuesta 64 bits o 32 bits. ¿Hay alguna forma explícita con c?cómo convertir datetime a la marca de tiempo unix en c?

Respuesta

30

Usted podría intentar una combinación de strptime y mktime

struct tm tm; 
time_t epoch; 
if (strptime(timestamp, "%Y-%m-%d %H:%M:%S", &tm) != NULL) 
    epoch = mktime(&tm); 
else 
    // badness 
+1

sabía que tenía que haber algo así como strptime, pero no pude encontrarlo. Utilizo Microsoft el 99% del tiempo, y no lo soportan. –

+0

+1: Estaba pensando en strptime, pero no recuerdo el nombre de la función – Powerlord

+3

Como nota al margen, si está utilizando Windows, consulte esta pregunta: http://stackoverflow.com/questions/321849/strptime-equivalent-on- windows – Powerlord

5

convertir cada parte de la fecha/hora en un entero para poblar un struct tm, a continuación, convertir eso en una time_t usando mktime.

1

Aquí es una solución cableada en código C/seudo acabo hackeado. ¡Buena suerte!

char * runner = NULL; 
char *string_orig = "YYYY-MM-DD HH:MM:SS"; 
time_t time = 0; 
struct tm tmp; 

use strstr(string_orig, "-") and atoi foreach 

    tmp->tm_year .. 
    tmp->tm_mon .. 
    tmp->tm_mday .. 
    tmp->tm_hour .. 
    tmp->tm_min .. 
    tmp->tm_sec .. 

with *runner as help 

time = mktime(&tm) 
1

¿Qué pasa con sscanf?

struct tm tmVar; 
char *strVar = "YYYY-MM-DD HH:MM:SS"; 
time_t timeVar; 
if(sscanf(strVar, "%d-%d-%d %d:%d:%d", &tm.tm_year, /* the other fields */)==6) 
    timeVar = mktime(&tmVar); 
else 
    // bad format 
0

He aquí un fragmento listo cuando strptime no está disponible:

#include <stddef.h> 
#include <time.h> 
#include <stdio.h> 

time_t string_to_seconds(const char *timestamp_str) 
{ 
    struct tm tm; 
    time_t seconds; 
    int r; 

    if (timestamp_str == NULL) { 
     printf("null argument\n"); 
     return (time_t)-1; 
    } 
    r = sscanf(timestamp_str, "%d-%d-%d %d:%d:%d", &tm.tm_year, &tm.tm_mon, &tm.tm_mday, &tm.tm_hour, &tm.tm_min, &tm.tm_sec); 
    if (r != 6) { 
     printf("expected %d numbers scanned in %s\n", r, timestamp_str); 
     return (time_t)-1; 
    } 

    tm.tm_year -= 1900; 
    tm.tm_mon -= 1; 
    tm.tm_isdst = 0; 
    seconds = mktime(&tm); 
    if (seconds == (time_t)-1) { 
     printf("reading time from %s failed\n", timestamp_str); 
    } 

    return seconds; 
} 

Ajuste youself una cadena en sscanf a lo que necesita. Hacer caso omiso de zona horaria y convertir siempre como GMT/UTC restar un timezone (o _timezone) de seconds (timezone global se define en time.h. el horario de verano ya se ignora poniendo a cero tm_isdst campo de la tm.

Cuestiones relacionadas