您如何获得特定日期某个位置的时区(偏移量)?

cha*_*m15 5 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 年 9 月 3 日的时区是 PDT,而不是 PST。

没有图书馆的 PS 会是最好的,谢谢。

Dir*_*tel 3

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)