Domanda

E 'questo legit? Im cercando di arrivare a un time_t il più velocemente possibile data una stringa formattata come AAAAMMGGHHMMSS.

static time_t ConvertToSecSince1970(char *szYYYYMMDDHHMMSS)
{
struct tm    Tm;    

    memset(&Tm, 0, sizeof(Tm));
    Tm.tm_year = makeInt(szYYYYMMDDHHMMSS +  0, 4) - 1900;
    Tm.tm_mon  = makeInt(szYYYYMMDDHHMMSS +  4, 2) - 1;
    Tm.tm_mday = makeInt(szYYYYMMDDHHMMSS +  6, 2);
    Tm.tm_hour = makeInt(szYYYYMMDDHHMMSS +  8, 2);
    Tm.tm_min  = makeInt(szYYYYMMDDHHMMSS + 10, 2);
    Tm.tm_sec  = makeInt(szYYYYMMDDHHMMSS + 12, 2);
    return mktime(&Tm);
}

E sembra produrre la stessa risposta se ho creato TM utilizzando:

strptime(szYYYYMMDDHHMMSS, "%Y%m%d%H%M%S", &Tm);

Sono preoccupato che tm_yday, tm_wday, tm_isdst, tm_gmtoff, tm_zone sono importanti. Le mie date sono UTC così ho pensato gmtoff = 0 e il lavoro tm_zone = 0 forza.

A proposito, Ecco MAKEINT:

inline int makeInt(const char *p, int size)
{
    const char *endp;
    int intval = 0;

    endp = p + size;
    while (p < endp)
    {
        intval = intval * 10 + *p - '0';
        p++;
    }
    return intval;
}
È stato utile?

Soluzione

mktime() ignora i campi tm_wday e tm_yday, e calcola i nuovi valori per loro sulla base di altri campi. Lo stesso vale per l'estensioni BSD tm_gmtoff e tm_zone, eccetto che sono calcolati dal fuso orario locale.

Si noti tuttavia che usi mktime() locale tempo, non UTC, quindi se sono le date di ingresso UTC quindi il fuso orario deve essere impostato su UTC.

Altri suggerimenti

Si sarebbe probabilmente essere meglio utilizzare getdate se non si è < em> che è troppo lento. Altrimenti, cosa si sta facendo sembra piuttosto bene se non un po 'leggero criptico.

Data e ora di movimentazione in generale, ha un sacco di grattacapi difficili, quindi consiglio vivamente strptime () piuttosto che rotolare il proprio. Se le prestazioni di strptime () è un collo di bottiglia, il lavoro intorno ad esso in qualche altro modo che cercare di creare uno strptime meglio (), come ad esempio

  1. La stringa, così come time_t (come di solito è utilizzato), dà solo secondo la precisione, così da poter memorizzare nella cache il valore convertito e aggiornare solo una volta al secondo.

  2. non funzionano con timestamp in forma di stringa, in primo luogo. Per esempio. passare intorno ad un valore di time_t (contenente secondi dall'epoca come restituito da time ()) invece e solo convertirlo in una stringa quando / se è necessario stamparlo / mostrare all'utente /.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top