SPH
TimeFormat.cpp
Go to the documentation of this file.
1 #include "physics/TimeFormat.h"
2 #include <iomanip>
3 #include <sstream>
4 
6 
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) {
12  time = value;
13  break;
15  time = value + Float(2'400'000. * 60. * 60. * 24.);
16  break;
18  time = value + Float(2'400'000.5 * 60. * 60. * 24.);
19  break;
20  }
21 }
22 
23 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 
#define SPH_ASSERT(x,...)
Definition: Assert.h:94
NAMESPACE_SPH_BEGIN
Definition: BarnesHut.cpp:13
double Float
Precision used withing the code. Use Float instead of float or double where precision is important.
Definition: Globals.h:13
INLINE auto floor(const T &f)
Definition: MathUtils.h:346
#define NAMESPACE_SPH_END
Definition: Object.h:12
Date and time routines.
JulianDateFormat
Input format of Julian date.
Definition: TimeFormat.h:15
@ JD
(ordinary) Julian date, number of days since noon January 1, 4713 BC
@ RJD
reduced Julian date, equals to JD - 2.400.000,0
@ MJD
modified Julian date, equals to JD - 2.400.000,5
@ Y
Definition: Vector.h:23
DateFormat(const Float value, const JulianDateFormat inputFormat, const std::string &outputFormat)
Definition: TimeFormat.cpp:7
std::string get() const
Returns the formatted string containing date/time.
Definition: TimeFormat.cpp:23