如何使用boost :: date_time在本地时间和世界时间之间进行转换?

时间:2010-02-19 05:01:42

标签: c++ boost timezone

如何使用当前系统时区使用boost::date_time在本地和UTC时间(特别是从本地到UTC )之间进行转换?我知道boost::date_time::local_adjustor,但它需要一个模板参数,这是一个与时区相关的偏移量。

Failing platform-independent way要做到这一点,我将如何在Linux上专门做到这一点?

另外,转换过程中如何处理不存在的时间点?例如,如果因DST而一天的时间缩短一小时,并且我尝试从缺失的小时转换时间点,那将是什么样的通用时间?

3 个答案:

答案 0 :(得分:7)

我正在使用以下代码来查找本地和UTC时间之间的差异:


    using namespace boost::posix_time;
    using namespace boost::gregorian;

    time_duration UTC_Diff;
    {
        ptime someUTC_Time(date(2008, Jan, 1), time_duration(0, 0, 0, 0));
        ptime someLocalTime = boost::date_time::c_local_adjustor::utc_to_local(someUTC_Time);
        UTC_Diff = someLocalTime - someUTC_Time;
    }

因为您发现差异并不容易加速UTC时间。

答案 1 :(得分:5)

如果您的时区正确local_date_time,则可以直接使用utc_time方法获取UTC时间。

看起来你有一些简单的ptime,你想要解释为在给定的时区,然后将其转换为UTC,我正在使用这个构造函数

local_date_time(...)
  Parameters:
    date
    time_duration 
    time_zone_ptr
    bool

根据docs它重新解释给定时区的给定时间数据,这意味着它可以用于本地化任何给定的ptime,并且在可以使用utc_time方法之后,这里有一个实用程序用于将任何ptime从给定时区转换为UTC

的函数
ptime get_local_to_utc(const ptime& t, const time_zone_ptr& localtz){
    if(t.is_not_a_date_time()) return t;
    local_date_time lt(t.date(), t.time_of_day(), localtz, local_date_time::NOT_DATE_TIME_ON_ERROR);
    return lt.utc_time();
}

答案 2 :(得分:4)

只有在DST更改时刻保持同一侧时,才会根据某些选定时间和UTC之间的差异在UTC和本地之间进行转换。

以下内容适用于任何日期(抱歉,它不是local-> UTC):

    bpt::ptime utils::utcToLocal(bpt::ptime utcTime)
{
  // NOTE: the conversion functions between ptime and time_t/tm are broken so we do it ourselves.
  bpt::time_duration timeSinceEpoch = utcTime - bpt::ptime(boost::gregorian::date(1970, 1, 1), bpt::time_duration(0,0,0));
  time_t secondsSinceEpoch = timeSinceEpoch.total_seconds();
  tm* localAsTm = localtime(&secondsSinceEpoch);
  return bpt::ptime(
    boost::gregorian::date(
      localAsTm->tm_year + 1900, 
      localAsTm->tm_mon + 1, 
      localAsTm->tm_mday), 
    bpt::time_duration(
      localAsTm->tm_hour,
      localAsTm->tm_min,
      localAsTm->tm_sec));
}