Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何获取特定日期位置的时区(偏移)?_C++_Datetime - Fatal编程技术网

C++ 如何获取特定日期位置的时区(偏移)?

C++ 如何获取特定日期位置的时区(偏移)?,c++,datetime,C++,Datetime,我正在UTC中存储消息。因此,如果有人回顾以前的消息,我需要能够将时间戳转换为相对于当时时区的时间。我怎么知道当时的时区是多少 例如,2012年9月3日,时区为PDT。当前时间偏移为-0700。我在9点06分发信息。UTC时间是16:06 我回到2012年12月1日的消息。当前时区为PST。当前时间偏移为-0800。我看了看我在2012年9月3日发送的消息。如果我使用当前时间偏移从UTC转换回,我得到的是8:06,而不是消息发送时的时间。它是9点06分发出的 因此,我需要一种方法来确定2012年

我正在UTC中存储消息。因此,如果有人回顾以前的消息,我需要能够将时间戳转换为相对于当时时区的时间。我怎么知道当时的时区是多少

例如,2012年9月3日,时区为PDT。当前时间偏移为-0700。我在9点06分发信息。UTC时间是16:06

我回到2012年12月1日的消息。当前时区为PST。当前时间偏移为-0800。我看了看我在2012年9月3日发送的消息。如果我使用当前时间偏移从UTC转换回,我得到的是8:06,而不是消息发送时的时间。它是9点06分发出的

因此,我需要一种方法来确定2012年9月3日的时区是PDT,而不是PST


没有图书馆最好,谢谢。

仅仅知道当前偏移量不足以告诉你一年中其他时间同一地点的偏移量;一年中有很多地方(如中欧和阿尔及利亚,或美国东部和哥伦比亚)共享一个时区


最简单的修复方法是将时区与消息一起存储。

Boost Date\u time可以做到这一点,下面是我一直在讨论的简单示例(代码如下):

还有一个功能可以形成一个日期(您的2012年12月1日),并查看它是否在给定的时间间隔内(这里由DST开始和结束组成)

我认为您也可以通过形成日期并检查isDST()布尔值来获得它

我的简短计划如下。您需要csv文件的本地副本,该文件a)在Boost sources中,b)在许多处理时区的网站上(例如谷歌的第一次或第二次点击在CERN找到):

#包括
#包括
#包括
#包括
#包括
使用名称空间boost::posix_time;
使用名称空间boost::gregorian;
int main(int argc,字符**argv){
boost::local_time::tz_数据库tz;
从文件(“/tmp/date\u time\u zonespec.csv”)加载;
boost::本地时间::时区时间=
tz.来自美国地区(“美国/洛杉矶”)的时区;
国际年=2012年;
boost::posix_time::ptime t1=tzp->dst_local_start_time(年);
boost::posix_time::ptime t2=tzp->dst_local_end_time(年);

std::cout如果它是一个简单的
C++
应用程序,在执行过程中不需要使用单独的时区,那么您可以简单地使用来获取一个共享的
struct tm*
引用,该引用包含调用它的特定
时间的时区信息。如果您的系统配置了PS时区T、 然后,当您调用
localtime
时,它将使用太平洋时区信息进行显示-例如使用2012年1月1日(GMT)和2012年6月1日:

time_t def_time = 1325376000;
struct tm *a_tim = localtime(&def_time);
printf("%s %ld %d\n", a_tim->tm_zone, a_tim->tm_gmtoff, a_tim->tm_isdst);
def_time = 1338505200;
a_tim = localtime(&def_time);
printf("%s %ld %d\n", a_tim->tm_zone, a_tim->tm_gmtoff, a_tim->tm_isdst);
在我的系统(TZ=欧洲/都柏林)上显示:

GMT 0 0
IST 3600 1
通过使用America/Los_Angeles覆盖TZ环境变量,我得到:

PST -28800 0
PDT -25200 1
i、 e.系统能够很好地确定时区名称、与GMT的偏移量以及夏季时间是否从UTC时间戳生效


编辑:试图在C/C++程序中同时使用posix提供的时区例程来使用多个时区是很可怕的,如果您遇到这种情况,我绝对建议您使用boost,因为它是一个快速的解决方案。

您的问题让我困惑。时区不是针对特定时间段的(例如,消息发布的时间),它是针对特定地区(例如中欧)。@delnan时区不仅针对特定地区,也针对一年中的特定时间。这就是PST和PDT之间的差异。这就是我考虑添加“(一般情况下)”的原因在这里。是的,日期可能会影响时区偏移,但这并不会使你的措辞更加混乱。位置仍然很重要。@delnan我举了一个例子,这是否澄清了问题?请注意,你知道位置,因此时区的选择只取决于夏令时等。我自由选择了为了扩展标题,我担心这一遗漏可能已经吓跑了读者。但是,是的,这更清楚了。+1您可以获得不是当前时区的时区快捷方式(即,如果您在PDT中,则获取PST,反之亦然)?除此之外,这是完美的,唯一的例外是,我现在必须为1个函数链接整个库:(.是的,当你调用'zone'和'dst'abbrev.name函数时,它将分别返回'PST'和'PDT'。并不是说我没有提供日期,只是一年!参见boost文档,它是一个非常丰富的API。+1谢谢,如果没有boost的答案出现,我会稍后接受你的答案。这正是我想要的。该程序永远不需要转换为非本地时区,这样就完美了。+1.只是尝试实现它,不幸的是,我的系统没有tm结构的tm_zone成员。:(tm_zone项是glibc扩展(即,它在大多数linux实现中)。您在原始请求中从未提及平台。您仍然可以使用tm_isdst项目确定是否为夏令时。
GMT 0 0
IST 3600 1
PST -28800 0
PDT -25200 1