C STD :: Local Time Daylight节省时间规则(DST)欧洲与美国人

C++ std::localtime daylight saving time rule (dst) european vs american

本文关键字:DST 美国人 规则 Local STD Time Daylight 节省时间      更新时间:2023-10-16

我在使用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发生在3月的第二个星期日。

我也更改了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编译器(基于C 的Embarcadero Clang Clang计算机)。

我希望我足够清楚,你可以帮助我。

预先感谢

如果您有包括<chrono>在内的C 11(或更高版本),并且如果您愿意使用<chrono>系统。而且,如果您愿意使用此免费的开源时区库。那是一个非常简单的事情:

#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

简而("欧洲/巴黎"),带有sys_time(UTC)。然后,您可以通过从中提取sys_time的格式化zoned_time,并通过格式化zoned_time本身,该 CC_7本身将使用zoned_timelocal_time

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

如果需要,您也可以从sys_timelocal_time中提取单个字段,或进行其他日期或时间计算。这不仅仅是格式库。

如果您是从time_t开始的,则std::chrono::system_clock的静态成员函数将time_t转换为system_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));