C STD :: Local Time Daylight节省时间规则(DST)欧洲与美国人
C++ std::localtime daylight saving time rule (dst) european vs american
我在使用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_time
的local_time
。
我试图使用与您的评论一致的格式。您当然可以任何想要的格式。您还可以将系统支持的任何std::locale
包括在format
调用中的第一个参数(%c
将利用它)。
如果需要,您也可以从sys_time
和local_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));
- 模板令人费解..需要帮助(美沙酮除外)
- 将具有 DST 的时间字符串转换为 UTC 时间戳
- 通过代码在 Windows 操作系统上启用和禁用 DST
- C STD :: Local Time Daylight节省时间规则(DST)欧洲与美国人
- 断言失败<dst.data != src.data >在未知函数中。/../ocv/opencv/modules/imgproc/src/imgwarp.cpp
- OSX 优胜美地 10.10.3 上的 Cmake - GLEW:未找到包'gl'
- 使用UTC来回转换日期以忽略DST但仍使用当前用户的有效区域设置是否安全
- OpenCV 错误:断言失败 (src1.size == dst.size && dst.type() == CV_8U) in cvInRangeS
- 2017 年巴西的 DST 启动不正确
- 优胜美地 G++ 上的 Capybara-WebKit:错误:无法识别的命令行选项 '-Xarch_x86_64'
- 使用dst和boost将当前服务器时间转换为时区
- OS X 优胜美地中的 gcc 4.9.1 - gcc:警告:无法理解 kern.osversion '14.0.0'
- CMAKE_OSX_DEPLOYMENT_TARGET自动设置为优胜美地'10.10'
- 给定一个日期/时间作为字符串,知道当时是否是 DST 的最佳方法是什么
- 将src和dst-img设置为与opencv resize函数相同
- 用C++替换旧的cvSmooth(src,dst,CV_MEDIAN,3)是什么
- Mac OS X 优胜美地 C++ Eclipse 错误:"Error while launching command: gdb --version"
- 在优胜美地安装咖啡时出现错误
- 当复制一些大于dst的内容时,memcpy()是否安全
- 架构x86_64的未定义符号,优胜美地与OpenCV上的链接器问题