比如说,如果纽约时间是13:00,那么新西兰时间就是06:00。如果新西兰进入夏令时,那么当纽约时间是13:00时(仍然是东部时间),新西兰时间就是07:00时(现在是NZDT)。
我读了boost时间库,但在我看来,一个人必须自己确定夏令时规则,才能从'localtime'的角度找出国外的时间。
。
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++中,考虑到夏令时规则…如果我能有一个例子,那就太好了!
DateTime的时区数据库名为date_time_zonespec.csv
,位于libs/date_time/data
中。文档中的Flight Time示例展示了如何访问和使用它。该数据库不包含时区更改的历史记录。似乎也没有一个地方托管这个数据库的更新(除了Boost库本身)。
如果您需要准确的、最新的时区数据,那么请查看IBM流行的ICU国际化库的ICU time zone Classes。如更新时区数据一节所述:
ICU中的时区数据是从行业标准TZ生成的数据库使用tzcode(http://source.icu-project.org/repos/icu/icu/trunk/source/tools/tzcode/)工具。包含最近时区数据的ICU数据文件可从更新URL;http://source.icu-project.org/repos/icu/data/trunk/tzdata/icunew。
ICU时区数据库来源于目前由ICANN维护的tz数据库。
要在c++程序中通过http下载文件,可以使用libcurl或cURLpp c++包装器。在你的操作系统上设置一个调度程序来定期下载最新的数据库可能会更容易。
正如在注释中已经提到的,一致地使用UTC 进行存储和业务逻辑。仅用于显示/输入目的的本地时间转换。