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)16inline 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)40inline 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()60inline 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