我正在以 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。
没有图书馆的 PS 会是最好的,谢谢。
Boost Date_time 就是这样做的,这里只是我一直在闲逛的例子(代码如下):
edd@max:~/src/progs/C++$ g++ -o boost_posix_time_dst boost_posix_time_dst.cpp
edd@max:~/src/progs/C++$ ./boost_posix_time_dst
DST ran from 2012-Mar-11 02:00:00 to 2012-Nov-04 02:00:00
DST shortcut PDT
DST name Pacific Daylight Time
edd@max:~/src/progs/C++$
Run Code Online (Sandbox Code Playgroud)
还有一个功能可以形成日期(您的 2012 年 12 月 1 日)并查看它是否在给定间隔内(如此处由 DST 开始和结束形成的)。
我认为您还可以通过形成日期并检查 isDST() 布尔值来获取它。
我的短节目如下。您需要 csv 文件的本地副本,该副本 a) 在 Boost 源中,b) 在许多处理时区的网站上(例如 Google 的第一次或第二次点击在 CERN 找到它):
#include <iostream>
#include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/date_time/posix_time/posix_time_io.hpp>
#include <boost/date_time/gregorian/gregorian.hpp>
#include <boost/date_time/local_time/local_time.hpp>
using namespace boost::posix_time;
using namespace boost::gregorian;
int main(int argc, char **argv) {
boost::local_time::tz_database tz;
tz.load_from_file("/tmp/date_time_zonespec.csv");
boost::local_time::time_zone_ptr tzp =
tz.time_zone_from_region("America/Los_Angeles");
int year = 2012;
boost::posix_time::ptime t1 = tzp->dst_local_start_time(year);
boost::posix_time::ptime t2 = tzp->dst_local_end_time(year);
std::cout << "DST ran from " << t1 << " to " << t2 << std::endl;
std::cout << "DST shortcut " << tzp->dst_zone_abbrev() << std::endl;
std::cout << "DST name " << tzp->dst_zone_name() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)