C++20 天的当前时间和日期

Cha*_*eon 5 c++ c++20

我快速阅读了有关新 chrono 类的 C++ 参考资料,但发现它们有点复杂。

那么,问题是,如何用C++20重写这段代码,来获取年、月、日、时、分、秒?

有什么变化吗?我问这个问题是因为std::localtime:它是线程不安全的。tm将在下次调用后被销毁std::localtime

std::time_t t = std::time(nullptr);
std::tm *tm = std::localtime(&t);
int year = tm->tm_year + 1900;
int month = tm->tm_mon + 1;
int day = tm->tm_mday;
int hour = tm->tm_hour;
int minute = tm->tm_min;
int second = tm->tm_sec;
Run Code Online (Sandbox Code Playgroud)

How*_*ant 8

#include <chrono>

int
main()
{
    using namespace std::chrono;

    // Get a local time_point with system_clock::duration precision
    auto now = zoned_time{current_zone(), system_clock::now()}.get_local_time();

    // Get a local time_point with days precision
    auto ld = floor<days>(now);

    // Convert local days-precision time_point to a local {y, m, d} calendar
    year_month_day ymd{ld};

    // Split time since local midnight into {h, m, s, subseconds}
    hh_mm_ss hms{now - ld};

    // This part not recommended.  Stay within the chrono type system.
    int year{ymd.year()};
    int month = unsigned{ymd.month()};
    int day = unsigned{ymd.day()};
    int hour = hms.hours().count();
    int minute = hms.minutes().count();
    int second = hms.seconds().count();
}
Run Code Online (Sandbox Code Playgroud)

我试图用注释来解释每行代码的作用。如果有任何不清楚的地方,我很乐意进一步详细说明。

这都是线程安全的。

更多信息:

另一种也许更简洁的计算方法now是:

auto now = current_zone()->to_local(system_clock::now());
Run Code Online (Sandbox Code Playgroud)

这会产生完全相同的类型和值now

zoned_time在上面使用它是因为它(通常)是比直接调用 a 的成员函数更高级别的抽象time_zone。在这两个示例中, 的类型now都是简单的std::chrono::time_point,它的偏移量是与该时间点system_clock::time_point关联的 UTC 偏移量。time_zone

相比之下,zoned_time它携带了更多的信息。例如,它知道:

  • 的名称time_zone
  • time_zone此时的缩写。
  • time_zone此时的UTC 偏移量,随后可以产生本地时间和 UTC 等效时间。
  • 偏移量/缩写对的有效范围。

因此,azoned_time对于格式化等作业更加灵活,因为它可以显示缩写和/或 UTC 偏移量。并且还可以更轻松地使用 azoned_time来查找其他时区的等效时间。

然而,所有这些额外信息实际上并没有在这个简单的示例中使用,因此我公开了直接调用to_local()成员函数的替代方法time_zone

对于查找当地时间的简单情况,两种技术具有相同的行为和性能,因此归结为选择首选方法的可读性问题。