时区之间的时间转换

时间:2016-07-04 18:38:08

标签: c++ boost time boost-date-time

我有一个适用于GMT的服务器应用程序。我的应用程序与柏林时区的服务器通信,我不时从该服务器读取一些文件。我需要比较这些文件的时间。考虑到夏季,冬季时间的变化,如何将远程服务器时间从柏林时区转换为GMT?你知道来自boost.date_time的某些东西可以帮我轻松完成吗?

我不是想从本地时间转换为gmt。我正在从特定时区转换为gmt。我需要有一种强大的方法来实现不同的时区。

1 个答案:

答案 0 :(得分:4)

也许这free, open source, C++11/14 timezone library可能会有所帮助。您可以使用它将UTC转换为本地时区,或从任意IANA timezone转换,或转换为任意两个IANA timezones之间的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支持的精度转换时区,并解析并格式化该精度。

如果此库给您带来任何麻烦,您可以在此处获取有关堆栈溢出,chat hereopen an issue here的帮助,或搜索我的电子邮件地址并直接与我联系。

此库已完整记录,旨在及时了解最新的IANA timezone database(即使您需要latest mess the Egyptian politicians have made - 使时区规则更改为整整3天提前预告)。如果您的时间戳过时(例如20世纪40年代),请不要担心。该库无缝支持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

希望这有帮助。