有没有啥简单的方法可以在 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++ 中永远不使用标头保护?如果是这样,这种方法有啥优势吗?