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


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

失败的平台无关的方式 要做到这一点,我将如何在Linux上专门做到这一点?

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


1721
2018-02-19 05:01


起源



答案:


我正在使用以下代码来查找本地和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时间。


7
2018-02-19 05:08



它工作,但不幸的是只有一种方式,我不能使用计算的偏移量,因为DST使它在不同的日期不同。 - Alex B


答案:


我正在使用以下代码来查找本地和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时间。


7
2018-02-19 05:08



它工作,但不幸的是只有一种方式,我不能使用计算的偏移量,因为DST使它在不同的日期不同。 - Alex B


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

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

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

根据 文档 它将给定时间数据重新解释为在给定时区内,这意味着它可以用于本地化任何给定的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();
}

5
2018-06-09 22:32





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

以下内容适用于任何日期(抱歉,它不是本地 - > 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));
}

4
2017-11-26 15:27