等效的C ++时区转换?

时间:2016-12-13 17:57:15

标签: python c++

在python中,我正在执行以下操作以在时区之间进行转换。它还负责夏令时的调整,所以我不必担心这一点。在C ++中执行此操作的等效方法是什么,而不必担心夏令时?

import datetime
from pytz import timezone

# Create timezones
londontz = timezone("Europe/London")
nyctz = timezone("US/Eastern")

# Set today as 5pm London time
today = datetime.date.today()
time = datetime.time(17, 0, 0)
londondt = londontz.localize(datetime.datetime.combine(today, time))

# Convert the London close time to NYC time (this will auto-adjust for DST)
nycdt = londondt.astimezone(nyctz)

2 个答案:

答案 0 :(得分:1)

C ++在标准库中不包含这种功能(无论如何)。

尽管如此,如果可能的话,你肯定想把它留给图书馆。反过来,该库会将大量实际工作委托给数据库,因为基本上不可能将所有内容正确地建模为实际算法。

考虑到你的要求,Howard Hinnant's date library将是明显的首选。

答案 1 :(得分:1)

Fwiw,这是Howard Hinnant's library(MIT开源许可证)将用于解决此问题的语法:

#include "tz.h"
#include <iostream>

int
main()
{
    using namespace date;
    using namespace std::chrono;

    // Set today as 5pm London time
    auto londontz = locate_zone("Europe/London");
    auto today = floor<days>(make_zoned(londontz,
                                        system_clock::now()).get_local_time());
    auto londondt = make_zoned(londontz, today + 17h);

    // Convert the London close time to NYC time (this will auto-adjust for DST)
    auto nycdt = make_zoned("US/Eastern", londondt);

    // print it out
    std::cout << "London  : " << londondt << '\n';
    std::cout << "New York: " << nycdt    << '\n';
}

首先要做的是根据“欧洲/伦敦”找到“today”。这是通过获取当前时间,将其转换为伦敦当前时间,然后将当前本地时间截断为当前本地日期(使用floor<days>())来完成的。

成立today后,向其中添加17小时非常容易。

然后从nycdt构建londondt也很容易。

这只是我的输出:

London  : 2016-12-13 17:00:00 GMT
New York: 2016-12-13 12:00:00 EST

我注意到原始代码的严格翻译将today定义为计算机的本地日期。这也是可能的:

auto today = floor<days>(make_zoned(current_zone(),
                                    system_clock::now()).get_local_time());

即,使用current_zone()代替特定时区。但我最好的猜测是使用current_zone()来确定日期实际上是一个逻辑错误。该库有助于发现此类逻辑错误并轻松纠正它们。

仅涉及std :: lib的解决方案下载到几十年前设计的预多线程C API。您必须将计算机的时区更改为伦敦,在本地和UTC之间进行转换,然后将计算机的时区更改为NY,并在 本地和UTC之间进行转换。这不仅容易出错,而且如果您有多个线程,则根据当前本地时区的不同,它不是线程安全的。此外,没有真正标准的方法甚至用旧的C api指定“欧洲/伦敦”和“美国/东方”。您可以使用POSIX扩展来完成它。