时区之间的时间转换



我有一个在GMT下工作的服务器应用程序。我的应用程序与柏林时区的服务器通信,我不时从该服务器读取一些文件。我需要比较这个文件中的时间。考虑到夏季、冬季时移,如何将远程服务器时间从柏林时区转换为 GMT?你知道 mb 来自boost.date_time的东西可以帮助我轻松做到这一点吗?

我不是在尝试从当地时间转换为格林威治标准时间。我正在从特定时区转换为格林威治标准时间。我需要有一种强大的方法来使用不同的时区。

也许这个免费的开源C++11/14时区库可能会有所帮助。 您可以使用它将 UTC 转换为本地时区、任何任意 IANA 时区或任意两个任意 IANA 时区之间的 UTC。 该库已移植到 gcc、clang 和 VS。 但它需要<chrono>.

下面是一个简短的示例,说明如何获取当前 UTC 时间,将其转换为柏林本地时间,然后将柏林本地

时间转换为本地时间,然后将柏林本地时间转换回 UTC。 使用现代C++语法和类型安全,这一切都非常简单:

#include "tz.h"
#include <iostream>
int
main()
{
    using namespace date;
    using namespace std::chrono;
    auto utc = system_clock::now();
    auto berlin = make_zoned("Europe/Berlin", utc);
    auto local  = make_zoned(current_zone(), berlin);
    auto utc2   = berlin.get_sys_time();
    std::cout << format("%F %T %Z", utc) << 'n';
    std::cout << format("%F %T %Z", berlin) << 'n';
    std::cout << format("%F %T %Z", local) << 'n';
    std::cout << format("%F %T %Z", utc2) << 'n';
}

这只是为我输出:

2016-07-05 01:41:29.207335 UTC
2016-07-05 03:41:29.207335 CEST
2016-07-04 21:41:29.207335 EDT
2016-07-05 01:41:29.207335 UTC

是的,您甚至可以使用std::chrono::sytem_clock支持的任何精度转换时区,并解析和格式化该精度。

如果这个库给你带来任何麻烦,你可以在这里获得关于堆栈溢出的帮助,或者在这里聊天,或者在这里打开一个问题,或者搜索我的电子邮件地址并直接与我联系。

该库有完整的文档记录,旨在与最新的 IANA 时区数据库保持同步(即使您需要埃及政客制造的最新混乱 - 提前 3 天通知更改时区规则)。 如果您的时间戳已经过时(例如 1940 年代的时间戳),请不要担心。 该库无缝支持 IANA 提供的完整时区历史记录。 也就是说,如果 IANA 时区数据库中有数据,则此库将提取并使用该数据,而不会出错。

您还可以轻松高效地形成柏林本地的日期文本,如果这对您的应用程序有帮助。 例如,下面介绍了如何在柏林指定 2016 年 7 月的第一个星期一的 15:30(<chrono>文本需要 C++14):

auto meet = make_zoned("Europe/Berlin", local_days{2016_y/jul/mon[1]} + 15h + 30min);
std::cout << meet << 'n';

输出:

2016-07-04 15:30:00 CEST

如果您想了解纽约办事处必须为这次会议远程办公的时间:

std::cout <<  make_zoned("America/New_York", meet) << 'n';

输出:

2016-07-04 09:30:00 EDT

希望这有帮助。

C++20

更新

您现在可以在 C++20 中执行此操作,而无需免费的开源库,语法非常相似(在已实现它的平台上):

#include <chrono>
#include <format>
#include <iostream>
int
main()
{
    using namespace std::chrono;
    auto utc = system_clock::now();
    auto berlin = zoned_time{"Europe/Berlin", utc};
    auto local  = zoned_time{current_zone(), berlin};
    auto utc2   = berlin.get_sys_time();
    std::cout << std::format("{:%F %T %Z}", utc) << 'n';
    std::cout << std::format("{:%F %T %Z}", berlin) << 'n';
    std::cout << std::format("{:%F %T %Z}", local) << 'n';
    std::cout << std::format("{:%F %T %Z}", utc2) << 'n';
    auto meet = zoned_time{"Europe/Berlin", local_days{2016y/July/Monday[1]} + 15h + 30min};
    std::cout << meet << 'n';
    std::cout <<  zoned_time{"America/New_York", meet} << 'n';
}

演示。

相关内容

  • 没有找到相关文章

最新更新