我快速阅读了有关新 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)
#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。
对于查找当地时间的简单情况,两种技术具有相同的行为和性能,因此归结为选择首选方法的可读性问题。
| 归档时间: |
|
| 查看次数: |
1918 次 |
| 最近记录: |