5#ifndef PICOSCENES_PLATFORM_TIMETOOLS_HXX
6#define PICOSCENES_PLATFORM_TIMETOOLS_HXX
13#define DATEFORMAT "%F %T"
15using namespace std::chrono_literals;
21std::ostream &
operator<<(std::ostream &os,
const std::chrono::system_clock::time_point &t);
23std::ostream &
operator<<(std::ostream &os,
const timespec &ts);
25std::ostream &
operator<<(std::ostream &os,
const timeval &tv);
29 template<
typename TimeUnit = std::chrono::seconds>
31 return std::chrono::time_point_cast<TimeUnit>(std::chrono::seconds(time));
34 template<
typename TimeUnit>
36 auto sec_dur = std::chrono::duration_cast<std::chrono::seconds>(duration);
37 return sec_dur.count();
40 template<
typename TimeUnit = std::chrono::nanoseconds,
typename Rep =
typename TimeUnit::rep,
typename Period =
typename TimeUnit::period>
42 auto duration = std::chrono::seconds{ts.tv_sec} + std::chrono::nanoseconds{ts.tv_nsec};
43 return std::chrono::duration_cast<TimeUnit>(duration);
46 template<
typename Rep,
typename Period>
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);
52 .tv_sec = sec_dur.count(),
53 .tv_nsec = remain_nano_dur.count(),
57 template<
typename TimeUnit = std::chrono::microseconds>
59 auto duration = std::chrono::seconds{tv.tv_sec} + std::chrono::microseconds{tv.tv_usec};
60 return std::chrono::duration_cast<TimeUnit>(duration);
63 template<
typename TimeUnit>
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);
69 .tv_sec = sec_dur.count(),
70 .tv_usec = remain_micro_dur.count(),
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)));
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();
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)));
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)));
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);
100 .tv_sec = sec_tp.time_since_epoch().count(),
101 .tv_nsec = nano_dur.count(),
105 template<
typename Duration>
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);
110 .tv_sec = sec_tp.time_since_epoch().count(),
111 .tv_usec = micro_dur.count(),
115 static timespec time_t2Timespec(
const time_t time) {
122 static time_t timespec2Time_t(
const timespec &ts) {
126 static timeval time_t2timeval(time_t time) {
133 static time_t timeval2Time_t(
const timeval &tv) {
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());
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());
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());
157 template<
typename Duration>
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);
164 template<
typename TimeUnit>
167 return time_t2String(time_t, format);
170 static time_t string2time_t(
const std::string &timeString,
const std::string &timeStringFormat =
DATEFORMAT) {
172 strptime(timeString.c_str(), timeStringFormat.c_str(), &tm);
173 auto time = timelocal(&tm);
177 static struct timespec string2Timespec(const std::string &timeString, const std::string &timeStringFormat =
DATEFORMAT) {
178 return time_t2Timespec(string2time_t(timeString, timeStringFormat));
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);
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);