- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我想转换一个 time_duration到 DATE格式,即自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;
}
有什么想法可以有效地纠正这个舍入问题吗?
最佳答案
我可能忽略了一些复杂性,但对我来说它看起来很简单:
#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
关于c++ - 将 time_duration 转换为 DATE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27465279/
我想计算 boost::posix_time:ptime 中两个时间戳之间的时间差(以秒为单位)。但是,由于 timestamp 最多包含微秒,结果可能会出乎我的意料。 boost::posix_ti
我正在使用 boost::posix_time 来实现时钟。 date d(2000,Jan,20); ptime start(d); time_iterator titr(start,microse
我有以下代码从 posix_time 获取 UNIX 时间 boost::posix_time::ptime time1(boost::gregorian::date(9999,12,31)); bo
我想转换一个 time_duration到 DATE格式,即自1899年以来的天数、12、30。 DATE date_from_duration(time_duration td) { doub
我想通过网络传输 boost::posix_time::ptime 作为 boost::int64_t。根据A way to turn boost::posix_time::ptime into an
我正在使用 boost::posix_time::ptime 来测量我的模拟运行时间和其他东西。 假设 boost::posix_time::ptime start, stop; boost::pos
可以通过 total_microseconds 方法从 time_duration 中获取总微秒数,但我不知道如何根据该数字重新构建 time_duration。文档中似乎没有用于此目的的构造函数,我
考虑这段代码(使用 VS2015 编译,使用 boost 1.60: #include #include #include int main( int argc, char* argv[] )
我知道我可以使用 boost::gregorian::date_duration 作为以天为单位的时间间隔,使用 boost::posix_time::time_duration 作为时间间隔,但是有
您好,我正在使用 boost Posix 时间系统。我有课 class event{ private: boost::posix_time::ptime time; //some other stuu
我正在尝试为 boost::posix_time::duration 编写一个简单的生成器以在另一个生成器中使用。现在对我来说关键是我想打印的“+”或“-”。到目前为止我所拥有的是: struct G
我正在尝试将 boost::posix_time::time_duration 对象转换为 "%H%M"形式的 string。问题是对话是不工作就好像它不存在一样。 我用来将 Duration 转换为
下面这段代码: auto td = boost::posix_time::seconds(1); auto seconds = td.seconds(); // (*) std::cout << se
我是一名优秀的程序员,十分优秀!