gpt4 book ai didi

c++ - 将 time_duration 转换为 DATE

转载 作者:太空宇宙 更新时间:2023-11-04 11:23:28 25 4
gpt4 key购买 nike

我想转换一个 time_durationDATE格式,即自1899年以来的天数、12、30。

DATE date_from_duration(time_duration td)
{
double days = td.hours()/24.+td.minutes()/(24.*60.)+td.seconds()/(24.*60.*60.);
return days;
}

此代码几乎可以工作,但有时会出现舍入错误,f.i time_duration(1007645, 15, 0) 应该导致 2014-12-12 00:15:00,但实际上是 2014-12 -12 00:14:59。

DATE 的检查是用这个方法完成的,偷自here :

ptime pTime_from_DATE(double date)
{
using boost::math::modf;

static const ptime::date_type base_date(1899, Dec, 30);
static const ptime base_time(base_date, ptime::time_duration_type(0,0,0));

int dayOffset, hourOffset, minuteOffset, secondOffset;
double fraction = fabs(modf(date, &dayOffset)) * 24; // fraction = hours
fraction = modf(fraction, &hourOffset) * 60; // fraction = minutes
fraction = modf(fraction, &minuteOffset) * 60; // fraction = seconds
modf(fraction, &secondOffset);
ptime t(base_time);
t += ptime::time_duration_type(hourOffset, minuteOffset, secondOffset);
t += ptime::date_duration_type(dayOffset);
return t;
}

有什么想法可以有效地纠正这个舍入问题吗?

最佳答案

我可能忽略了一些复杂性,但对我来说它看起来很简单:

Live On Coliru

#include <boost/date_time/posix_time/posix_time.hpp>
#include <iostream>
using DATE = double;

boost::posix_time::ptime pTime_from_DATE(double date)
{
static const boost::posix_time::ptime::date_type base_date(1899, boost::gregorian::Dec, 30);
return boost::posix_time::ptime(
base_date,
boost::posix_time::milliseconds(date * 1000 * 60 * 60 * 24));
}

int main() {
boost::posix_time::time_duration duration(1007645, 15, 0);

DATE date = duration.total_milliseconds() / 1000.0 / 60 / 60 / 24;

std::cout << date << ": " << pTime_from_DATE(date);
}

打印

41985.2: 2014-Dec-12 05:15:00

查看 Live On Coliru

关于c++ - 将 time_duration 转换为 DATE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27465279/

25 4 0
文章推荐: c++ - 无符号字符的 typedef 数组与 std::vector 之间没有已知的转换
文章推荐: html - IE11 :