chrono :: year对象如何构造?

时间:2018-09-18 19:09:09

标签: c++ date time epoch chrono

我刚刚注意到将拥有chrono::year。它的构造函数采用int,范围为 [-32767,32767] ,但是我不清楚此参数表示什么。

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

编辑:
这是理解chrono::year提供的is_leap函数的含义的关键。没有起源,目前尚不清楚是哪一年。

1 个答案:

答案 0 :(得分:6)

In 25.8.1 [time.cal.general]:

The types in 25.8 describe the civil (Gregorian) calendar and its relationship to sys_days and local_days.

The wording on this was (is) challenging as the intent is to model the Gregorian calendar (as does C++ currently via the C API) without offending those who follow other calendars.

I also am just now noting that the word "proleptic" is missing from the spec, and should probably be added in a strategic spot.

To directly answer the question, the integral associated with std::chrono::year is the Anno Domini reference, as defined by Pope Gregory in 1582, but running both backwards and forwards in time. As I write this, the year is 2018y.

And (answering Jonathan Mee's comment below), this program:

#include <chrono>
#include <iostream>

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

Outputs:

2018

Live demo that you can experiment with with the proviso that the "date.h" example implementation puts things in namespace date instead of namespace std::chrono.

I should also note that this software allows for user-written calendars to interoperate with the std::chrono system. Here is an example of the Julian calendar. There are a couple more examples here.


Finally, a brief note on the rationale as to why the current year is represented as year{2018} (Anno Domini), as opposed to year{48} (time_t's 1970 origin), or year{118} (tm_year's 1900 origin):

This philosophy is hysterical when used in movies. But gets tiresome when used in software design. This library tries to do the expected.