时区之间的时间转换

use*_*416 0 c++ time boost boost-date-time

我有一个可以在GMT中运行的服务器应用程序。我的应用程序与柏林时区的服务器通信,我不时从该服务器读取一些文件。我需要比较这些文件的时间。考虑到夏,冬时间的变化,如何将远程服务器时间从柏林时区转换为格林尼治标准时间?您知道boost.date_time提供的一些信息可以帮助我轻松地做到这一点吗?

我不是要从当地时间转换为格林尼治标准时间。我正在从特定时区转换为gmt。我需要有一个健壮的方法来在不同时区进行操作。

How*_*ant 5

也许这个免费的,开源的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)

希望这可以帮助。

  • 首次夏令时:是的,该库了解 IANA tz 数据库中存储的所有夏令时规则。因此,随着规则随着时间的变化,这个库也会随着规则无缝地变化。然而,有时政客会以数据库不知道的方式更改规则,因此它确实会过时。该库可用于下载和更新数据库的新副本。但这不会自动发生。这是一篇讨论此问题的短文:https://github.com/HowardHinnant/date/wiki/Examples-and-Recipes#tzdb_manage (2认同)