关于boost:c ++如何在考虑夏令时的情况下在国外找到时间?

c++ How to find the time in foreign country taking into account daylight saving?

比如说,如果它是纽约(EST)的13:00,那么新西兰(NZST)的时间是06:00。
如果新西兰进入夏季,那么当它在纽约的13:00(仍然是美国东部时间)时,新西兰(现在是新西兰)的时间是07:00。

我读了加速时间库,但在我看来,我必须自己确定夏令时规则,以便从"本地时间"的角度找出国外的时间。

例如

1
2
3
4
5
6
7
8
 nyc_string ="EST-05:00:00EDT+01:00:00,M4.1.0/02:00:00,M10.5.0/02:00:00";
 // above basically defines the daylight saving rule
 time_zone_ptr nyc_2(new posix_time_zone(nyc_string));

 std::cout <<"The second zone is in daylight savings from:
"

  << nyc_2->dst_local_start_time(2004) <<" through"
  << nyc_2->dst_local_end_time(2004) << std::endl;

来源:http://www.boost.org/doc/libs/1_39_0/doc/html/date_time/examples.html

也许有一些我还没有意识到的东西? boost是否会使用任何跟踪夏令时规则的数据库? 我想知道是否有一种很好的方法可以将本地时间调整到c ++中的不同时区,考虑夏令时规则。如果我有一个例子,那就太棒了!


Boost.DateTime有一个名为date_time_zonespec.csv的时区数据库,位于libs/date_time/data中。文档中的Flight Time示例显示了如何访问和使用它。此数据库不包含时区更改的历史记录。似乎还没有托管此数据库更新的地方(除了Boost库本身)。

如果您需要准确,最新的时区数据,请查看IBM流行的ICU国际化库的ICU时区类。如更新时区数据部分所述:

The time zone data in ICU is generated from the industry-standard TZ
database using the tzcode
(http://source.icu-project.org/repos/icu/icu/trunk/source/tools/tzcode/
) tool.
The ICU data files with recent time zone data can be downloaded from
the update URL,
http://source.icu-project.org/repos/icu/data/trunk/tzdata/icunew .

ICU时区数据库源自ICANN现在维护的tz数据库。

要在C ++程序中通过http下载文件,可以使用libcurl或cURLpp C ++包装器。在操作系统上设置调度程序以定期下载最新数据库可能更容易。

正如评论中已经提到的,将UTC一致地用于存储和业务逻辑。仅转换为/从本地时间进行显示/输入。