1 using XTimePoint = std::chrono::time_point<std::chrono::system_clock>;
2 using XTimeSpan = std::chrono::seconds;
3
4 class XDataTime {
5 public:
6 XDataTime() = default;
7 XDataTime(const XTimePoint& time)
8 : m_TimePoint(time)
9 {
10 }
11 ~XDataTime() = default;
12
13 XDataTime operator+(const XTimeSpan tt) const { return { m_TimePoint + tt }; }
14 XTimeSpan operator-(const XDataTime dt) const { return { std::chrono::duration_cast<std::chrono::seconds>(m_TimePoint - dt.m_TimePoint) }; }
15
16 tm toTm() const
17 {
18 const time_t tt = std::chrono::system_clock::to_time_t(m_TimePoint);
19 return *localtime(&tt);
20 }
21
22 char* toString(const char* format = nullptr) const
23 {
24 if(format == nullptr) {
25 static char retStr[20];
26
27 if(sprintf(retStr, "%d-%d%d-%d%d %d%d:%d%d:%d%d.%d", year(), month() / 10, month() % 10, day() / 10, day() % 10, hour() / 10, hour() % 10, minute() / 10, minute() % 10, second() / 10,
28 second() % 10, millisecond())
29 < 0)
30 return nullptr;
31 return retStr;
32 }
33 return nullptr;
34 }
35
36 /// 当前时间.
37 static XDataTime now() { return { std::chrono::system_clock::now() }; }
38 /// 四位数年份
39 int year() const { return toTm().tm_year + 1900; }
40 /// 两位数月份[1,12]
41 int month() const { return toTm().tm_mon + 1; }
42 /// 两位数日期[1,28/29/30/31]
43 int day() const { return toTm().tm_mday; }
44 /// 星期[1,7]
45 int weekday() const { return toTm().tm_wday; }
46 /// 小时[0, 23]
47 int hour() const { return toTm().tm_hour; }
48 /// 分钟[0, 59]
49 int minute() const { return toTm().tm_min; }
50 /// 秒[0, 59]
51 int second() const { return toTm().tm_sec; }
52 /// 毫秒[0,999]
53 int millisecond() const { return static_cast<int>(floor(nanoSecond() / pow(10, 6))); }
54 /// 纳秒[0, 999999999]
55 int nanoSecond() const { return static_cast<int>(count() % std::nano::den); }
56 /// 自1970-01-01 00:00:00起的纳秒数
57 int64_t count() const { return m_TimePoint.time_since_epoch().count(); }
58
59 private:
60 XTimePoint m_TimePoint{};
61 };