Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用chrono存储毫秒的便携式方法_C++_Date_C++11_C++14_Chrono - Fatal编程技术网

C++ 使用chrono存储毫秒的便携式方法

C++ 使用chrono存储毫秒的便携式方法,c++,date,c++11,c++14,chrono,C++,Date,C++11,C++14,Chrono,我有一个代码如下- int main(){ .... auto time = std::chrono::system_clock::now().time_since_epoch() / std::chrono::milliseconds(1); .... return 0; } 变量time在这里使用typeid().name()方法以l的形式给出输出,但是如果我将auto替换为longtype,那么该变量在不同的机器上仍然会存储正确的毫秒数,这是安全的吗

我有一个代码如下-

int main(){
    ....

    auto time = std::chrono::system_clock::now().time_since_epoch() / std::chrono::milliseconds(1);

    ....
    return 0;
}
变量
time
在这里使用
typeid().name()
方法以
l
的形式给出输出,但是如果我将auto替换为
long
type,那么该变量在不同的机器上仍然会存储正确的毫秒数,这是安全的吗


我之所以需要它,是因为我无法将
auto
指定为类成员中的类型,因为它们不是constexpr或static(在可能的情况下)。我的目的是将数据发送到浏览器,在那里我可以执行
vard=newdate(time)
,并显示正确的时间。通信部分已经通过json格式解决了,我只想知道如何在不同的系统之间正确地存储它。

您的方法会起作用并且是可移植的,但我建议使用更直接的方法来计算毫秒:

std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count()
std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count()
这肯定会起作用,因为.count()返回一个std::chrono::millizes::rep,它是“一个至少45位的有符号整数类型”,应该适合long

注:不保证系统时钟具有毫秒分辨率。但在任何情况下,都会在毫秒内得到结果

旁注:我可以很好地利用
使用名称空间std::chrono
[…]如果我将auto替换为
long
type,变量在不同的机器上仍然会存储正确的毫秒数,这是否安全

不,您需要一个至少45位的有符号整数类型,不能保证它是长的。您应该使用
std::chrono::millizes::rep

using namespace std::chrono;
milliseconds::rep time = 
    duration_cast<milliseconds>(system_clock::now().time_since_epoch()).count();
使用名称空间std::chrono;
毫秒::重复时间=
持续时间(系统时钟::现在().时间自纪元()).计数();

还要注意的是,就便携性而言,
系统时钟的纪元根据标准不能保证为1970年1月1日00:00:00 UTC(即使在大多数情况下也是如此)。

两个现有答案都是好的。但是只要你在C++中,我就鼓励你让数据成员类型:

std::chrono::time_point<std::chrono::system_clock, std::chrono::milliseconds>
如果您以前决定给
time
type
std::int64\t
,或
std::chrono::millides::rep
,则上面的新行代码将编译并创建运行时错误。在时间上增加两点是没有意义的。明天+今天是荒谬的

但是,如果您以前决定按照我的建议提供
time
type
sys\u time
,则上面创建
z
的代码行不会编译。类型系统在编译时检测到逻辑错误。现在,您必须立即重新访问您的逻辑,并发现为什么要添加两个时间点。也许它只是一个o型,你想减去它们(这是逻辑的,编译,并导致
持续时间
类型
毫秒

易用性

您可以使用以下简单语法将
now()
分配给您的
time
数据成员:

using namespace std::chrono;
time_ = time_point_cast<milliseconds>(system_clock::now());
要从json中解析,您可以:

std::int64_t temp;
json_stream >> temp;
time_ = sys_time<milliseconds>{milliseconds{temp}};
std::int64\u t temp;
json_流>>温度;
时间=系统时间{毫秒{temp};

waaiit什么
根据标准,系统时钟的历元不能保证为1970年1月1日00:00:00 UTC,那么如何检查?我的意思是,这取决于编译器及其版本、操作系统或机器的体系结构吗?@hg\u git您可以从
system\u clock
使用
to\u time\t
gmtime
获得
std::tm
,并检查这是否是正确的日期,如果不是,您需要进行一些额外的计算。时代取决于系统,而不是编译器,参见维基百科[()],这是不可能的时代不同于UNIX时代,但在标准的观点,这是不能保证的。在这个时候,19701-01-01 00:00:UTC是事实上的标准(但未指定的C++标准)。我计划在不久的将来提出一个具体的建议。另请参阅有关这场险些避免的灾难的信息:是的,我是你的忠实粉丝。顺便说一句:D无论如何都会使用你的日期库。@hg\u git:Awesome,谢谢。
date::sys\u time
是在date.h中预先制作的。为什么不将变量键入decltype(std::chrono::system_clock::now())开始;OP表示希望以毫秒精度存储。您的建议将导致其他精度。
auto z = x.time_ + y.time_;
using namespace std::chrono;
time_ = time_point_cast<milliseconds>(system_clock::now());
json_stream << time_.time_since_epoch().count();
std::int64_t temp;
json_stream >> temp;
time_ = sys_time<milliseconds>{milliseconds{temp}};