Преобразование между местным временем и GMT / UTC в C / C ++ - PullRequest
29 голосов
/ 17 апреля 2009

Как лучше всего конвертировать даты и время между местным временем и UTC в C / C ++?

Под «датой и временем» я подразумеваю некоторое представление времени, которое содержит дату и время суток. Я буду счастлив с time_t, struct tm или любым другим представлением, которое делает это возможным.

Моя платформа - Linux.

Вот конкретная проблема, которую я пытаюсь решить: я получаю пару значений, содержащих юлианскую дату и количество секунд в дне. Эти значения указаны в GMT. Мне нужно преобразовать это значение в значение "ГГГГММДДЧЧММСС" в местном часовом поясе. Я знаю, как преобразовать юлианскую дату в Y-M-D, и, очевидно, легко конвертировать секунды в ЧЧММСС. Однако самая сложная часть - это преобразование часовых поясов. Я уверен, что смогу найти решение, но я предпочел бы найти «стандартный» или «общеизвестный» способ, а не спотыкаться.


Возможно связанный вопрос: Получить даты перехода на летнее время для часовых поясов в C

Ответы [ 3 ]

21 голосов
/ 17 апреля 2009

Вы должны использовать комбинации gmtime / localtime и timegm / mktime. Это должно дать вам ортогональные инструменты для преобразования между struct tm и time_t.

Для UTC / GMT:

time_t t;
struct tm tm;
struct tm * tmp;
...
t = timegm(&tm);
...
tmp = gmtime(t);

Для местного времени:

t = mktime(&tm);
...
tmp = localtime(t);

Все tzset() устанавливает внутреннюю переменную часового пояса из переменной среды TZ. Я не думаю, что это должно быть вызвано более одного раза.

Если вы пытаетесь конвертировать часовые пояса, вам следует изменить struct tm tm_gmtoff.

17 голосов
/ 24 июня 2009

Если в Windows у вас нет функции timegm ():

struct tm *tptr;
time_t secs, local_secs, gmt_secs;
time( &secs );  // Current time in GMT
// Remember that localtime/gmtime overwrite same location
tptr = localtime( &secs );
local_secs = mktime( tptr );
tptr = gmtime( &secs );
gmt_secs = mktime( tptr );
long diff_secs = long(local_secs - gmt_secs);

или что-то подобное ...

2 голосов
/ 18 апреля 2009

Если вам нужно беспокоиться о преобразовании даты / времени в правила часового пояса, вам может понадобиться ICU .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...