也许这个免费的,开源的C ++ 11/14时区库可能会有所帮助。您可以使用它来将UTC与本地时区或任何本地IANA时区或任何任意IANA时区之间进行转换。该库已被移植到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';
}
Run Code Online (Sandbox Code Playgroud)
这只是为我输出:
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
Run Code Online (Sandbox Code Playgroud)
是的,您甚至可以以您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';
Run Code Online (Sandbox Code Playgroud)
输出:
2016-07-04 15:30:00 CEST
Run Code Online (Sandbox Code Playgroud)
如果您想了解纽约办公室在该会议上必须几点通勤:
std::cout << make_zoned("America/New_York", meet) << '\n';
Run Code Online (Sandbox Code Playgroud)
输出:
2016-07-04 09:30:00 EDT
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助。
| 归档时间: |
|
| 查看次数: |
3977 次 |
| 最近记录: |