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

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

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

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

Вот конкретная проблема, которую я пытаюсь решить: я получаю пару значений, содержащих юлианскую дату и количество секунд в день. Эти значения указаны в GMT. Мне нужно преобразовать это значение в локальный часовой пояс «YYYYMMDDHHMMSS». Я знаю, как преобразовать юлианскую дату в YMD, и, очевидно, легко преобразовать секунды в 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 . Я не думаю, что это должно быть вызвано не один раз.

Если вы пытаетесь преобразовать временные tm_gmtoff , вы должны изменить tm_gmtoff struct tm .

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

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

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

  • Как конвертировать дату с одного часового пояса в другой часовой пояс
  • Как получить текущую дату и время вашего часового пояса в Java?
  • Как получить часовой пояс из местоположения с использованием координат широты и долготы?
  • iOS: конвертировать UTC NSDate в локальный часовой пояс
  • .NET TimeZoneInfo из часового пояса Олсона
  • linux конвертировать время (для разных часовых поясов) в UTC
  • Всегда ли полезно хранить время в UTC или это тот случай, когда лучше хранить в местное время?
  • Как мне заполнить список часовых поясов IANA / Olson от Noda Time?
  • Временные зоны MySQL
  • Часовой пояс с рельсами 3
  • Игнорирование часовых поясов в Rails и PostgreSQL
  • Interesting Posts

    Почему я не могу назначить List в List ?

    Не удалось обновить .NET framework 4

    Как избежать «ConcurrentModificationException» при удалении элементов из «ArrayList» при его повторении?

    О форме-агностическом разрезе ndarrays

    Обнаружение изменения смены вручную вручную

    Цикл на основе C ++ 11: получить элемент по значению или ссылке на const

    Как я могу сделать курсор в Windows с настройкой нескольких мониторов, так как он перемещается между всеми мониторами с одинаковым разрешением?

    Динамически регистрировать методы конструктора в AbstractFactory во время компиляции с использованием шаблонов C ++

    завершить программный вызов

    Когда я использую View Models, Partials, Templates и обрабатываю дочерние привязки с MVC 3

    Как добавить разрешение манифеста в приложение для Android?

    Получение истинного значения z из буфера глубины

    Scala: абстрактные типы против дженериков

    Какао – уведомление о изменении значения NSUserDefaults?

    Android-образец Bluetooth-кода для отправки простой строки через bluetooth

    Давайте будем гением компьютера.