xref: /openbmc/bmcweb/features/redfish/include/utils/time_utils.hpp (revision 081ebf06b4c947e828408029273699ff2d49a54f)
1*081ebf06SWludzik, Jozef #pragma once
2*081ebf06SWludzik, Jozef 
3*081ebf06SWludzik, Jozef #include <chrono>
4*081ebf06SWludzik, Jozef #include <string>
5*081ebf06SWludzik, Jozef 
6*081ebf06SWludzik, Jozef namespace redfish
7*081ebf06SWludzik, Jozef {
8*081ebf06SWludzik, Jozef 
9*081ebf06SWludzik, Jozef namespace time_utils
10*081ebf06SWludzik, Jozef {
11*081ebf06SWludzik, Jozef 
12*081ebf06SWludzik, Jozef namespace details
13*081ebf06SWludzik, Jozef {
14*081ebf06SWludzik, Jozef 
15*081ebf06SWludzik, Jozef inline void leftZeroPadding(std::string& str, const std::size_t padding)
16*081ebf06SWludzik, Jozef {
17*081ebf06SWludzik, Jozef     if (str.size() < padding)
18*081ebf06SWludzik, Jozef     {
19*081ebf06SWludzik, Jozef         str.insert(0, padding - str.size(), '0');
20*081ebf06SWludzik, Jozef     }
21*081ebf06SWludzik, Jozef }
22*081ebf06SWludzik, Jozef } // namespace details
23*081ebf06SWludzik, Jozef 
24*081ebf06SWludzik, Jozef /**
25*081ebf06SWludzik, Jozef  * @brief Convert time value into duration format that is based on ISO 8601.
26*081ebf06SWludzik, Jozef  *        Example output: "P12DT1M5.5S"
27*081ebf06SWludzik, Jozef  *        Ref: Redfish Specification, Section 9.4.4. Duration values
28*081ebf06SWludzik, Jozef  */
29*081ebf06SWludzik, Jozef std::string toDurationString(std::chrono::milliseconds ms)
30*081ebf06SWludzik, Jozef {
31*081ebf06SWludzik, Jozef     if (ms < std::chrono::milliseconds::zero())
32*081ebf06SWludzik, Jozef     {
33*081ebf06SWludzik, Jozef         return "";
34*081ebf06SWludzik, Jozef     }
35*081ebf06SWludzik, Jozef 
36*081ebf06SWludzik, Jozef     std::string fmt;
37*081ebf06SWludzik, Jozef     fmt.reserve(sizeof("PxxxxxxxxxxxxDTxxHxxMxx.xxxxxxS"));
38*081ebf06SWludzik, Jozef 
39*081ebf06SWludzik, Jozef     using Days = std::chrono::duration<long, std::ratio<24 * 60 * 60>>;
40*081ebf06SWludzik, Jozef     Days days = std::chrono::floor<Days>(ms);
41*081ebf06SWludzik, Jozef     ms -= days;
42*081ebf06SWludzik, Jozef 
43*081ebf06SWludzik, Jozef     std::chrono::hours hours = std::chrono::floor<std::chrono::hours>(ms);
44*081ebf06SWludzik, Jozef     ms -= hours;
45*081ebf06SWludzik, Jozef 
46*081ebf06SWludzik, Jozef     std::chrono::minutes minutes = std::chrono::floor<std::chrono::minutes>(ms);
47*081ebf06SWludzik, Jozef     ms -= minutes;
48*081ebf06SWludzik, Jozef 
49*081ebf06SWludzik, Jozef     std::chrono::seconds seconds = std::chrono::floor<std::chrono::seconds>(ms);
50*081ebf06SWludzik, Jozef     ms -= seconds;
51*081ebf06SWludzik, Jozef 
52*081ebf06SWludzik, Jozef     fmt = "P";
53*081ebf06SWludzik, Jozef     if (days.count() > 0)
54*081ebf06SWludzik, Jozef     {
55*081ebf06SWludzik, Jozef         fmt += std::to_string(days.count()) + "D";
56*081ebf06SWludzik, Jozef     }
57*081ebf06SWludzik, Jozef     fmt += "T";
58*081ebf06SWludzik, Jozef     if (hours.count() > 0)
59*081ebf06SWludzik, Jozef     {
60*081ebf06SWludzik, Jozef         fmt += std::to_string(hours.count()) + "H";
61*081ebf06SWludzik, Jozef     }
62*081ebf06SWludzik, Jozef     if (minutes.count() > 0)
63*081ebf06SWludzik, Jozef     {
64*081ebf06SWludzik, Jozef         fmt += std::to_string(minutes.count()) + "M";
65*081ebf06SWludzik, Jozef     }
66*081ebf06SWludzik, Jozef     if (seconds.count() != 0 || ms.count() != 0)
67*081ebf06SWludzik, Jozef     {
68*081ebf06SWludzik, Jozef         fmt += std::to_string(seconds.count()) + ".";
69*081ebf06SWludzik, Jozef         std::string msStr = std::to_string(ms.count());
70*081ebf06SWludzik, Jozef         details::leftZeroPadding(msStr, 3);
71*081ebf06SWludzik, Jozef         fmt += msStr + "S";
72*081ebf06SWludzik, Jozef     }
73*081ebf06SWludzik, Jozef 
74*081ebf06SWludzik, Jozef     return fmt;
75*081ebf06SWludzik, Jozef }
76*081ebf06SWludzik, Jozef 
77*081ebf06SWludzik, Jozef } // namespace time_utils
78*081ebf06SWludzik, Jozef } // namespace redfish
79