Если вы не хотите копаться в 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.