Question

Est-ce légitime? Im essayant d'obtenir un time_t aussi vite que possible d'une chaîne formatée comme YYYYMMDDHHMMSS.

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

Il semble produire la même réponse si je créé TM en utilisant:

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

Je crains que tm_yday, tm_wday, tm_isdst, tm_gmtoff, tm_zone sont importants. Mes dates sont UTC alors je me suis gmtoff = 0 et tm_zone = 0 travail pourrait.

Par ailleurs, Voici 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;
}
Était-ce utile?

La solution

mktime() ignore les champs de tm_wday et tm_yday, et calcule de nouvelles valeurs pour les autres en fonction des champs. De même pour les extensions BSD tm_gmtoff et tm_zone, sauf qu'ils sont calculées à partir de la zone de l'heure locale.

Notez cependant que les utilisations de mktime() locale temps, pas UTC, donc si les dates d'entrée sont alors votre fuseau horaire UTC doit être réglé sur UTC.

Autres conseils

Vous serait probablement préférable d'utiliser getdate sauf si vous êtes < em> que il est trop lent. Sinon, ce que vous faites semble assez bien si pas un peu léger cryptique.

Date et heure de manutention en général a beaucoup de trucs difficiles, donc je vous recommande fortement strptime () plutôt que de rouler vos propres. Si les performances de strptime () est un goulot d'étranglement, le travail autour d'une autre manière que d'essayer de créer un meilleur strptime (), comme

  1. Votre chaîne, ainsi que time_t (comme il est généralement utilisé), ne donne qu'une seconde précision, de sorte que vous pouvez mettre en cache la valeur convertie et mettre à jour une seule fois par seconde.

  2. Ne pas travailler avec des horodateurs sous forme de chaîne en premier lieu. Par exemple. passer autour d'une valeur de time_t (contenant secondes depuis l'époque comme retourné par le temps ()) au lieu et convertir seulement à une chaîne quand / si vous avez besoin de l'imprimer / afficher à l'utilisateur /.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top