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);
}