1 #include "physics/TimeFormat.h"
2 #include <iomanip>
3 #include <sstream>
4 
5 NAMESPACE_SPH_BEGIN
6 
DateFormat(const Float value,const JulianDateFormat inputFormat,const std::string & outputFormat)7 DateFormat::DateFormat(const Float value, const JulianDateFormat inputFormat, const std::string& outputFormat)
8     : outputFormat(outputFormat) {
9     // convert input format to JD
10     switch (inputFormat) {
11     case JulianDateFormat::JD:
12         time = value;
13         break;
14     case JulianDateFormat::RJD:
15         time = value + Float(2'400'000. * 60. * 60. * 24.);
16         break;
17     case JulianDateFormat::MJD:
18         time = value + Float(2'400'000.5 * 60. * 60. * 24.);
19         break;
20     }
21 }
22 
get() const23 std::string DateFormat::get() const {
24     const char* format = outputFormat.c_str();
25     std::string output;
26 
27     // table from wikipedia
28     const int y = 4716, j = 1401, m = 2, n = 12, r = 4, p = 1461, v = 3, u = 5, s = 153, w = 2, B = 274'277,
29               C = -38;
30     /*UnitSystem<T> daySystem = Units::SI<T>; // make the conversion a little bit more elegant
31     daySystem.time          = (1._days).value();*/
32 
33     const Float timeInDays = time / (60. * 60. * 24.) + 0.5_f;
34     const Float remainder = timeInDays - floor(timeInDays); // + T(0.5);
35     const int J = int(timeInDays);
36 
37     const int f = J + j + (((4 * J + B) / 146097) * 3) / 4 + C;
38     const int e = r * f + v;
39     const int g = (e % p) / r;
40     const int h = u * g + w;
41 
42     const int D = (h % s) / u + 1;
43     const int M = (h / s + m) % n + 1;
44     const int Y = (e / p) - y + (n + m - M) / n;
45 
46     for (const char* c = format; *c; ++c) {
47         std::stringstream ss;
48         ss << std::setw(2) << std::setfill('0');
49         if (*c == '%') {
50             c++;
51             SPH_ASSERT(*c != 0); // invalid format
52             switch (*c) {
53             case 'Y': // year
54                 ss << Y;
55                 break;
56             case 'm': // year
57                 ss << M;
58                 break;
59             case 'd': // year
60                 ss << D;
61                 break;
62             case 'H': // hour
63                 ss << int(remainder * 24) % 24;
64                 break;
65             case 'M': // minute
66                 ss << int(remainder * 24 * 60) % 60;
67                 break;
68             case 's': // second
69                 ss << int(remainder * 24 * 60 * 60) % 60;
70                 break;
71             }
72             output += ss.str();
73         } else {
74             output += *c;
75         }
76     }
77     return output;
78 }
79 
80 NAMESPACE_SPH_END
81