【问题标题】:How to get UTC time offset in c++ with windows os如何在 c++ 中使用 windows os 获取 UTC 时间偏移
【发布时间】:2018-10-18 02:25:49
【问题描述】:

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

任何建议都会有很大帮助。谢谢。

更新

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

【问题讨论】:

标签: c++ utc timezone-offset


【解决方案1】:

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

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

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

到目前为止,它对我来说效果很好。

【讨论】:

  • 我有两个顾虑。首先,使用new time_t(0) 作为localtime() 的参数会引入内存泄漏。最好将time_t 类型的局部变量初始化为0,并将指向该变量的指针作为参数传递给localtime()。其次,更重要的是,当时有效的夏令时设置可能不等于当前有效的夏令时设置。简而言之,我认为您的解决方案没有考虑夏令时。
【解决方案2】:

如果您不想深入研究特定于 Windows 的 API,这里是可移植的,并且 C++20 标准 C++ 代码1 使用Howard Hinnant's timezone library 来执行此操作。

#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()-&gt;get_info() 的调用被封装在这个更高级别的 API 下。


1 这个库在 C++20 中的 namespace std::chrono 中:http://eel.is/c++draft/time.zone.db.access#8

【讨论】:

    猜你喜欢
    • 2012-07-13
    • 1970-01-01
    • 2012-10-30
    • 2021-06-11
    • 1970-01-01
    • 1970-01-01
    • 2011-07-26
    • 2015-06-16
    • 2019-08-06
    相关资源
    最近更新 更多