【问题标题】:How to convert between local and universal time using boost::date_time?如何使用 boost::date_time 在本地时间和世界时间之间转换?
【发布时间】:2010-02-19 05:01:41
【问题描述】:

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

Failing platform-independent way 这样做,我将如何专门在 Linux 上这样做?

顺便说一句,在转换过程中如何处理不存在的时间点?例如,如果一天由于 DST 而少了一小时,我尝试从缺少的时间转换一个时间点,那么得到的通用时间是什么?

【问题讨论】:

    标签: c++ boost timezone


    【解决方案1】:

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

    【讨论】:

    • 它可以工作,但不幸的是只有一种方式,我不能使用计算出的偏移量,因为 DST 使它在不同的日期有所不同。
    【解决方案2】:

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

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

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

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

    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();
    }
    

    【讨论】:

      【解决方案3】:

      仅当您保持在 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));
      }
      

      【讨论】:

        猜你喜欢
        • 2011-09-02
        • 1970-01-01
        • 1970-01-01
        • 2021-10-04
        • 2013-08-19
        • 2013-10-03
        • 2016-04-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多