C++ 将1601年以来的100纳秒数转换为C++;
我从数据提供商处收到符合此规范的时间戳:C++ 将1601年以来的100纳秒数转换为C++;,c++,boost,timestamp,posix,C++,Boost,Timestamp,Posix,我从数据提供商处收到符合此规范的时间戳: 自1601年以来的100纳秒数 我使用的是boost::posix_time::ptime,我想将时间戳转换为posix时间。有没有一个简单的方法可以做到这一点?这个系统是什么时候从儒略历改为公历的?一些国家在1601年1月1日之前转换;其他人直到很久以后才更换。这将严重影响您的计算-大约11天 因为在一秒钟内有107个100纳秒的单位,所以将开始数除以107,得到自参考时间起的秒数(余数是一秒的分数)。然后除以86400,得到天数(余数为一天中的时间)
自1601年以来的100纳秒数
我使用的是
boost::posix_time::ptime
,我想将时间戳转换为posix时间。有没有一个简单的方法可以做到这一点?这个系统是什么时候从儒略历改为公历的?一些国家在1601年1月1日之前转换;其他人直到很久以后才更换。这将严重影响您的计算-大约11天
因为在一秒钟内有107个100纳秒的单位,所以将开始数除以107,得到自参考时间起的秒数(余数是一秒的分数)。然后除以86400,得到天数(余数为一天中的时间)。然后你可以根据天数来计算日期
由于POSIX时间使用1970-01-01 00:00:00作为参考,您可能只需要计算1601-01-01 00:00:00和POSIX历元(众所周知)之间的正确秒数,然后从您计算的秒数中减去该秒数。此系统何时从儒略历切换到公历?一些国家在1601年1月1日之前转换;其他人直到很久以后才更换。这将严重影响您的计算-大约11天 因为在一秒钟内有107个100纳秒的单位,所以将开始数除以107,得到自参考时间起的秒数(余数是一秒的分数)。然后除以86400,得到天数(余数为一天中的时间)。然后你可以根据天数来计算日期
由于POSIX时间使用1970-01-01 00:00:00作为参考,您可能只需要计算1601-01-01 00:00:00和POSIX历元(众所周知)之间的正确秒数,然后从计算的秒数中减去该数。
自1601年以来的100纳秒数
它是Windows文件时间值
Boost.DateTime实际上使用Windows平台的Windows文件时间
下面是将FILETIME转换为Boost::posix_time::ptime:(来自boost/date\u time/microsec\u time\u clock.hpp)
静态时间类型创建时间(时间转换器)
{
winapi::文件时间ft;
winapi::获取系统时间作为文件时间(ft);
uint64_t micros=winapi::file_time_to_microseconds(ft);//它不会换行,因为ft是当前时间
//并且在1970年1月1日之前不能
std::time_t t=静态(微秒/1000000UL);//从纪元开始的秒数
//微秒—静态强制转换Suppress警告
升压:uint32秒=静态(微秒%1000000UL);
标准:tm货币;
std::tm*curr_ptr=转换器(&t,&curr);
日期类型d(当前日期->商标年份+1900,
当前ptr->tm mon+1,
当前ptr->tm\u mday);
//下一行将调整分数秒刻度
//当前时间系统的。例如,如果时间系统
//不支持小数秒,则res_adjust返回0
//所有的分数秒都返回0。
int adjust=static\u cast(分辨率类型::res\u adjust()/1000000);
时间\持续时间\类型td(当前ptr->tm\小时,
当前ptr->tm\u min,
当前ptr->tm秒,
子章节*调整);
返回时间_类型(d,td);
}
您可以浏览Boost安装以了解详细的实现。
自1601年以来的100纳秒数
它是Windows文件时间值
Boost.DateTime实际上使用Windows平台的Windows文件时间
下面是将FILETIME转换为Boost::posix_time::ptime:(来自boost/date\u time/microsec\u time\u clock.hpp)
静态时间类型创建时间(时间转换器)
{
winapi::文件时间ft;
winapi::获取系统时间作为文件时间(ft);
uint64_t micros=winapi::file_time_to_microseconds(ft);//它不会换行,因为ft是当前时间
//并且在1970年1月1日之前不能
std::time_t t=静态(微秒/1000000UL);//从纪元开始的秒数
//微秒—静态强制转换Suppress警告
升压:uint32秒=静态(微秒%1000000UL);
标准:tm货币;
std::tm*curr_ptr=转换器(&t,&curr);
日期类型d(当前日期->商标年份+1900,
当前ptr->tm mon+1,
当前ptr->tm\u mday);
//下一行将调整分数秒刻度
//当前时间系统的。例如,如果时间系统
//不支持小数秒,则res_adjust返回0
//所有的分数秒都返回0。
int adjust=static\u cast(分辨率类型::res\u adjust()/1000000);
时间\持续时间\类型td(当前ptr->tm\小时,
当前ptr->tm\u min,
当前ptr->tm秒,
子章节*调整);
返回时间_类型(d,td);
}
您可以浏览Boost安装以了解详细的实现。Well。。如果输入文件时间低于posix时间历元,这个例程似乎会失败。。如果输入文件时间低于posix时间历元,这个例程似乎会失败。对于这样的精度水平,这是一个非常奇怪的历元!这是一个非常奇怪的时代,因为它的准确度如此之高!这是我最初的想法,我只是想我很难弄清楚1970年到1601年之间的秒数是多少。我必须试着用一个例子来找出答案。谢谢。这是我最初的想法,我只是想我很难弄清楚1970年到1601年之间的秒数是多少。我得试着通过考试找出答案
static time_type create_time(time_converter converter)
{
winapi::file_time ft;
winapi::get_system_time_as_file_time(ft);
uint64_t micros = winapi::file_time_to_microseconds(ft); // it will not wrap, since ft is the current time
// and cannot be before 1970-Jan-01
std::time_t t = static_cast<std::time_t>(micros / 1000000UL); // seconds since epoch
// microseconds -- static casts supress warnings
boost::uint32_t sub_sec = static_cast<boost::uint32_t>(micros % 1000000UL);
std::tm curr;
std::tm* curr_ptr = converter(&t, &curr);
date_type d(curr_ptr->tm_year + 1900,
curr_ptr->tm_mon + 1,
curr_ptr->tm_mday);
//The following line will adjust the fractional second tick in terms
//of the current time system. For example, if the time system
//doesn't support fractional seconds then res_adjust returns 0
//and all the fractional seconds return 0.
int adjust = static_cast< int >(resolution_traits_type::res_adjust() / 1000000);
time_duration_type td(curr_ptr->tm_hour,
curr_ptr->tm_min,
curr_ptr->tm_sec,
sub_sec * adjust);
return time_type(d,td);
}