Frage

Ist das legitim? Ich versuche, so schnell wie möglich zu einem Time_t zu gelangen, wenn ein String -Format wie yyyymmddhhmms formatiert ist.

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);
}

Es scheint die gleiche Antwort zu erzeugen, wenn ich TM erstellt habe:

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

Ich mache mir Sorgen, dass TM_YDAG, TM_WDAY, TM_ISDST, TM_GMTOFF, TM_Zone wichtig sind. Meine Daten sind UTC, also habe ich GMTOFF = 0 und TM_Zone = 0 funktionieren.

Übrigens ist hier 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;
}
War es hilfreich?

Lösung

mktime() ignoriert die tm_wday und tm_yday Felder und berechnet neue Werte für sie basierend auf den anderen Feldern. Gleiches gilt für die BSD -Erweiterungen tm_gmtoff und tm_zone, außer dass sie aus der lokalen Zeitzone berechnet werden.

Beachten Sie jedoch das mktime() Verwendet lokal Zeit, nicht UTC. Wenn Ihre Eingangstermine UTC sind, muss Ihre Zeitzone auf UTC gesetzt werden.

Andere Tipps

Sie wären wahrscheinlich besser dran, wenn Sie es verwenden würden Verabredung bekommen Es sei denn, Sie sind sicher Es ist zu langsam. Ansonsten sieht das, was Sie tun, ziemlich gut, wenn nicht sogar leicht kryptisch.

Datum und Uhrzeitbeschäftigung im Allgemeinen haben viele knifflige Gotchas, daher würde ich Strptime () nicht empfehlen, anstatt Ihre eigenen zu rollen. Wenn die Leistung von Strptime () ein Engpass ist, arbeiten

  1. Ihre String sowie Time_T (wie es normalerweise verwendet wird) enthält nur die zweite Genauigkeit, sodass Sie den konvertierten Wert zwischenspeichern und nur einmal pro Sekunde aktualisieren können.

  2. Arbeiten Sie überhaupt nicht mit Zeitstempeln in Saitenform. ZB rund um einen time_t -Wert (mit Sekunden, da die Epoche nach Zeit () zurückgegeben hat) stattdessen und nur in eine Zeichenfolge konvertiert, wenn Sie sie drucken/dem Benutzer/anzeigen müssen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top