对于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文档很奇怪
数值范围查询
前面的示例是针对字符串字段的范围查询。数值>也可以通过范围查询来搜索。
被索引为数字字段的唯一字段是各个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
答案 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
,以避免溢出。