在 C++ 中获取当前年份的更优雅的方式

Jon*_*rio 2 c++ time std stream

我对 C++ 还很陌生。我需要获取当前年份并将其存储在 int 中。

我已经找到了这个解决方案:

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

iss.ignore(20);
int year;
iss >> year;
Run Code Online (Sandbox Code Playgroud)

我发现这个解决方案有点难看,即使它有效,因为它看起来不太健壮,而且需要很多步骤才能完成很多工作。

有更好的方法吗?

yum*_*odo 11

C++20,你可以用于std::chrono这样的目的。

P0355R7 扩展到日历和时区

#include <iostream>
#include <format>
#include <chrono>
int main()
{
    const auto now = std::chrono::system_clock::now();
    std::cout << std::format("{:%Y}", now); // => 2021
}
Run Code Online (Sandbox Code Playgroud)

  • 可以在这个答案中添加代码片段吗? (2认同)

Sch*_*eff 6

在我看来,随后使用字符串解析将其转换time_t为字符串似乎不必要的复杂且容易出错。正如@Ted 的评论中已经抱怨的那样,这可能会引入文本输出的本地化,这可能会使解析不稳健。

与 一起std::time(),有可用的

  • std::localtime()

    将自纪元以来的给定时间作为 std::time_t 值转换为以本地时间表示的日历时间。

  • std::gmtime()

    将自纪元以来的给定时间作为 std::time_t 值转换为日历时间,以协调世界时 (UTC) 表示。

两者都返回一个指向 a 的指针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';
}
Run Code Online (Sandbox Code Playgroud)

输出:

Current year: 2019
Run Code Online (Sandbox Code Playgroud)

Live Demo on coliru