PicoScenes API Docs
 
Loading...
Searching...
No Matches
TimeTools.hxx
Go to the documentation of this file.
1//
2// Created by Zhiping Jiang on 3/4/21.
3//
4
5#ifndef PICOSCENES_PLATFORM_TIMETOOLS_HXX
6#define PICOSCENES_PLATFORM_TIMETOOLS_HXX
7
8#include <iomanip>
9#include <chrono>
10#include <thread>
11#include "BoostHeaders.hxx"
12
13#define DATEFORMAT "%F %T"
14
15using namespace std::chrono_literals;
16
17typedef std::chrono::time_point<std::chrono::system_clock, std::chrono::milliseconds> TimePoint_System_Millisecond;
18typedef std::chrono::time_point<std::chrono::system_clock, std::chrono::milliseconds> TimePoint_System_Microsecond;
19typedef std::chrono::time_point<std::chrono::system_clock, std::chrono::milliseconds> TimePoint_System_Second;
20
21std::ostream &operator<<(std::ostream &os, const std::chrono::system_clock::time_point &t);
22
23std::ostream &operator<<(std::ostream &os, const timespec &ts);
24
25std::ostream &operator<<(std::ostream &os, const timeval &tv);
26
28
29 template<typename TimeUnit = std::chrono::seconds>
30 std::chrono::duration<TimeUnit> time_t2Duration(const time_t time) {
31 return std::chrono::time_point_cast<TimeUnit>(std::chrono::seconds(time));
32 }
33
34 template<typename TimeUnit>
35 time_t duration2Time_t(const std::chrono::duration<TimeUnit> &duration) {
36 auto sec_dur = std::chrono::duration_cast<std::chrono::seconds>(duration);
37 return sec_dur.count();
38 }
39
40 template<typename TimeUnit = std::chrono::nanoseconds, typename Rep = typename TimeUnit::rep, typename Period = typename TimeUnit::period>
41 std::chrono::duration<Rep, Period> timespec2Duration(const timespec &ts) {
42 auto duration = std::chrono::seconds{ts.tv_sec} + std::chrono::nanoseconds{ts.tv_nsec};
43 return std::chrono::duration_cast<TimeUnit>(duration);
44 }
45
46 template<typename Rep, typename Period>
47 struct timespec duration2Timespec(const std::chrono::duration<Rep, Period> &dur) {
48 auto sec_dur = std::chrono::duration_cast<std::chrono::seconds>(dur);
49 auto remain_dur = dur - sec_dur;
50 auto remain_nano_dur = std::chrono::duration_cast<std::chrono::nanoseconds>(remain_dur);
51 return timespec{
52 .tv_sec = sec_dur.count(),
53 .tv_nsec = remain_nano_dur.count(),
54 };
55 }
56
57 template<typename TimeUnit = std::chrono::microseconds>
58 std::chrono::duration<TimeUnit> timeval2Duration(const timeval &tv) {
59 auto duration = std::chrono::seconds{tv.tv_sec} + std::chrono::microseconds{tv.tv_usec};
60 return std::chrono::duration_cast<TimeUnit>(duration);
61 }
62
63 template<typename TimeUnit>
64 struct timeval duration2Timeval(const std::chrono::duration<TimeUnit> &dur) {
65 auto sec_dur = std::chrono::duration_cast<std::chrono::seconds>(dur);
66 auto remain_dur = dur - sec_dur;
67 auto remain_micro_dur = std::chrono::duration_cast<std::chrono::microseconds>(remain_dur);
68 return timeval{
69 .tv_sec = sec_dur.count(),
70 .tv_usec = remain_micro_dur.count(),
71 };
72 }
73
74 template<typename Duration = std::chrono::seconds>
75 std::chrono::time_point<std::chrono::system_clock, Duration> time_t2TimePoint(const time_t time) {
76 return std::chrono::time_point_cast<Duration>(std::chrono::time_point<std::chrono::system_clock, std::chrono::seconds>(std::chrono::seconds(time)));
77 }
78
79 template<typename Duration>
80 time_t time_point2Time_t(const std::chrono::time_point<std::chrono::system_clock, Duration> &tp) {
81 auto sec_tp = std::chrono::time_point_cast<std::chrono::seconds, std::chrono::system_clock, Duration>(tp);
82 return sec_tp.time_since_epoch().count();
83 }
84
85 template<typename Duration = std::chrono::nanoseconds>
86 std::chrono::time_point<std::chrono::system_clock, Duration> timespec2TimePoint(const timespec &ts) {
87 return std::chrono::time_point<std::chrono::system_clock, Duration>(std::chrono::duration_cast<Duration>(timespec2Duration<Duration>(ts)));
88 }
89
90 template<typename Duration = std::chrono::microseconds>
91 std::chrono::time_point<std::chrono::system_clock, Duration> timeval2TimePoint(const timeval &tv) {
92 return std::chrono::time_point<std::chrono::system_clock, Duration>(std::chrono::duration_cast<Duration>(timeval2Duration<Duration>(tv)));
93 }
94
95 template<typename Duration>
96 timespec time_point2Timespec(const std::chrono::time_point<std::chrono::system_clock, Duration> &tp) {
97 auto sec_tp = std::chrono::time_point_cast<std::chrono::seconds>(tp);
98 auto nano_dur = std::chrono::duration_cast<std::chrono::nanoseconds>(tp - sec_tp);
99 return timespec{
100 .tv_sec = sec_tp.time_since_epoch().count(),
101 .tv_nsec = nano_dur.count(),
102 };
103 }
104
105 template<typename Duration>
106 timeval time_point2Timeval(const std::chrono::time_point<std::chrono::system_clock, Duration> &tp) {
107 auto sec_tp = std::chrono::time_point_cast<std::chrono::seconds>(tp);
108 auto micro_dur = std::chrono::duration_cast<std::chrono::microseconds>(tp - sec_tp);
109 return timeval{
110 .tv_sec = sec_tp.time_since_epoch().count(),
111 .tv_usec = micro_dur.count(),
112 };
113 }
114
115 static timespec time_t2Timespec(const time_t time) {
116 return timespec{
117 .tv_sec = time,
118 .tv_nsec = 0,
119 };
120 }
121
122 static time_t timespec2Time_t(const timespec &ts) {
123 return ts.tv_sec;
124 }
125
126 static timeval time_t2timeval(time_t time) {
127 return timeval{
128 .tv_sec = time,
129 .tv_usec = 0,
130 };
131 }
132
133 static time_t timeval2Time_t(const timeval &tv) {
134 return tv.tv_sec;
135 }
136
137 static std::string time_t2String(const time_t time, const std::string &format = DATEFORMAT) {
138 std::stringstream ss;
139 ss << std::put_time(std::localtime(&time), format.c_str());
140 return ss.str();
141 }
142
143 static std::string timespec2String(const timespec &ts, const std::string &format = DATEFORMAT) {
144 std::stringstream ss;
145 time_t time = timespec2Time_t(ts);
146 ss << std::put_time(std::localtime(&time), format.c_str());
147 return ss.str();
148 }
149
150 static std::string timeval2String(const timeval &tv, const std::string &format = DATEFORMAT) {
151 std::stringstream ss;
152 time_t time = timeval2Time_t(tv);
153 ss << std::put_time(std::localtime(&time), format.c_str());
154 return ss.str();
155 }
156
157 template<typename Duration>
158 std::string time_point2String(const std::chrono::time_point<std::chrono::system_clock, Duration> &tp, const std::string &format = DATEFORMAT) {
159 auto sec_tp = std::chrono::time_point_cast<std::chrono::seconds>(tp);
160 auto timet = std::chrono::system_clock::to_time_t(sec_tp);
161 return time_t2String(timet, format);
162 }
163
164 template<typename TimeUnit>
165 std::string duration2String(const std::chrono::duration<TimeUnit> &duration, const std::string &format = DATEFORMAT) {
166 auto time_t = duration2Time_t(duration);
167 return time_t2String(time_t, format);
168 }
169
170 static time_t string2time_t(const std::string &timeString, const std::string &timeStringFormat = DATEFORMAT) {
171 std::tm tm = {};
172 strptime(timeString.c_str(), timeStringFormat.c_str(), &tm);
173 auto time = timelocal(&tm);
174 return time;
175 }
176
177 static struct timespec string2Timespec(const std::string &timeString, const std::string &timeStringFormat = DATEFORMAT) {
178 return time_t2Timespec(string2time_t(timeString, timeStringFormat));
179 }
180
181 template<typename Duration = std::chrono::seconds>
182 std::chrono::time_point<std::chrono::system_clock, Duration> string2time_point(const std::string &timeString, const std::string &timeStringFormat = DATEFORMAT) {
183 auto time_t = string2time_t(timeString, timeStringFormat);
184 return time_t2TimePoint<Duration>(time_t);
185 }
186
187 template<typename TimeUnit = std::chrono::seconds>
188 static std::chrono::duration<TimeUnit> string2Duration(const std::string &timeString, const std::string &timeStringFormat = DATEFORMAT) {
189 auto time_t = string2time_t(timeString, timeStringFormat);
190 return time_t2Duration<TimeUnit>(time_t);
191 }
192
193 int32_t delay_periodic(int32_t delay_us);
194}
195
196#endif //PICOSCENES_PLATFORM_TIMETOOLS_HXX
std::chrono::time_point< std::chrono::system_clock, std::chrono::milliseconds > TimePoint_System_Millisecond
Definition TimeTools.hxx:17
#define DATEFORMAT
Definition TimeTools.hxx:13
std::chrono::time_point< std::chrono::system_clock, std::chrono::milliseconds > TimePoint_System_Second
Definition TimeTools.hxx:19
std::ostream & operator<<(std::ostream &os, const std::chrono::system_clock::time_point &t)
std::chrono::time_point< std::chrono::system_clock, std::chrono::milliseconds > TimePoint_System_Microsecond
Definition TimeTools.hxx:18
timeval time_point2Timeval(const std::chrono::time_point< std::chrono::system_clock, Duration > &tp)
struct timeval duration2Timeval(const std::chrono::duration< TimeUnit > &dur)
Definition TimeTools.hxx:64
struct timespec duration2Timespec(const std::chrono::duration< Rep, Period > &dur)
Definition TimeTools.hxx:47
std::string time_point2String(const std::chrono::time_point< std::chrono::system_clock, Duration > &tp, const std::string &format=DATEFORMAT)
time_t duration2Time_t(const std::chrono::duration< TimeUnit > &duration)
Definition TimeTools.hxx:35
std::chrono::time_point< std::chrono::system_clock, Duration > time_t2TimePoint(const time_t time)
Definition TimeTools.hxx:75
std::chrono::duration< TimeUnit > timeval2Duration(const timeval &tv)
Definition TimeTools.hxx:58
std::chrono::time_point< std::chrono::system_clock, Duration > timeval2TimePoint(const timeval &tv)
Definition TimeTools.hxx:91
std::chrono::duration< Rep, Period > timespec2Duration(const timespec &ts)
Definition TimeTools.hxx:41
std::chrono::time_point< std::chrono::system_clock, Duration > string2time_point(const std::string &timeString, const std::string &timeStringFormat=DATEFORMAT)
int32_t delay_periodic(int32_t delay_us)
timespec time_point2Timespec(const std::chrono::time_point< std::chrono::system_clock, Duration > &tp)
Definition TimeTools.hxx:96
time_t time_point2Time_t(const std::chrono::time_point< std::chrono::system_clock, Duration > &tp)
Definition TimeTools.hxx:80
std::string duration2String(const std::chrono::duration< TimeUnit > &duration, const std::string &format=DATEFORMAT)
std::chrono::time_point< std::chrono::system_clock, Duration > timespec2TimePoint(const timespec &ts)
Definition TimeTools.hxx:86
std::chrono::duration< TimeUnit > time_t2Duration(const time_t time)
Definition TimeTools.hxx:30