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

C++ c++;获取自01/01/0001 00:00:00以来的毫秒数,c++,time,osisoft,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>(

我需要一个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() 
auto now=std::chrono::system_clock::now();
std::无法将它们添加到PI点属性列表中。可以在设置页面上查看>或修改此配置

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

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

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

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


我还将这个问题与

没有明确的计算方法:

UTC毫秒从0001年1月1日午夜12:00:00起已过

从例子来看,他们使用的算法与我们的相同。要获得相同的结果,只需在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()
auto now=std::chrono::system_clock::now();
std::cout这很容易使用:


毫秒上的范围足够大,足以处理此计算,但
系统时钟::时间点上的范围可能不太大。因此,像上面代码中那样立即截断为
毫秒以避免溢出是很重要的。

您首先需要有一个足够大的数据类型来保存该值,不是吗?“我如何获得自0001年1月1日午夜12:00:00以来经过的毫秒数?”,我怀疑您是否希望这样。您需要从1.1.1970(例如)开始经过毫秒,然后需要API要求的该时间点的偏移量。我甚至不确定“0001年1月1日午夜12:00:00”UTC是否定义得很好,或者即使定义得很好,我们可能也不知道自1582年引入公历以来已经过去了多少毫秒。你要计算的时间间隔是从一个比我们的日历还早一千年的日期算起的。要“重建”这些日期,需要一个所谓的proleptic日历——像闰日/秒这样的东西是你最不担心的。我无法访问到您的API的链接,因为我得到了“请求的URL被拒绝了”。但是从这里到两千多年前的毫秒精度时间间隔之间的实际用途似乎值得怀疑。你确定你没有误解什么吗?下面给出了一个例子:在下面的例子中,查询是对最后更改日期的请求,该日期等于或大于2月26日22:16:50.000(这是世界时间)。在上述转换之后,此日期时间将表示为数值:63655280210000。因此,提交的查询是:
https://MyServer/piwebapi/search/query?q=changedate:[63655280210000 TO*]
这只是一个示例,如果您按说明传递日期字符串会发生什么情况。顺便说一下,我开始想知道这和C++有什么关系。这是对原始问题的回答(不是更新的),谢谢@TheShmoo如果你有一个新问题,你应该问一个新问题,而不是把原来的问题修改成不同的问题。好的,谢谢!我想这样会更好。我将再次撤销它。该策略特别要求您明确表示您正在链接到您所拥有的资源。我知道该策略,并且觉得我已经完全透明了。该链接显然可以通过我的用户名识别。我已经解决了用户的问题,并完成了演示代码。该软件是免费的,开源的。我不卖任何东西,也不要求任何东西。如果你能找出我写的链接到的资源,那么我想其他人也能。如果你仍然觉得我违反了这项政策,请随时提醒版主。这很容易被忽视;我知道,因为这在我身上发生过很多次。但我,我只是好奇,为什么你特别还原了最近的编辑,使这一点更清楚。啊,因为我的图书馆有相当多的追随者,人们通过诸如“Howard Hinnant的日期/时间图书馆”之类的术语来搜索它。此外,该库已经被C++20规范草案所接受,因此更多的人有兴趣提前了解C++20的这一部分将如何工作。从本质上说,搜索“Hinnant”会抓住这个帖子,而搜索“my”则不会。是的,这有利于自我提升。但这也是这个问题的主题,并且对较大的C++社区是有益的。补充道:“我是作者”感觉既多余又自我推销。
#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';
}
63680221359193ms