gpt4 book ai didi

C++ std::localtime 夏令时规则 (dst) 欧洲与美国

转载 作者:太空狗 更新时间:2023-10-29 22:59:01 30 4
gpt4 key购买 nike

我在使用 std::localtime 函数时遇到问题。当我将 std::time_t 转换为本地结构 tm 时,它始终使用美国夏令时,而我想使用欧洲夏令时(法国)。

UTC:03/19/16 16:56 转换为本地:03/19/16 18:56。

在这个日期,通常本地时间是 17:56 (UTC+1)。 DST 发生在法国的 27 日。经过多次测试,使用的DST似乎是基于美国规则:DST发生在三月的第二个星期日。

我也更改了 TZ 环境变量,但它也失败了。


`

if( putenv( "TZ=CET-1CEST-2,M3.5.0/2,M10.5.0/3" ) != 0 ) { 
std::cout << "Unable to set TZ" << std::endl;
} else {
tz = getenv("TZ");
if (tz) std::cout << tz << std::endl;
else std::cout << "TZ not defined" << std::endl; tzset();
}

struct std::tm t;
t.tm_sec = 0;
t.tm_min = 56;
t.tm_hour = 18;
t.tm_mday = 19;
t.tm_mon = 3-1;
t.tm_year = 2016-1900;
t.tm_isdst = -1;
std::time_t tt = std::mktime(&t);
std::cout << "UTC: " << std::put_time(std::gmtime(&tt), "%c %Z") << '\n'; // UTC : 03/19/16 16:56
std::cout << "local: " << std::put_time(std::localtime(&tt), "%c %Z") << '\n'; // Local : 03/19/16 18:56 (not waited result)

`

为了精确起见,我使用了 bcc32c 编译器(基于 embarcadero C++ clang 的计算机)。

我希望我已经足够清楚了,您将能够帮助我。

提前致谢

最佳答案

如果您有可用的 C++11(或更高版本),其中包括 <chrono> , 如果您愿意与 <chrono> 合作系统。如果你愿意使用这个free, open-source timezone library .那么这是一件很简单的事情:

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

int
main()
{
using namespace date;
using namespace std::chrono_literals;
auto zt = make_zoned("Europe/Paris", sys_days{2016_y/mar/19} + 18h + 56min);
std::cout << format("%m/%d/%y %H:%M %Z", zt.get_sys_time()) << '\n';
std::cout << format("%m/%d/%y %H:%M %Z", zt) << '\n';
}

输出:

03/19/16 18:56 UTC
03/19/16 19:56 CET

简而言之,你形成一个zoned_time通过配对您选择的时区(“欧洲/巴黎”),带有 sys_time (世界标准时间)。然后你可以格式化zoned_time两者都通过提取 sys_time退出它,并通过格式化 zoned_time本身,它将使用 local_timezoned_time .

我尝试使用与您的评论一致的格式。你当然可以你想要的任何格式。您还可以包括任何 std::locale您的系统支持作为调用 format 的第一个参数(%c 会利用)。

您还可以从 sys_time 中提取单个字段来自 local_time如果需要,或进行其他日期或时间计算。这不仅仅是一个格式化库。

如果您从 time_t 开始,有一个静态成员函数std::chrono::system_clock转换 time_tsystem_clock::time_point .然后你可以使用那个 time_point代替 sys_days{2016_y/mar/19} + 18h + 56min在这个例子中:

auto zt = make_zoned("Europe/Paris", system_clock::from_time_t(t));

关于C++ std::localtime 夏令时规则 (dst) 欧洲与美国,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38104443/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com