Как получить смещение времени UTC в C ++ с Windows OS - PullRequest
0 голосов
/ 08 мая 2018

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

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

UPDATE

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

1 Ответ

0 голосов
/ 08 мая 2018

Если вы не хотите копаться в 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_time time_point, чтобы получить все виды информации об этом часовом поясе в указанный момент времени (в качестве информации меняется со временем в соответствии с текущей политикой). Использование system_clock::now() в качестве time_point позволит получить текущую информацию для time_zone.

A 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.

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