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

时间:2011-11-29 21:32:33

标签: c++ boost timezone

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

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

e.g。

 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:\n " 
  << 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 ++中的不同时区,考虑夏令时规则。如果我能有一个例子,那就太棒了!

1 个答案:

答案 0 :(得分:8)

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

如果您需要准确,最新的时区数据,请查看IBM流行的ICU Time Zone Classes国际化库的ICU。正如Updating the Time Zone Data部分所述:

  

ICU中的时区数据来自行业标准TZ   数据库使用tzcode   (http://source.icu-project.org/repos/icu/icu/trunk/source/tools/tzcode/   )工具。   可以从中下载具有最近时区数据的ICU数据文件   更新网址,   http://source.icu-project.org/repos/icu/data/trunk/tzdata/icunew

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

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

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