如何从std::chrono::time_point
对象中提取年,月,日,小时,分钟,秒和毫秒?
我只看到了如何提取例如总量的例子。来自duration
的秒数。
答案 0 :(得分:57)
您只能从system_clock::time_point
中提取此信息。这是唯一一个与民用日历有关系的系统提供的时钟。以下是使用此时钟获取当前time_point的方法:
system_clock::time_point now = system_clock::now();
然后,您可以使用以下内容将其转换为time_t
time_t tt = system_clock::to_time_t(now);
使用C库,您可以将time_t
转换为tm
,但您必须选择是要在UTC时区或本地时区进行转换:
tm utc_tm = *gmtime(&tt);
tm local_tm = *localtime(&tt);
然后你可以打印出tm的组件,例如:
std::cout << local_tm.tm_year + 1900 << '\n';
std::cout << local_tm.tm_mon + 1 << '\n';
std::cout << local_tm.tm_mday << '\n';
<强>另外强>
如果您愿意,可以利用这些无保证的信息:
我所知道的system_clock
的每个实施都基于unix time。即自1970年UTC新世纪以来的秒数,忽略了闰秒。而且这个计数的精度通常比秒更精细。这是一个完整的程序,它提取所有这些信息:
#include <chrono>
#include <ctime>
#include <iostream>
int
main()
{
using namespace std;
using namespace std::chrono;
typedef duration<int, ratio_multiply<hours::period, ratio<24> >::type> days;
system_clock::time_point now = system_clock::now();
system_clock::duration tp = now.time_since_epoch();
days d = duration_cast<days>(tp);
tp -= d;
hours h = duration_cast<hours>(tp);
tp -= h;
minutes m = duration_cast<minutes>(tp);
tp -= m;
seconds s = duration_cast<seconds>(tp);
tp -= s;
std::cout << d.count() << "d " << h.count() << ':'
<< m.count() << ':' << s.count();
std::cout << " " << tp.count() << "["
<< system_clock::duration::period::num << '/'
<< system_clock::duration::period::den << "]\n";
time_t tt = system_clock::to_time_t(now);
tm utc_tm = *gmtime(&tt);
tm local_tm = *localtime(&tt);
std::cout << utc_tm.tm_year + 1900 << '-';
std::cout << utc_tm.tm_mon + 1 << '-';
std::cout << utc_tm.tm_mday << ' ';
std::cout << utc_tm.tm_hour << ':';
std::cout << utc_tm.tm_min << ':';
std::cout << utc_tm.tm_sec << '\n';
}
创建自定义duration
以模拟日期非常方便:
typedef duration<int, ratio_multiply<hours::period, ratio<24> >::type> days;
现在,您可以获得自纪元以来的时间,以及可以管理的精确度:
system_clock::duration tp = now.time_since_epoch();
然后将其截断为几天,并将其减去。
然后将其截断为几小时,然后将其减去。
继续,直到你减去秒数。
您剩下的是以system_clock::duration
为单位的秒数。因此,打印出该运行时值和该值的编译时间单位,如图所示。
对我来说,这个节目打印出来:
15806d 20:31:14 598155[1/1000000]
2013-4-11 20:31:14
我的输出表明system_clock::duration
精度是微秒。如果需要,可以使用以下命令将其截断为毫秒:
milliseconds ms = duration_cast<milliseconds>(tp);
<强>更新强>
This header-only C++11/14 library封装了上述工作,将客户工作减少到:
#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
答案 1 :(得分:0)
一旦我想出了这个实现。可能不是最好的,但适用于我的本土项目。
可以获取除 timeinfo
中的毫秒数和 ms
中的毫秒数以外的所有内容。
static std::wstring GetDateTime()
{
time_t rawtime;
struct tm timeinfo;
wchar_t buffer[20];
time(&rawtime);
localtime_s(&timeinfo, &rawtime);
auto now = std::chrono::system_clock::now();
auto tt = std::chrono::system_clock::to_time_t(now);
auto nowTruncated = std::chrono::system_clock::from_time_t(tt);
auto ms = (now - nowTruncated).count();
wcsftime(buffer, 20, L"%Y-%m-%d %H:%M:%S", &timeinfo);
return std::wstring(buffer) + L"." + std::to_wstring(ms).substr(0, 3);
}
示例输出:
<块引用>2021-06-25 10:18:48.295