我有一个在GMT下工作的服务器应用程序。我的应用程序与柏林时区的服务器通信,我不时从该服务器读取一些文件。我需要比较这个文件中的时间。考虑到夏季、冬季时移,如何将远程服务器时间从柏林时区转换为 GMT?你知道 mb 来自boost.date_time的东西可以帮助我轻松做到这一点吗?
我不是在尝试从当地时间转换为格林威治标准时间。我正在从特定时区转换为格林威治标准时间。我需要有一种强大的方法来使用不同的时区。
也许这个免费的开源C++11/14时区库可能会有所帮助。 您可以使用它将 UTC 转换为本地时区、任何任意 IANA 时区或任意两个任意 IANA 时区之间的 UTC。 该库已移植到 gcc、clang 和 VS。 但它需要<chrono>
.
时间转换为本地时间,然后将柏林本地时间转换回 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';
}
演示。