C++ 获取自 01/01/0001 00:00:00 以来的毫秒数

The*_*moo 3 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() 
Run Code Online (Sandbox Code Playgroud)

但当然输出是 UNIX 纪元的时间间隔 Thu Jan 1 00:00:00 1970

所以对于 anow = "Wed Dec 12 13:30:00 2018"它返回1544617800000ms。

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

上下文 OSISoft API

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

数字范围查询

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

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

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

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

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

在本文档中,我提出了一个关于如何获取自 0001 年 1 月 1 日午夜 12:00:00 以来经过的毫秒数的问题。

我还将问题链接到PISquare

Ala*_*les 5

没有明确的计算方法:

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

从示例来看,他们使用与https://www.epochconverter.com/seconds-days-since-y0相同的算法。要获得相同的结果,只需在 UNIX 纪元上添加 719162 天即可:

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()
Run Code Online (Sandbox Code Playgroud)

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