chrono::year 对象是如何构造的?
Posted
技术标签:
【中文标题】chrono::year 对象是如何构造的?【英文标题】:How is a chrono::year Object Constructed? 【发布时间】:2019-02-22 21:04:23 【问题描述】:我刚刚注意到c++20 将拥有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 公历有起源吗? 标准链接没有提到公历,只是民用日历,其中公历只是房间里的大象。这是一个有趣的措辞。 【参考方案1】:在 25.8.1 [time.cal.general]:
25.8 中的类型描述了民用(公历)日历及其与
sys_days
和local_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 << intfoo << '\n';
输出:
2018
Live demo that you can experiment with 附带条件是 "date.h" 示例实现将内容放入 namespace date
而不是 namespace std::chrono
。
我还应该注意,该软件允许用户编写日历与std::chrono
系统互操作。这是Julian calendar 的示例。还有几个例子here。
最后,简要说明为什么将当前年份表示为 year2018
(Anno Domini),而不是 year48
(time_t
的 1970 年起源) 或 year118
(@ 987654341@的1900来源):
This philosophy 在电影中使用时会歇斯底里。但是在软件设计中使用时会变得很烦人。这个库试图做预期的事情。
【讨论】:
好的,如果我这样做const auto foo = 2018y
那么这个输出会是什么? cout << static_cast<int>(foo)
是2018年,表示原点是0?还是436,说明原点在1582?
我在第一次阅读该示例时错过了#include "date.h"
,无法弄清楚这在 C++17 中是如何工作的。无论如何,在第二遍时,非常感谢您粘贴所有内容!
不客气。但是 date.h 已经作为项目网站的“现场演示”粘贴了。我刚刚修改了这个问题的副本。示例实现将在 clang、gcc 和 VS 上回到 C++11(取得不同程度的成功)。
我有一个后续问题,但我意识到我在这个问题的范围上作弊。如果您有一些见解,可以在这里帮助我:***.com/q/52394623/2642059以上是关于chrono::year 对象是如何构造的?的主要内容,如果未能解决你的问题,请参考以下文章
如何从 C++ 中的 std::chrono::year_month_day 获取工作日编号