【问题标题】:Time conversion between timezones时区之间的时间转换
【发布时间】:2016-11-06 12:47:12
【问题描述】:

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

我不想将本地时间转换为格林威治标准时间。我正在从特定时区转换为 GMT。我需要有一种稳健的方式来处理不同的时区。

【问题讨论】:

  • Possible duplicate。 Google 是您的朋友。
  • 你建议的题目不一样。在问之前我已经用谷歌搜索了。
  • 能否请您澄清(在问题本身中)为什么您的主题不同?
  • 这个库可能感兴趣:github.com/HowardHinnant/date

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


【解决方案1】:

也许这个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(&lt;chrono&gt; 文字需要 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

希望这会有所帮助。

【讨论】:

  • 非常感谢。那是一个非常棒的图书馆。我想问你一个问题。这个库如何与数据库保持同步?例如,如果我的应用程序连续运行了一年并且 IANA 时区数据库发生了变化,这个库能知道吗?也为了节省日光,这个库可以自动处理吗?
  • 第一次夏令时:是的,这个库知道存储在 IANA tz 数据库中的所有夏令时规则。因此,随着规则随着时间的推移而变化,这个库也随着规则无缝地变化。但是,有时政客会以数据库不知道的方式更改规则,因此它确实会过时。该库可用于下载和更新数据库的新副本。但这不会自动发生。这是一篇讨论此问题的短文:github.com/HowardHinnant/date/wiki/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-08
相关资源
最近更新 更多