我需要一个特殊格式的时间戳来进行 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 文档非常奇怪
数字范围查询
前面的示例是针对字符串字段的范围查询。数值 > 也可以使用范围查询来搜索。
唯一索引为数字字段的字段是相应 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
没有明确的计算方法:
自 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 纳秒)。