等效C++时区转换?

2024-04-28 21:34:56 发布

您现在位置:Python中文网/ 问答频道 /正文

在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)

Tags: fromimporttodaydatetimetimecreate方式节约
2条回答

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被建立,添加17h就非常容易了。在

然后从londondt构造{}也非常简单。在

这只是我的输出:

^{pr2}$

我注意到原始代码的严格翻译将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扩展来实现。在

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

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

考虑到您的要求,Howard Hinnant's date library显然是首选。在

相关问题 更多 >