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