3 #include <boost/format.hpp>
4 #include <utl/AugerException.h>
5 #include <utl/UTCDateTime.h>
6 #include <utl/LeapSeconds.h>
7 #include <utl/ErrorLogger.h>
10 using namespace boost;
18 LeapSeconds::GetInstance().ConvertGPSToUnix(ts.
GetGPSSecond(), unixSecond);
21 const tm*
const gm = gmtime(&unixSecond);
22 UTCDate::Set(gm->tm_year + 1900, gm->tm_mon + 1, gm->tm_mday);
25 fSecond = (leap ? 60 : gm->tm_sec);
34 if (hour < 0 || hour > 23) {
36 err <<
"UTCDateTime: hour " << hour <<
" not in range 0-23";
39 if (minute < 0 || minute > 59) {
41 err <<
"UTCDateTime: minute " << minute <<
" not in range 0-59";
44 if (second < 0 || second > 60) {
46 err <<
"UTCDateTime: second " << second <<
" not in range 0-59(60)";
49 if (nanosecond < 0 || nanosecond >= 1000000000) {
51 err <<
"UTCDateTime: nanosecond " << nanosecond <<
" not in range 0-1000000000";
60 time_t unixSecond = GetUnixSecond();
61 unsigned long gpsSecond;
62 LeapSeconds::GetInstance().ConvertUnixToGPS(unixSecond, gpsSecond);
65 LeapSeconds::GetInstance().ConvertGPSToUnix(gpsSecond, unixSecond);
67 LeapSeconds::GetInstance().Dump();
69 err <<
"UTCDateTime " << (*this) <<
" unix=" << unixSecond <<
" gps=" << gpsSecond <<
": "
70 "Second is 60 but time does not correspond to a leap second" << endl;
78 UTCDateTime::GetInAugerFormat()
82 (format(
"%|1$02|:%|2$02|:%|3$02| %|4$02| %5% %|6$4|")
87 % fgMonthNames[GetMonth() - eJan]
94 UTCDateTime::GetInXMLFormat()
98 return (format(
"%1%T%|2$02|:%|3$02|:%|4$02|.%|5$09|Z")
99 % UTCDate::GetInXMLFormatZone(
"") % fHour % fMinute % fSecond %
long(fNanosecond)).str();
101 return (format(
"%1%T%|2$02|:%|3$02|:%|4$02|Z")
102 % UTCDate::GetInXMLFormatZone(
"") % fHour % fMinute % fSecond).str();
107 UTCDateTime::GetInMySQLFormat()
110 return (format(
"%1% %|2$02|:%|3$02|:%|4$02|")
111 % UTCDate::GetInXMLFormatZone(
"") % fHour % fMinute % fSecond).str();
115 UTCDateTime::GetTimeStamp()
118 const time_t unixSecond = GetUnixSecond();
119 unsigned long gpsSecond;
120 LeapSeconds::GetInstance().ConvertUnixToGPS(unixSecond, gpsSecond);
123 return TimeStamp(gpsSecond, fNanosecond);
128 UTCDateTime::Parse(istream&
is)
130 UTCDate::Parse(is,
false);
138 if ((is >> t >> hour >> colon >> minute >> colon2 >> second) &&
139 t ==
'T' && colon ==
':' && colon2 ==
':' &&
140 (!(is >> zone) || zone ==
'Z')) {
141 const int sec = int(second);
142 const long nanosecond = long(1000000000*(second - sec) + 0.5);
143 SetHMS(hour, minute, sec, nanosecond);
148 err <<
"Initializing UTCDateTime variable failed: "
149 "t=" << t <<
" hour=" << hour <<
" colon=" << colon <<
" minute=" << minute
150 <<
" colon2=" << colon2 <<
" second=" << second <<
" zone=" << zone;
bool is(const double a, const double b)
A TimeStamp holds GPS second and nanosecond for some event.
Exception for reporting variable out of valid range.
constexpr double nanosecond
unsigned long GetGPSSecond() const
GPS second.
double GetGPSNanoSecond() const
GPS nanosecond.
#define ERROR(message)
Macro for logging error messages.