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 ++中的不同时区,考虑夏令时规则。如果我有一个例子,那就太棒了!
-
只要说不,就用UTC做一切。然后当绝对需要(可能用于人类输出)在UTC和本地时间之间转换时。
-
FWIW,纽约和新西兰目前从未同时在EST和NZST。夏令时在两端重叠,因此要么两者都在EDT / NZDT上,要么只有一个。我完全赞同Mark B,只是说不。
-
对不起,这只是一个愚蠢的例子,我不得不提出来解释,并感谢纠正它。顺便说一下,我的情况是我真的需要将当地时间改为不同的时区,而且不能只坚持UTC。还有其他建议吗?非常感谢,
-
马克B确实有一点意义。时区和夏令时是您可以参与的最大的废话。远离他们并在UTC中做所有事情是明智之举。虽然我们生活在21世纪,但政府仍然无法做一些微不足道的事情,以便在同一时区内的不同国家同一时间切换夏令时...所以你本周可以(将)有不同的结果和下周。
-
但我的任务是将本地时间更改为不同的时区,而不必在每次夏令时发生变化时更改配置。那么这是否意味着我可以使用这个世界中的库来跟踪这些数据?
-
您可以找到一个可以为您提供本地时间戳的Web服务。这里提到了一些:stackoverflow.com/questions/55901/…
-
@user - 不仅各国之间缺乏同步,其中一些国家也逐年成功地改变了规则。抱歉!
-
哎呀,我希望你们不为航空公司工作。如果他们希望你在目的地的时区显示到达时间,你是否只是举手说:"不,这太难了。让我们只显示UTC,让普通人想出来。"
-
@Emile Cormier:逻辑仍然存在:你用UTC完成所有的存储和计算,因为它只会让你的生活更轻松。 (例如计算飞行时间:time1 - time2以UTC工作,但如果你必须将两次转换为UTC只是为了进行计算,你的头会爆炸。)显示"到达时间"是用户想要看到的情况当地(有时候:当我把它们寄给我的女朋友时,我会在航空公司的时间里永远进行TZ转换)。但请注意,您需要知道机场的位置(以及何时,一般情况下),您必须拥有哪些数据。
-
@Thanatos:我同意100%关于UTC的存储/计算,但似乎没有人认为OP的用例是合法的,他们完全回避了这个问题。一些与运输相关的软件需要在与用户的本地时区不同的某个时区输入/输出本地时间并非如此牵强。
-
如果您要显示到达和离开的当地时间,仅使用适用于大多数国家/地区的规则是不够的。您必须查看适用于到达或离开的每个地方的规则。你可能会发现你自己国家的规则比一些外国更为陌生。
-
@Windowsprogrammer:我认为ICANN的tz数据库为每个地方维护了所有这些规则。不是吗?
-
@EmileCormier:啊,是的,你是对的:有一些问题是侧面的。我想它可能是纽约→新西兰,通常是纽约→UTC(商店)(加载)UTC→NZ
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一致地用于存储和业务逻辑。仅转换为/从本地时间进行显示/输入。
-
谢谢! 我试试看:)
-
那些在这个答案上磕磕绊绊的人可能想查看Howard Hinnant的日期库,其中包括处理时区的设施:github.com/HowardHinnant/date