Анализ даты / времени в C ++ - PullRequest
       44

Анализ даты / времени в C ++

4 голосов
/ 05 августа 2010

При выполнении анализа данных / времени в c ++ (преобразование строки в любом формате в дату) я нашел следующие полезные методы

1) strptime () - здесь% d,% m и т. Д.может иметь 1 или 2 символа.Функция позаботится об этом.В результате это заставит нас использовать разделитель между двумя спецификаторами преобразования.Пример: Недопустимо указывать% d% m, а% d /% m или любой другой разделитель.Также это не поддерживает часовые пояса.

2) Boost date IO - здесь% d,% m должен иметь 2 символа.Теперь входная строка, которую я получаю, не гарантированно будет иметь это.В результате этого невозможно использовать это успешно.Тем не менее, это, кажется, поддерживает часовой пояс, но не уверен.потому что он говорит, что для входных данных он поддерживает часовой пояс

Так что я планирую использовать оба вместе, чтобы определить дату.Но я хотел бы получить тот, где я могу принять во внимание и часовой пояс.Но, похоже, никто не поддерживает это.

У кого-нибудь есть предложение?Rgds, AJ

Ответы [ 3 ]

3 голосов
/ 23 августа 2010

@ AJ: добавлен еще один ответ, чтобы код был отформатирован

#include <stdio.h>
#include <sys/time.h>
#include <time.h>

int
main(void)
{
        struct tm tm[1] = {{0}};

        strptime("Tue, 19 Feb 2008 20:47:53 +0530", "%a, %d %b %Y %H:%M:%S %z", tm);
        fprintf(stdout, "off %ld\n", tm->tm_gmtoff);
        return 0;
}

И бег выглядит так (glibc 2.10.1):

freundt@clyde:pts/28:~/temp> ./test
off 19800
0 голосов
/ 05 августа 2010

Как вы заметили, strptime не напрямую не поддерживает часовые пояса.Все, что он делает, это читает отформатированные данные без часового пояса в структуру tm.Вам придется самостоятельно разобрать дополнительный индикатор часового пояса (если он не зафиксирован), а затем установить TZ и использовать mktime для преобразования в time_t.Если вы установите tm.is_dst в -1, вы даже можете попросить, чтобы mktime попытался автоматически определить DST для вас.

В качестве альтернативы вы можете создать свой собственный парсер, используя steams (boost поддерживает несколько форматов, ноне может быть достаточно общим).Как и выше, вы можете использовать mktime для составления time_t.

0 голосов
/ 05 августа 2010

Зависит от версии libc, я бы сказал, и, конечно, от того, что вы подразумеваете под «учетом»: предполагается ли чтение дополнительной информации, а затем ее игнорирование, хранение сохраненной информации в tm struct, или она предназначена для преобразования во время системы / среды?

Функция strptime () в glibc 2.10.1 делает часовые пояса со страницы информации

`%z'
      The offset from GMT in ISO 8601/RFC822 format.

`%Z'
      The timezone name.

      _Note:_ Currently, this is not fully implemented.  The format
      is recognized, input is consumed but no field in TM is set.
...