xref: /openbmc/bmcweb/features/redfish/include/utils/time_utils.hpp (revision b00dcc27587267e18d3abdee82f1ed7b39744d02)
1081ebf06SWludzik, Jozef #pragma once
2081ebf06SWludzik, Jozef 
3081ebf06SWludzik, Jozef #include <chrono>
4081ebf06SWludzik, Jozef #include <string>
5081ebf06SWludzik, Jozef 
6081ebf06SWludzik, Jozef namespace redfish
7081ebf06SWludzik, Jozef {
8081ebf06SWludzik, Jozef 
9081ebf06SWludzik, Jozef namespace time_utils
10081ebf06SWludzik, Jozef {
11081ebf06SWludzik, Jozef 
12081ebf06SWludzik, Jozef namespace details
13081ebf06SWludzik, Jozef {
14081ebf06SWludzik, Jozef 
15081ebf06SWludzik, Jozef inline void leftZeroPadding(std::string& str, const std::size_t padding)
16081ebf06SWludzik, Jozef {
17081ebf06SWludzik, Jozef     if (str.size() < padding)
18081ebf06SWludzik, Jozef     {
19081ebf06SWludzik, Jozef         str.insert(0, padding - str.size(), '0');
20081ebf06SWludzik, Jozef     }
21081ebf06SWludzik, Jozef }
22081ebf06SWludzik, Jozef } // namespace details
23081ebf06SWludzik, Jozef 
24081ebf06SWludzik, Jozef /**
25081ebf06SWludzik, Jozef  * @brief Convert time value into duration format that is based on ISO 8601.
26081ebf06SWludzik, Jozef  *        Example output: "P12DT1M5.5S"
27081ebf06SWludzik, Jozef  *        Ref: Redfish Specification, Section 9.4.4. Duration values
28081ebf06SWludzik, Jozef  */
29*b00dcc27SEd Tanous inline std::string toDurationString(std::chrono::milliseconds ms)
30081ebf06SWludzik, Jozef {
31081ebf06SWludzik, Jozef     if (ms < std::chrono::milliseconds::zero())
32081ebf06SWludzik, Jozef     {
33081ebf06SWludzik, Jozef         return "";
34081ebf06SWludzik, Jozef     }
35081ebf06SWludzik, Jozef 
36081ebf06SWludzik, Jozef     std::string fmt;
37081ebf06SWludzik, Jozef     fmt.reserve(sizeof("PxxxxxxxxxxxxDTxxHxxMxx.xxxxxxS"));
38081ebf06SWludzik, Jozef 
39081ebf06SWludzik, Jozef     using Days = std::chrono::duration<long, std::ratio<24 * 60 * 60>>;
40081ebf06SWludzik, Jozef     Days days = std::chrono::floor<Days>(ms);
41081ebf06SWludzik, Jozef     ms -= days;
42081ebf06SWludzik, Jozef 
43081ebf06SWludzik, Jozef     std::chrono::hours hours = std::chrono::floor<std::chrono::hours>(ms);
44081ebf06SWludzik, Jozef     ms -= hours;
45081ebf06SWludzik, Jozef 
46081ebf06SWludzik, Jozef     std::chrono::minutes minutes = std::chrono::floor<std::chrono::minutes>(ms);
47081ebf06SWludzik, Jozef     ms -= minutes;
48081ebf06SWludzik, Jozef 
49081ebf06SWludzik, Jozef     std::chrono::seconds seconds = std::chrono::floor<std::chrono::seconds>(ms);
50081ebf06SWludzik, Jozef     ms -= seconds;
51081ebf06SWludzik, Jozef 
52081ebf06SWludzik, Jozef     fmt = "P";
53081ebf06SWludzik, Jozef     if (days.count() > 0)
54081ebf06SWludzik, Jozef     {
55081ebf06SWludzik, Jozef         fmt += std::to_string(days.count()) + "D";
56081ebf06SWludzik, Jozef     }
57081ebf06SWludzik, Jozef     fmt += "T";
58081ebf06SWludzik, Jozef     if (hours.count() > 0)
59081ebf06SWludzik, Jozef     {
60081ebf06SWludzik, Jozef         fmt += std::to_string(hours.count()) + "H";
61081ebf06SWludzik, Jozef     }
62081ebf06SWludzik, Jozef     if (minutes.count() > 0)
63081ebf06SWludzik, Jozef     {
64081ebf06SWludzik, Jozef         fmt += std::to_string(minutes.count()) + "M";
65081ebf06SWludzik, Jozef     }
66081ebf06SWludzik, Jozef     if (seconds.count() != 0 || ms.count() != 0)
67081ebf06SWludzik, Jozef     {
68081ebf06SWludzik, Jozef         fmt += std::to_string(seconds.count()) + ".";
69081ebf06SWludzik, Jozef         std::string msStr = std::to_string(ms.count());
70081ebf06SWludzik, Jozef         details::leftZeroPadding(msStr, 3);
71081ebf06SWludzik, Jozef         fmt += msStr + "S";
72081ebf06SWludzik, Jozef     }
73081ebf06SWludzik, Jozef 
74081ebf06SWludzik, Jozef     return fmt;
75081ebf06SWludzik, Jozef }
76081ebf06SWludzik, Jozef 
77081ebf06SWludzik, Jozef } // namespace time_utils
78081ebf06SWludzik, Jozef } // namespace redfish
79