самый быстрый способ получить time_t из строки ГГГГММДДЧЧММСС - PullRequest
3 голосов
/ 10 июня 2011

Это законно? Я пытаюсь добраться до time_t как можно быстрее, учитывая строку, отформатированную как ГГГГММДДЧЧММСС.

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

Похоже, вы получите тот же ответ, если я создал TM, используя:

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

Я обеспокоен тем, что tm_yday, tm_wday, tm_isdst, tm_gmtoff, tm_zone важны. Мои даты в формате UTC, поэтому я подумал, что gmtoff = 0 и tm_zone = 0 могут сработать.

Кстати, вот 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;
}

Ответы [ 3 ]

4 голосов
/ 10 июня 2011

Вам, вероятно, было бы лучше использовать getdate , если вы не уверены , что это слишком медленно.Кроме того, то, что вы делаете, выглядит довольно хорошо, если не слегка загадочно.

2 голосов
/ 10 июня 2011

mktime() игнорирует поля tm_wday и tm_yday и вычисляет новые значения для них на основе других полей. То же самое относится к расширениям BSD tm_gmtoff и tm_zone, за исключением того, что они рассчитаны по местному часовому поясу.

Обратите внимание, что mktime() использует местное время, а не UTC, поэтому, если ваши даты ввода UTC, тогда ваш часовой пояс должен быть установлен на UTC.

1 голос
/ 10 июня 2011

Обработка даты и времени в целом имеет много хитрых ошибок, поэтому я настоятельно рекомендую strptime (), а не использовать свои собственные.Если выполнение strptime () является узким местом, обойти его можно иначе, чем пытаться создать лучший strptime (), такой как

  1. Ваша строка, а также time_t (какобычно используется), дает только вторую точность, поэтому вы можете кэшировать преобразованное значение и обновлять его только один раз в секунду.

  2. Во-первых, не работать с метками времени в строковой форме,Например, вместо этого передайте значение time_t (содержащее секунды с начала эпохи, возвращаемое функцией time ()) и преобразуйте его в строку только в том случае, если / если вам нужно его распечатать / показать пользователю /.

...