Pregunta

¿Es esto legítimo? Estoy tratando de llegar a un Time_T lo más rápido posible dada una cadena formateada como 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);
}

Parece producir la misma respuesta si creé TM usando:

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

Me preocupa que TM_YDAY, TM_WDAY, TM_ISDST, TM_GMTOFF, TM_ZONE sean importantes. Mis fechas son UTC, por lo que pensé que GMTOFF = 0 y TM_Zone = 0 podría funcionar.

Por cierto, aquí está 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;
}
¿Fue útil?

Solución

mktime() ignora el tm_wday y tm_yday campos y calcula nuevos valores para ellos según los otros campos. Lo mismo se aplica a las extensiones BSD tm_gmtoff y tm_zone, excepto que se calculan desde la zona horaria local.

Nota sin embargo que mktime() usos local Tiempo, no UTC, por lo que si sus fechas de entrada son UTC, entonces su zona horaria debe establecerse en UTC.

Otros consejos

Probablemente estarías mejor usando obtener la fecha A menos que seas Por supuesto Es demasiado lento. De lo contrario, lo que estás haciendo se ve bastante bien, si no un poco críptico.

El manejo de la fecha y el tiempo en general tiene muchos gotchas complicados, por lo que recomendaría firmemente strpTime () en lugar de rodar el tuyo. Si el rendimiento de strpTime () es un cuello de botella, trabaje en su alrededor de alguna otra manera que tratar de crear una mejor strpTime (), como

  1. Su cadena, así como Time_T (como se usa generalmente), da solo una segunda precisión, por lo que puede almacenar en caché el valor convertido y actualizarlo solo una vez por segundo.

  2. No trabaje con marcas de tiempo en forma de cadena en primer lugar. Por ejemplo, pase alrededor de un valor de tiempo_t (que contiene segundos ya que la época devuelta por el tiempo ()) en su lugar y solo conviértalo en una cadena cuando/si necesita imprimirla/mostrarla al usuario/.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top