也许这个free, open source, C++11/14 timezone library 会有所帮助。您可以使用它将 UTC 转换为您的本地时区或从本地时区转换为任意IANA timezone 或任意两个任意IANA timezones 之间的转换。该库已被移植到 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 支持的任何精度转换时区,并解析和格式化该精度。
如果这个库给您带来任何麻烦,您可以在此处获得有关堆栈溢出的帮助,或chat here,或open an issue here,或搜索我的电子邮件地址并直接与我联系。
这个库有完整的文档记录,旨在与最新的 IANA timezone database 保持同步(即使您需要 latest mess the Egyptian politicians have made - 提前 3 天通知更改时区规则)。如果您的时间戳已经过时(比如从 1940 年代开始),请不要担心。该库无缝支持IANA 提供的完整时区历史记录。即如果IANA timezone database中有数据,则本库无误地提取并使用。
如果这对您的应用程序有帮助,您还可以轻松有效地形成柏林本地的日期文字。例如,以下是您如何指定 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
希望这会有所帮助。