Как получить смещение времени UTC в C++ с Windows OS

Мой вопрос довольно прост. Как получить смещение UTC для Филиппин, равное +8, и для Японии, равное +9, и преобразовать его в целое число?

Любые предложения - отличная помощь. Спасибо.

ОБНОВИТЬ

Для дальнейшего объяснения у меня есть настольное приложение на C++, и мне нужно автоматически определять его часовой пояс, где бы оно ни использовалось. Например, если приложение будет использоваться в Японии, будет использоваться смещение часового пояса для Японии. Это возможно?

1 ответ

Если вы не хотите копаться в API, специфичном для Windows, здесь есть переносимый и, вероятно, будущий стандарт C++ кода 1, чтобы сделать это с помощью библиотеки часовых поясов Говарда Хиннанта.

#include "date/tz.h"
#include <iostream>

int
main()
{
    using date::operator<<;
    using std::chrono::system_clock;
    std::cout << date::current_zone()->get_info(system_clock::now()).offset << '\n';
}

date::current_zone() определяет текущий часовой пояс компьютера. Это возвращает указатель на date::time_zone которая имеет функцию-член под названием get_info(),

Ты можешь позвонить time_zone::get_info либо с UTC time_point или local_timetime_point получать все виды информации об этом часовом поясе в указанный момент времени (так как информация меняется со временем в соответствии с текущей политикой). Использование system_clock::now() как time_point получит текущую информацию для time_zone,

date::sys_info возвращается, который является агрегатом, один из членов которого называется offset, Это текущее смещение UTC с единицами измерения std::chrono::seconds,

Это просто вывод для меня:

-14400s

Указывает, что мой текущий часовой пояс 14400 секунд к западу от UTC.

Для типичного кода не следует программировать на уровне прямого добавления смещений UTC. Для этого есть высокоуровневый API. Использование высокоуровневого API предотвращает неосторожные ошибки, такие как добавление смещения UTC, когда вы должны были вычесть (или наоборот). Однако этот низкоуровневый API существует, потому что иногда низкоуровневый доступ к такой информации делает вашу программу эффективной.

Например, вот код более высокого уровня, который просто печатает текущее местное время:

std::cout << date::make_zoned(date::current_zone(), system_clock::now()) << '\n';

system_clock::now() все еще явно вызывается, но теперь добавление смещения UTC, а также вызов current_zone()->get_info() инкапсулирован в этом высокоуровневом API.


1 Эта библиотека недавно была включена в рабочий проект C++20.

Если в вашей ОС std::localtime может получить доступ к информации о часовом поясе (в большинстве случаев это возможно по определению), это мой однострочный код:

auto offset_epoch = std::localtime(new time_t(0));

где offset_epoch->tm_hour это час смещения и offset_epoch->tm_minэто смещение в минутах. Вы можете спокойно игнорироватьoffset_epoch->tm_hour поскольку это имеет ценность 70.

У меня пока работает нормально.

Другие вопросы по тегам