Как я могу заполнить chrono::year текущим годом?

Итак, из этого вопроса я понимаю, что целое число, используемое при построении chrono::year соответствует Anno Domini происхождение 0.

Итак, мой вопрос: что, если я хочу получить текущий chrono::year. Есть ли функция для этого? Я, очевидно, могу:

const auto time = std::time(nullptr);
const auto current_date = *std::gmtime(&time);
const chrono::year foo{ current_date.tm_year + 1900 };

Но это кажется довольно запутанным процессом. Есть ли что-нибудь лучше для меня?


person Jonathan Mee    schedule 18.09.2018    source источник


Ответы (2)


Вот еще один способ:

auto now = std::chrono::system_clock::now();
std::time_t now_c = std::chrono::system_clock::to_time_t(now);
struct tm *parts = std::localtime(&now_c);
std::cout << 1900 + parts->tm_year  << std::endl;
person Gonen I    schedule 18.09.2018

person    schedule
comment
Вау, это умно. Мне нравится идея быть свободным от передачи указателей, связанных с библиотекой времени C. - person Jonathan Mee; 19.09.2018
comment
Fwiw, я проголосовал за этот ответ. Но я также хотел уточнить, что это текущий год в формате UTC. Если вы хотите, чтобы текущий год находился в определенном часовом поясе, это можно сделать с помощью chrono::zoned_time (иногда вы получите другой ответ). Код для этого, по сути, является расширенным набором кода, представленного в этом ответе. - person Howard Hinnant; 19.09.2018
comment
Какой состав позволяет year_month_day ymd = floor<days>(system_clock::now())? Я не вижу преобразования между time_point и year_mont_day. - person Jonathan Mee; 19.09.2018
comment
year_month_day имеет неявный конструктор constexpr noexcept, принимающий единственный аргумент const sys_days&. sys_days — это просто псевдоним типа для time_point<system_clock, days>. floor<days>(...) преобразует system_clock::time_point в sys_days. - person Howard Hinnant; 19.09.2018