在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)
答案 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扩展来完成它。