如何使用Windows操作系统获得c ++中的UTC时间偏移量

时间:2018-05-08 07:43:39

标签: c++ utc timezone-offset

我的问题非常简单。如何获得菲律宾的UTC偏移量为+8,日本为+9,并将其转换为整数。

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

更新

为了进一步说明,我有一个c ++桌面应用程序,我需要在使用应用程序的任何地方自动检测其时区。就像申请将在日本使用一样,将使用日本的时区偏移量。这可能吗?

2 个答案:

答案 0 :(得分:2)

如果您不想深入研究特定于Windows的API,可以使用Howard Hinnant's timezone library来实现此功能,并且可能是未来标准的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()的成员函数。

您可以使用UTC time_pointlocal_time time_point拨打time_zone::get_info,以便在指定的时间点获取有关此时区的各种信息(如根据当前政治,信息随时间而变化)。使用system_clock::now()作为time_point将获取time_zone的当前信息。

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

这只是我的输出:

-14400s

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

对于典型代码,不应该直接在添加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工作草案中。

答案 1 :(得分:1)

如果std::localtime在您的操作系统中可以访问时区信息(根据定义,在大多数情况下可以访问),这是我的单行代码:

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

其中offset_epoch->tm_hour是偏移小时,而offset_epoch->tm_min是偏移分钟。您可以放心地忽略offset_epoch->tm_hour,因为它的值为70

到目前为止对我来说还不错。