1 // Author: Derek Barnett
2 
3 #ifndef TIMEUTILS_H
4 #define TIMEUTILS_H
5 
6 #include <cassert>
7 #include <chrono>
8 #include <ctime>
9 #include <stdexcept>
10 #include <string>
11 
12 namespace PacBio {
13 namespace BAM {
14 namespace internal {
15 
ToIso8601(const std::chrono::system_clock::time_point & tp)16 inline std::string ToIso8601(const std::chrono::system_clock::time_point& tp)
17 {
18     // get time info
19     const time_t ttime_t = std::chrono::system_clock::to_time_t(tp);
20     const std::chrono::system_clock::time_point tp_sec =
21         std::chrono::system_clock::from_time_t(ttime_t);
22     const std::chrono::milliseconds ms =
23         std::chrono::duration_cast<std::chrono::milliseconds>(tp - tp_sec);
24     const std::tm* ttm =
25         gmtime(&ttime_t);  // static obj, no free needed (may not be thread-safe though)
26 
27     // format output
28     constexpr static const char date_time_format[] = "%FT%T";
29     char date_time_str[50];
30     strftime(date_time_str, sizeof(date_time_str), date_time_format, ttm);
31     std::string result(date_time_str);
32     if (ms.count() > 0) {
33         result.append(".");
34         result.append(std::to_string(ms.count()));
35     }
36     result.append("Z");
37     return result;
38 }
39 
ToDataSetFormat(const std::chrono::system_clock::time_point & tp)40 inline std::string ToDataSetFormat(const std::chrono::system_clock::time_point& tp)
41 {
42     // get time info
43     const time_t ttime_t = std::chrono::system_clock::to_time_t(tp);
44     const std::chrono::system_clock::time_point tp_sec =
45         std::chrono::system_clock::from_time_t(ttime_t);
46     const std::chrono::milliseconds ms =
47         std::chrono::duration_cast<std::chrono::milliseconds>(tp - tp_sec);
48     const std::tm* ttm =
49         gmtime(&ttime_t);  // static obj, no free needed (may not be thread-safe though)
50 
51     // format output
52     constexpr static const char date_time_format[] = "%y%m%d_%H%M%S";
53     char date_time_str[50];
54     strftime(date_time_str, sizeof(date_time_str), date_time_format, ttm);
55     std::string result(date_time_str);
56     if (ms.count() > 0) result.append(std::to_string(ms.count()));
57     return result;
58 }
59 
CurrentTime()60 inline std::chrono::system_clock::time_point CurrentTime()
61 {
62     return std::chrono::system_clock::now();
63 }
64 
65 }  // namespace PacBio
66 }  // namespace BAM
67 }  // namespace internal
68 
69 #endif  // TIMEUTILS_H
70