如何在本地和UTC时间之间进行转换(特别是 从本地到UTC使用 boost::date_time
用一个 当前 系统时区?我知道 boost::date_time::local_adjustor
,但它需要一个模板参数,它是一个与时区相关的偏移量。
失败的平台无关的方式 要做到这一点,我将如何在Linux上专门做到这一点?
另外,在转换过程中如何处理不存在的时间点?例如,如果因DST而一天的时间缩短一小时,并且我尝试从缺失的小时转换时间点,那将是什么样的通用时间?
如何在本地和UTC时间之间进行转换(特别是 从本地到UTC使用 boost::date_time
用一个 当前 系统时区?我知道 boost::date_time::local_adjustor
,但它需要一个模板参数,它是一个与时区相关的偏移量。
失败的平台无关的方式 要做到这一点,我将如何在Linux上专门做到这一点?
另外,在转换过程中如何处理不存在的时间点?例如,如果因DST而一天的时间缩短一小时,并且我尝试从缺失的小时转换时间点,那将是什么样的通用时间?
我正在使用以下代码来查找本地和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时间。
我正在使用以下代码来查找本地和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时间。
如果你有 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();
}
只有当您保持在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));
}