Преобразование между местным временем и GMT / UTC в C / C ++

StackOverflow https://stackoverflow.com/questions/761791

  •  11-09-2019
  •  | 
  •  

Вопрос

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

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

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

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


Возможно, связанный с этим вопрос заключается в следующем Получите даты перехода на летнее время Для часовых поясов в C

Это было полезно?

Решение

Предполагается, что вы должны использовать комбинации 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's tm_gmtoff.

Другие советы

Если в 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);

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top