Как строится объект chrono :: year? - PullRequest
0 голосов
/ 18 сентября 2018

Я только что заметил, что будет иметь chrono::year.Его конструктор принимает int в диапазоне: [- 32767, 32767] , однако мне неясно, что представляет собой этот аргумент.

  • Будет ли это соответствовать tm_year происхождение 1900 года?
  • Или, возможно, time_t происхождение 1970 года?
  • Или, может быть, это Anno Domini с нулевым происхождением?

РЕДАКТИРОВАТЬ:
Это ключ к пониманию того, что подразумевается под функцией is_leap chrono::year предложения.Без происхождения неясно, какой год представлен здесь.

1 Ответ

0 голосов
/ 18 сентября 2018

В 25.8.1 [time.cal.general]:

Типы в 25.8 описывают гражданский (григорианский) календарь и его связь с sys_days и local_days.

Формулировка этого вопроса была (является) сложной, поскольку цель состоит в том, чтобы смоделировать григорианский календарь (как это делает C ++ в настоящее время через C API), не оскорбляя тех, кто следует другим календарям.

Я такжеЯ только сейчас отмечаю, что слово "proleptic" отсутствует в спецификации и, вероятно, должно быть добавлено в стратегическом месте.

Чтобы прямо ответить на вопрос, интеграл связан с std::chrono::year является ссылкой Anno Domini, как определено папой Григорием в 1582 году, но работает как вперед, так и вперед во времени.Когда я пишу это, год составляет 2018y.

И (отвечая на комментарии Джонатана Ми ниже), эта программа:

#include <chrono>
#include <iostream>

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

Выходы:

2018

Живая демонстрация, с которой вы можете поэкспериментировать с , при условии, что реализация примера "date.h" помещает вещи в namespace date вместо namespace std::chrono.

IСледует также отметить, что это программное обеспечение позволяет написанным пользователем календарям взаимодействовать с системой std::chrono.Вот пример юлианского календаря .Есть еще пара примеров здесь .


Наконец, краткая заметка о том, почему текущий год представлен как year{2018} (Anno Domini), а неyear{48} (происхождение time_t 1970 г.) или year{118} (происхождение tm_year 1900 г.):

Эта философия истерична при использовании в фильмах.Но становится утомительным, когда используется в разработке программного обеспечения.Эта библиотека пытается сделать ожидаемое.

...