2009-06-16 6 views
17

le scénario est: Je reçois datetime dans le format "AAAA-MM-JJ HH: MM: SS" avec libexif. Pour minimiser le coût d'économie, je veux convertir le datetime en timestamp unix ou similaire qui ne coûte que 64bit ou 32bit. Y a-t-il un moyen explicite avec c?Comment convertir datetime en timestamp unix en c?

Répondre

30

Vous pouvez essayer une combinaison de strptime et mktime

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

Je savais qu'il devait être Quelque chose comme strptime, mais je ne pouvais pas le trouver.J'utilise Microsoft 99% du temps, et ils ne le supportent pas –

+0

+1: Je pensais à strptime, mais je ne pouvais pas me souvenir du nom de la fonction pour cela – Powerlord

+3

En note, si vous utilisez Windows, voir cette question: http://stackoverflow.com/questions/321849/strptime-equivalent-on-windows – Powerlord

5

Convertissez chaque partie de la date/heure en entier pour remplir un struct tm, puis convertissez-le en time_t en utilisant mktime.

1

Voici une solution filaire dans c/code pseudo Je viens piraté ensemble. Bonne chance!

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'en est-il de 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

Voici un extrait prêt quand strptime n'est pas 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; 
} 

youself Adjust une chaîne sscanf à ce que vous avez besoin. Pour ignorer le fuseau horaire et toujours convertir en GMT/UTC Soustraire un timezone (ou _timezone) de seconds (timezone global est défini dans time.h. DST est déjà ignoré par la mise à zéro tm_isdst domaine de tm.

Questions connexes