#include "date.h"
#include <iostream>
int
main()
{
// Reduce verbosity but let you know what is in what namespace
namespace C = std::chrono;
namespace D = date;
namespace S = std;
auto tp = C::system_clock::now(); // tp is a C::system_clock::time_point
{
// Need to reach into namespace date for this streaming operator
using namespace date;
S::cout << tp << '\n';
}
auto dp = D::floor<D::days>(tp); // dp is a sys_days, which is a
// type alias for a C::time_point
auto ymd = D::year_month_day{dp};
auto time = D::make_time(C::duration_cast<C::milliseconds>(tp-dp));
S::cout << "year = " << ymd.year() << '\n';
S::cout << "month = " << ymd.month() << '\n';
S::cout << "day = " << ymd.day() << '\n';
S::cout << "hour = " << time.hours().count() << "h\n";
S::cout << "minute = " << time.minutes().count() << "min\n";
S::cout << "second = " << time.seconds().count() << "s\n";
S::cout << "millisecond = " << time.subseconds().count() << "ms\n";
}
它只是为我输出:
2015-07-10 20:10:36.023017
year = 2015
month = Jul
day = 10
hour = 20h
minute = 10min
second = 36s
millisecond = 23ms
#include <chrono>
int
main()
{
using namespace std::chrono;
auto tp = system_clock::now();
auto dp = floor<days>(tp);
year_month_day ymd{dp};
hh_mm_ss time{floor<milliseconds>(tp-dp)};
auto y = ymd.year();
auto m = ymd.month();
auto d = ymd.day();
auto h = time.hours();
auto M = time.minutes();
auto s = time.seconds();
auto ms = time.subseconds();
}
#include <chrono>
int
main()
{
using namespace std::chrono;
auto tp = zoned_time{current_zone(), system_clock::now()}.get_local_time();
auto dp = floor<days>(tp);
year_month_day ymd{dp};
hh_mm_ss time{floor<milliseconds>(tp-dp)};
auto y = ymd.year();
auto m = ymd.month();
auto d = ymd.day();
auto h = time.hours();
auto M = time.minutes();
auto s = time.seconds();
auto ms = time.subseconds();
}
2条答案
按热度按时间gjmwrych1#
您只能从
system_clock::time_point
中提取此信息。这是唯一一个与民用日历有关系的系统提供的时钟。以下是如何使用此时钟获取当前time_point:然后,您可以使用以下命令将其转换为
time_t
:使用C库,您可以将
time_t
转换为tm
,但您必须选择是否希望在UTC时区或本地时区进行转换:然后,您可以打印出tm的组件,例如:
另外
如果您愿意,您可以利用这些非保证信息:
我所知道的
system_clock
的每个实现都是基于unix time的。即自1970年新年以来的秒数,忽略闰秒。而且这个计数的精度通常比秒还要精确。下面是一个完整的程序,它提取了所有这些信息:创建一个自定义的
duration
来建模天数是很方便的:现在,您可以获得自纪元以来的时间,尽可能精确,使用:
然后截短为天数,再减去。
然后截短为小时数,再减去。
继续,直到你减去了秒。
剩下的就是一秒的分数,单位是
system_clock::duration
。因此,打印出运行时值和该值编译时单位,如图所示。对于我来说,这个程序打印出来:
我的输出表明
system_clock::duration
的精度是微秒。如果需要,可以使用以下命令将其截断为毫秒:更新
This header-only C++11/14 library封装了上述工作,将客户端工作减少到:
它只是为我输出:
其他更新
这个库发展成为C标准提案,现在在C20工作草案中。在C++20中,从
system_clock::time_point
中提取这些字段的语法是:以上假设您希望这些字段使用UTC格式。如果你喜欢他们在其他时区,这也是可能的。例如,以下是如何在计算机的当前本地时区中执行此操作:
上面唯一的区别是
tp
的构造,它现在的类型是local_time
,而不是UTC示例中的sys_time
。或者,也可以选择一个任意的时区,并进行以下小的更改:piok6c0g2#
一旦我想出了这个实现。可能不是最好的,但对我的本土项目很好。
可以从
timeinfo
获得除毫秒以外的所有信息,也可以从ms
获得毫秒。示例输出:
2021-06-25 10:18:48.295