2

我需要一个特殊格式的时间戳来进行 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

所以对于 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(这是世界时)的请求。这个DateTime,经过上述转换后,将表示为数值:63655280210000。因此提交的查询为:

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

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

我还将问题链接到PISquare

4

2 回答 2

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 纳秒)。

于 2018-12-12T13:09:01.457 回答
-1

这很容易使用Howard Hinnant 的日期/时间库

#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像上面的代码中所做的那样立即截断以避免溢出是很重要的。

于 2018-12-12T14:29:00.677 回答