Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.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++ 对C+的限制+;时空图书馆?_C++_Datetime_Chrono - Fatal编程技术网

C++ 对C+的限制+;时空图书馆?

C++ 对C+的限制+;时空图书馆?,c++,datetime,chrono,C++,Datetime,Chrono,我从一个更大的项目中提取了以下简单代码。我试图通过提取日、月、年,逐日模拟期货日期。 我正在使用std::chrono库。经过一段时间(在我的电脑上大约8835天),日期出错。 我曾尝试: 玩g++优化标志 与valgrind一起发布 正在查找有关限制的chrono文档 你能重现这种行为吗? // COMPILE OK && RUN KO (wandbox) // g++ prog.cc -O2 -march=native -std=c++11 // COMPILE OK

我从一个更大的项目中提取了以下简单代码。我试图通过提取日、月、年,逐日模拟期货日期。 我正在使用std::chrono库。经过一段时间(在我的电脑上大约8835天),日期出错。 我曾尝试:

  • 玩g++优化标志
  • 与valgrind一起发布
  • 正在查找有关限制的chrono文档
你能重现这种行为吗?

// COMPILE OK && RUN KO (wandbox)
// g++ prog.cc -O2 -march=native -std=c++11

// COMPILE OK && RUN OK (wandbox)
// clang++ prog.cc -Wall -Wextra -std=c++11

#include <iostream>
#include <chrono>

using namespace std;

int main(int ac, char* av[])
{
  (void) ac; (void) av;
  auto faketime = chrono::system_clock::now();

  for( int i=0; i<100000; ++i) {
    // doDaily();
    faketime += chrono::hours(24);
    time_t ftime = chrono::system_clock::to_time_t(faketime);
    if( i% 1000 == 0)
         cout << "faketime (" << ftime << ") is : " << ctime(&ftime) << endl;
  } 
  auto currtime = chrono::system_clock::now();
  time_t cutime = chrono::system_clock::to_time_t(currtime);
  cout << "currtime is : " << ctime(&cutime);
  return 0;
} 
编辑:

  • 加上哪里出了问题
  • 我已经在上测试了这段代码:我可以用GCC11重现这个问题,但它可以用clang正常工作++
  • 似乎存在一个限制,但仅使用g++编译
您在
系统时钟::时间点
中遇到溢出

系统时钟::时间点的精度因平台而异:

  • gcc:纳秒
  • 窗口:1/10微秒
  • 铿锵/libc++:微秒
但在所有三种平台上的表示都是相同的:有符号64位整数。这些都是一致的

64个符号位的纳秒可以让你获得大约+/-292年的时间范围。对于系统时钟,该范围以1970-01-01为中心。因此,2262年的溢流是正常的

如果需要更大的射程,可以降低精度。例如:

auto faketime = chrono::time_point_cast<chrono::microseconds>(chrono::system_clock::now());
auto-faketime=chrono::time\u point\u cast(chrono::system\u clock::now());
可以使用
时间点
静态成员函数
min()
max()
以编程方式检查
时间点的限制

更新
微秒范围约为+/-292000年。我不确定ctime上的范围是多少,但如果它可以格式化过去/未来那么远的日期,我会感到惊讶。

您在
系统时钟::时间点中遇到溢出

系统时钟::时间点的精度因平台而异:

  • gcc:纳秒
  • 窗口:1/10微秒
  • 铿锵/libc++:微秒
但在所有三种平台上的表示都是相同的:有符号64位整数。这些都是一致的

64个符号位的纳秒可以让你获得大约+/-292年的时间范围。对于系统时钟,该范围以1970-01-01为中心。因此,2262年的溢流是正常的

如果需要更大的射程,可以降低精度。例如:

auto faketime = chrono::time_point_cast<chrono::microseconds>(chrono::system_clock::now());
auto-faketime=chrono::time\u point\u cast(chrono::system\u clock::now());
可以使用
时间点
静态成员函数
min()
max()
以编程方式检查
时间点的限制

更新
微秒范围约为+/-292000年。我不确定ctime上的范围是多少,但如果它能在过去/将来格式化那么远的日期,我会感到惊讶。

输出有什么问题?我想是一年,但可能更清晰。时间是整数秒。请注意,您有两个要检查的限制:计时和ctime/time。您是否尝试过打印
时间的整数值?您是否尝试过使用C++20而不是首先转换为
time\t
?显示的日期与32位UNIX epoch溢出不符,因此转换值得仔细检查是否有丢失。各位好,谢谢你们的回答。好吧,我想这就是我下一步调查的开始:这正是我现在面临的问题。它没有解释为什么clang++能够处理这个bug…输出有什么问题?我想是一年,但可能更清晰。时间是整数秒。请注意,您有两个要检查的限制:计时和ctime/time。您是否尝试过打印
时间的整数值?您是否尝试过使用C++20而不是首先转换为
time\t
?显示的日期与32位UNIX epoch溢出不符,因此转换值得仔细检查是否有丢失。各位好,谢谢你们的回答。好吧,我想这就是我下一步调查的开始:这正是我现在面临的问题。它没有解释为什么clang++能够处理这个bug。。。