【问题标题】:How is a chrono::year Object Constructed?chrono::year 对象是如何构造的?
【发布时间】:2019-02-22 21:04:23
【问题描述】:

我刚刚注意到 将拥有chrono::year。它的构造函数在以下范围内接受int[-32767, 32767],但是我不清楚这个参数代表什么。

  • 这是否与 tm_year 的 1900 起源一致?
  • 或者time_t 1970 年的起源?
  • 或者它在 Anno Domini 中,来源为 0?

编辑:
这是理解is_leap 函数chrono::year 提供的含义的关键。没有来源,不清楚这里代表的是哪一年。

【问题讨论】:

  • 这个标准非常无用:年代表民间历法中的一年 timsong-cpp.github.io/cppwp/time.cal.year#overview-1
  • 由于是公历时间,我假设 0 是 0,但这只是一个假设。幸运的是,还有几年的时间来整理标准中的措辞。
  • cppreference 的描述有什么不清楚的地方? "班级年代表proleptic Gregorian calendar中的一年。它的范围是[-32767, 32767]。"?
  • @JesperJuhl Proleptic 公历有起源吗?
  • 标准链接没有提到公历,只是民用日历,其中公历只是房间里的大象。这是一个有趣的措辞。

标签: c++20 c++ date time epoch chrono


【解决方案1】:

在 25.8.1 [time.cal.general]:

25.8 中的类型描述了民用(公历)日历及其与sys_dayslocal_days 的关系。

这方面的措辞(是)具有挑战性,因为其目的是在不冒犯遵循其他日历的人的情况下模拟公历(就像 C++ 目前通过 C API 一样)。

我现在还注意到规范中缺少 "proleptic" 这个词,应该将其添加到战略位置。

为了直接回答这个问题,与 std::chrono::year 相关的积分是 Anno Domini 参考,由教皇格雷戈里在 1582 年定义,但在时间上向后和向前运行。在我写这篇文章时,年份是2018y

并且(在下面回答 Jonathan Mee 的评论),这个程序:

#include <chrono>
#include <iostream>

int
main()
{
    using namespace std;
    using namespace std::chrono;
    const auto foo = 2018y;
    cout << int{foo} << '\n';
}

输出:

2018

Live demo that you can experiment with 附带条件是 "date.h" 示例实现将内容放入 namespace date 而不是 namespace std::chrono

我还应该注意,该软件允许用户编写日历与std::chrono 系统互操作。这是Julian calendar 的示例。还有几个例子here


最后,简要说明为什么将当前年份表示为 year{2018} (Anno Domini),而不是 year{48} (time_t 的 1970 年起源) 或 year{118} (@ 987654341@的1900来源):

This philosophy 在电影中使用时会歇斯底里。但是在软件设计中使用时会变得很烦人。这个库试图做预期的事情。

【讨论】:

  • 好的,如果我这样做const auto foo = 2018y 那么这个输出会是什么? cout &lt;&lt; static_cast&lt;int&gt;(foo)是2018年,表示原点是0?还是436,说明原点在1582?
  • 我在第一次阅读该示例时错过了#include "date.h",无法弄清楚这在 C++17 中是如何工作的。无论如何,在第二遍时,非常感谢您粘贴所有内容!
  • 不客气。但是 date.h 已经作为项目网站的“现场演示”粘贴了。我刚刚修改了这个问题的副本。示例实现将在 clang、gcc 和 VS 上回到 C++11(取得不同程度的成功)。
  • 我有一个后续问题,但我意识到我在这个问题的范围上作弊。如果您有一些见解,可以在这里帮助我:stackoverflow.com/q/52394623/2642059
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-22
  • 2010-12-01
  • 2021-01-02
  • 1970-01-01
  • 2016-01-13
  • 2010-09-10
  • 1970-01-01
相关资源
最近更新 更多