Более элегантный способ получить текущий год в C ++ - PullRequest
0 голосов
/ 29 сентября 2019

Я довольно новичок в C ++.Мне нужно получить текущий год и сохранить его в формате int.

Я пришел к этому решению:

std::time_t result = std::time(nullptr);
std::istringstream iss(ctime(&result));

iss.ignore(20);
int year;
iss >> year;

Я считаю это решение несколько уродливым, даже если оно работает,поскольку это не кажется очень надежным и требует много шагов, чтобы сделать не очень много.

Есть ли лучший способ сделать это?

Ответы [ 2 ]

1 голос
/ 29 сентября 2019

Преобразование time_t в строку с последующим разбором строки кажется мне ненужным сложным и подверженным ошибкам.Как уже жаловалось в комментарии @ Теда , это может привести к локализации текстового вывода, что может сделать синтаксический анализ не надежным.

Вместе с std::time(), естьдоступно

  • std::localtime()

    Преобразует заданное время с эпохи как значение std :: time_t в календарное время, выраженное в местном времени.

  • std::gmtime()

    Преобразует заданное время с начала эпохи как значение std :: time_t в календарное время, выраженное в универсальном координированном времени (UTC).

Оба возвращают указатель на struct tm, который содержит среди прочего открытый член

int tm_year лет с 1900

Небольшой образец:

#include <ctime>
#include <iostream>

int main()
{
  std::time_t t = std::time(nullptr);
  std::tm *const pTInfo = std::localtime(&t);
  std::cout << "Current year: " << 1900 + pTInfo->tm_year << '\n';
}

Выход:

Current year: 2019

Живая демоверсия на coliru

1 голос
/ 29 сентября 2019

C ++ 20, вы можете использовать std::chrono для этой цели.

P0355R7 Расширение на календари и часовые пояса

...