c ++自01/01/0001 00:00:00起获得毫秒数

时间:2018-12-12 12:38:38

标签: c++ time osisoft

对于API调用,我需要特殊格式的时间戳:

  

日期转换为自0001年1月1日午夜12:00:00起经过的UTC毫秒。

我的第一个假设是使用:

auto now = std::chrono::system_clock::now();
std::cout << "millisceconds since epoch: "
          << std::chrono::duration_cast<std::chrono::milliseconds>(
               now.time_since_epoch()).count() 

但是当然输出是从UNIX时代开始的时间间隔 Thu Jan 1 00:00:00 1970

因此,对于now = "Wed Dec 12 13:30:00 2018",它返回1544617800000毫秒。

如何获取自0001年1月1日午夜12:00:00以来经过的毫秒数?

上下文OSISoft API

用于指定日期范围的OSISoft API文档很奇怪

  

数值范围查询

     

前面的示例是针对字符串字段的范围查询。数值>也可以通过范围查询来搜索。

     

被索引为数字字段的唯一字段是各个PI Point属性的CreationDate和ChangeDate字段。要为这些字段建立索引>将它们添加到PI Point Attributes列表中。可以在“设置”页面上查看>或修改此配置。

     

通过转换将这些日期时间值索引为数字值:将日期转换为自0001年1月1日午夜12:00:00以来经过的UTC毫秒。

     

在下面的示例查询中,请求的最后更改日期等于或大于2月26日22:16:50.000(这是世界时间)。经过上述转换后,此DateTime将表示为数值:63655280210000。因此,提交的查询为:

     

https://MyServer/piwebapi/search/query?q=changedate:[63655280210000 TO *]

从这个文献中,我问了一个有关如何获得自0001年1月1日午夜12:00:00以来经过的毫秒数的问题。

我还将问题链接到PISquare

2 个答案:

答案 0 :(得分:4)

没有确定的计算方式:

  

自0001年1月1日午夜12:00:00起,UTC毫秒经过。

从示例来看,他们使用的算法与https://www.epochconverter.com/seconds-days-since-y0相同。要获得相同的结果,您可以将719162天添加到unix时代:

auto now = std::chrono::system_clock::now();
std::cout << "millisceconds since epoch: "
          << std::chrono::duration_cast<std::chrono::milliseconds>(
               now.time_since_epoch() + std::chrono::hours(24 * 719162)).count()

请注意,c ++ 20引入了std::chrono::days,您可以使用它代替24小时。 根据系统时钟的分辨率,您可能需要在添加偏移量之前将其强制转换为毫秒,以免发生溢出(719162天大于2 ^ 64纳秒)。

答案 1 :(得分:0)

使用Howard Hinnant's date/time library很容易:

#include "date/date.h"
#include <iostream>

std::chrono::milliseconds
convert(std::chrono::system_clock::time_point tp)
{
    using namespace date;
    using namespace std::chrono;
    return (floor<milliseconds>(tp) + 
            (sys_days{1970_y/January/1} - sys_days{1_y/January/1})).time_since_epoch();
}

int
main()
{
    using namespace date;
    using namespace std::chrono;
    std::cout << convert(system_clock::now()) << '\n';
}

convert只需将两个历元之间的差添加到system_clock::time_point,将其截断为milliseconds精度,然后提取duration并将其返回为milliseconds

这个程序对我来说只是输出:

63680221359193ms

milliseconds上的范围足够大,可以处理此计算,但system_clock::time_point上的范围可能不足够。因此,请务必像上面的代码一样立即截断为milliseconds,以避免溢出。