如何使用当前系统时区使用boost::date_time
在本地和UTC时间(特别是从本地到UTC )之间进行转换?我知道boost::date_time::local_adjustor
,但它需要一个模板参数,这是一个与时区相关的偏移量。
Failing platform-independent way要做到这一点,我将如何在Linux上专门做到这一点?
另外,转换过程中如何处理不存在的时间点?例如,如果因DST而一天的时间缩短一小时,并且我尝试从缺失的小时转换时间点,那将是什么样的通用时间?
答案 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));
}