如何使用 Windows 操作系统在 C++ 中获取 UTC 时间偏移

noy*_*o88 3 c++ utc timezone-offset

我的问题很简单。如何获取菲律宾的 UTC 偏移量(+8)和日本的 UTC 偏移量(+9),并将其转换为整数。

任何建议都是很大的帮助。谢谢。

更新

为了进一步说明,我有一个 C++ 桌面应用程序,无论使用该应用程序,我都需要自动检测其时区。就像如果应用程序将在日本使用一样,将使用日本的时区偏移。那可能吗?

How*_*ant 9

如果您不想深入研究 Windows 特定的 API,这里有可移植的、C++20 标准的 C++ 代码1 ,可以使用Howard Hinnant 的时区库来完成此操作。

#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';
}
Run Code Online (Sandbox Code Playgroud)

date::current_zone()检测计算机当前的本地时区。这将返回一个指向 a 的指针,date::time_zone该指针有一个名为 的成员函数get_info()

您可以time_zone::get_info使用 UTCtime_point或 a进行调用local_time time_point,以获取指定时间点有关该时区的各种信息(因为信息会根据当前政治情况随时间变化)。使用system_clock::now()astime_point将获取 的当前信息time_zone

返回的Adate::sys_info是一个聚合,其中一个成员称为offset。这是当前 UTC 偏移量,单位为std::chrono::seconds

这只是我的输出:

-14400s
Run Code Online (Sandbox Code Playgroud)

表明我当前的本地时区是 UTC 以西 14400 秒。

对于典型的代码,不应在直接添加 UTC 偏移量的级别进行编程。有一个更高级别的 API 可以为您执行此操作。使用更高级别的 API 可以防止粗心错误,例如在应该减去 UTC 偏移量的情况下添加(反之亦然)。然而,这种低级 API 的存在是因为有时对此类信息的低级访问可以提高程序的效率。

例如,下面是一个高级代码,它只是打印出当前本地时间:

std::cout << date::make_zoned(date::current_zone(), system_clock::now()) << '\n';
Run Code Online (Sandbox Code Playgroud)

system_clock::now()仍然是显式调用的,但现在 UTC 偏移添加以及调用都current_zone()->get_info()封装在这个更高级别的 API 下。


1该库位于namespace std::chronoC++20 中:http://eel.is/c++draft/time.zone.db.access#8