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_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 << 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 &lt;&lt; static_cast&lt;int&gt;(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 获取工作日编号

在 C++ 中,如何测试对象是不是是父类构造函数中子类的实例?

构造函数分配内存失败是如何冒出来的?

Objective-C中如何创建构造函数呢?

参数化构造函数和函数对象调用如何协同工作?

如何从来自api响应的json字符串构造对象列表?