有没有啥简单的方法可以在 C/C++ 中获得 Linux 下的夏令时转换时间

Posted

技术标签:

【中文标题】有没有啥简单的方法可以在 C/C++ 中获得 Linux 下的夏令时转换时间【英文标题】:Is there any simple way to get daylight saving time transition time under Linux in C/C++有没有什么简单的方法可以在 C/C++ 中获得 Linux 下的夏令时转换时间 【发布时间】:2012-12-19 10:09:07 【问题描述】:

我想知道夏令时的过渡时间 在具有给定时区或 TZ 环境的 Linux 下。 我的方法很愚蠢,给年初的时间然后每小时尝试一次,然后检查本地时间的 tm_isdst 值以获取过渡时间。 有没有一些简单的方法可以做到这一点?

【问题讨论】:

请注意,无论您使用什么,都需要经常更新数据库,因为时区纯粹是政治问题。 一句话中的“时区”或“夏令时”与“简单”不适用。决定这些事情的人都是彻头彻尾的白痴,并且不知道任何人都可能不得不处理他们后来产生的废话。迄今为止,时区最愚蠢的事情是不久前将加拉加斯的时区更改了半小时,唯一的原因是查韦斯先生认为如果委内瑞拉这样做还不够“酷”与其他国家在同一时区。现在不要让我开始在地理相似的国家/地区转换几周的 DST... 你可以通过二分法改进你的搜索;在 1 月 1 日、7 月 1 日、12 月 31 日评估偏移量。如果它们相同,则很有可能时区没有变化。如果中间的区域不同,那么你可以做一个二分切,看看第一次切换是在 4 月 1 日之前还是之后;然后,根据该结果,将相关部分再次切成两半。这应该快很多。时区通常以小时为单位,因此您可以按月、天、小时进行优化。下半年重复。这应该会快 很多 【参考方案1】:

glibc 中有源代码,你可以在这里浏览: http://sourceware.org/git/?p=glibc.git;a=tree;f=timezone

或者您可以在此处使用时区数据库: ftp://ftp.iana.org/tz/releases/tzdata2012c.tar.gz

由于您没有提供特定的时区/位置,因此我无法查找并为您提供确切的信息。

【讨论】:

+1。 zdump -v America/Los_Angeles(例如)做了一些有趣的事情,所以来源应该是相关的。也就是说,似乎没有标准 API 可以回答 OP 提出的问题。【参考方案2】:

您也可以使用boost_datetime。

#include <iostream>
#include <boost/date_time/local_time/local_time.hpp>

using namespace boost::local_time;
using namespace boost::posix_time;

int main()

  tz_database tz_db;
  tz_db.load_from_file("/path_to_boost/boost/libs/date_time/data/date_time_zonespec.csv");
  time_zone_ptr zone = tz_db.time_zone_from_region("America/New_York");
  ptime t1 = zone->dst_local_start_time(2013);
  ptime t2 = zone->dst_local_end_time(2013);
  std::cout << t1 << std::endl;
  std::cout << t2 << std::endl;

一些相关的 SO 链接: c++ How to find the time in foreign country taking into account daylight saving? How do you get the timezone (offset) for a location on a particular date?

但正如 RedX 之前所说,政治可能会改变时区。因此,实际上您的原始解决方案具有使用底层操作系统自动更新的优势。此外,您可以使用二分搜索改进现有解决方案。

【讨论】:

以上是关于有没有啥简单的方法可以在 C/C++ 中获得 Linux 下的夏令时转换时间的主要内容,如果未能解决你的问题,请参考以下文章

在C/C++/ObjC编程语言中有没有啥方法获取 socket 是不是连接啊?就像C#中Socke

C语言编译系统对宏替换的处理是在啥时候进行的

是否可以在 C/C++ 中永远不使用标头保护?如果是这样,这种方法有啥优势吗?

当 <li> 从容器 div 中取出时,有啥方法可以删除它?

我可以在 C/C++ 中获得堆栈的限制吗?

WPF的控件没有句柄,但是有啥其他间接方法获得WPF控件的句柄啊。