27 #include <QtCore/QDataStream>
44 return sec/
DAY2SEC + (double)min/1440.0 + (
double)hour/24.0;
54 unsigned int century, yrsInCent;
67 yrsInCent = year - 100*century;
68 return -678882 + day + (146097*century)/4 + (1461*yrsInCent)/4 + (153*month + 2)/5;
76 int& nYear,
int& nMonth,
int& nDay,
int& nHour,
int& nMin,
double& dSec)
85 unsigned int j=date + 678882;
86 nYear = (j*4 - 1)/146097;
87 j = j*4 - 146097*nYear - 1;
90 nYear = 100*nYear + j;
93 nMonth = (5*x - 3)/153;
94 x = 5*x - 3 - 153*nMonth;
105 double dTmp=time*
DAY2SEC + 1.0E-7;
106 nHour = (int)floor(dTmp/3600.0);
107 nMin = (int)floor((dTmp - 3600.0*nHour)/60.0);
108 dSec = dTmp - 3600.0*nHour - 60.0*nMin;
121 QDateTime d(QDate::currentDate(), QTime::currentTime());
122 SgMJD currentEpoch( d.date().year(), d.date().month(), d.date().day(),
123 d.time().hour(), d.time().minute(),
124 d.time().second()+d.time().msec()*0.001);
154 int nYr, nMo, nDy, nHr, nMi, nSec, nMsec;
158 nSec = (int)floor(dSec);
159 nMsec = (int)floor((dSec - nSec)*1000.0);
160 return QDateTime(QDate(nYr, nMo, nDy), QTime(nHr, nMi, nSec, nMsec), Qt::UTC);
178 int nDays=(int)trunc(days);
179 double dPart=days - nDays;
193 int nDays=(int)trunc(days);
194 double dPart=days - nDays;
207 int nYear, nMonth, nDay, nHour, nMin;
218 int nYear, nMonth, nDay, nHour, nMin;
229 int nYear, nMonth, nDay, nHour, nMin;
248 int i = (
date_ - 55291)%7;
249 return (i<0?i+7:i)+1;
270 int i, nYear, nMonth, nDay, nHour, nMin;
296 nDay = s.mid(0,2).toInt(&isOk);
312 nYear = s.mid(8,4).toInt(&isOk);
318 nHour = s.mid(14,2).toInt(&isOk);
324 nMin = s.mid(17,2).toInt(&isOk);
330 dSec = s.mid(20,7).toDouble(&isOk);
336 setUpEpoch(nYear, nMonth, nDay, nHour, nMin, dSec);
352 nDay = s.mid(8,2).toInt(&isOk);
358 nMonth = s.mid(5,2).toInt(&isOk);
364 nYear = s.mid(0,4).toInt(&isOk);
370 nHour = s.mid(11,2).toInt(&isOk);
376 nMin = s.mid(14,2).toInt(&isOk);
382 dSec = s.mid(17,4).toDouble(&isOk);
388 setUpEpoch(nYear, nMonth, nDay, nHour, nMin, dSec);
399 nDay = s.mid(6,2).toInt(&isOk);
405 nMonth = s.mid(4,2).toInt(&isOk);
411 nYear = s.mid(0,4).toInt(&isOk);
417 dSec = s.mid(8,6).toDouble(&isOk);
423 setUpEpoch(nYear, nMonth, nDay, 0, 0, dSec/10.0);
435 nDay = s.mid(6,2).toInt(&isOk);
441 nMonth = s.mid(4,2).toInt(&isOk);
447 nYear = s.mid(0,4).toInt(&isOk);
453 dSec = s.mid(9).toDouble(&isOk);
459 setUpEpoch(nYear, nMonth, nDay, 0, 0, dSec*86400.0);
476 nDay = s.mid(0,6).toInt(&isOk);
482 dSec = s.mid(7,12).toDouble(&isOk);
500 nYear = s.mid(0,4).toInt(&isOk);
506 nMonth = s.mid(5,2).toInt(&isOk);
512 nDay = s.mid(8,2).toInt(&isOk);
518 nHour = s.mid(11,2).toInt(&isOk);
524 nMin = s.mid(14,2).toInt(&isOk);
530 setUpEpoch(nYear, nMonth, nDay, nHour, nMin, 0.0);
543 nYear = s.mid(0,4).toInt(&isOk);
549 nMonth = s.mid(5,2).toInt(&isOk);
555 nDay = s.mid(8,2).toInt(&isOk);
561 nHour = s.mid(11,2).toInt(&isOk);
567 nMin = s.mid(14,2).toInt(&isOk);
573 dSec = s.mid(17).toDouble(&isOk);
579 setUpEpoch(nYear, nMonth, nDay, nHour, nMin, dSec);
590 nYear = s.mid(0,4).toInt(&isOk);
596 nMonth = s.mid(5,2).toInt(&isOk);
602 nDay = s.mid(8,2).toInt(&isOk);
608 nHour = s.mid(11,2).toInt(&isOk);
614 nMin = s.mid(14,2).toInt(&isOk);
620 dSec = s.mid(17,6).toDouble(&isOk);
626 setUpEpoch(nYear, nMonth, nDay, nHour, nMin, dSec);
637 nYear = s.mid(0,4).toInt(&isOk);
643 nDay = s.mid(5,3).toInt(&isOk);
649 nHour = s.mid(9,2).toInt(&isOk);
655 nMin = s.mid(12,2).toInt(&isOk);
661 dSec = s.mid(15,5).toDouble(&isOk);
667 setUpEpoch(nYear, 0, nDay, nHour, nMin, dSec);
678 nYear = s.mid(0,2).toInt(&isOk);
679 nYear += (nYear<65)?2000:1900;
685 nMonth = s.mid(3,2).toInt(&isOk);
691 nDay = s.mid(6,2).toInt(&isOk);
697 nHour = s.mid(9,2).toInt(&isOk);
703 nMin = s.mid(12,2).toInt(&isOk);
709 setUpEpoch(nYear, nMonth, nDay, nHour, nMin, 0.0);
720 d = s.toDouble(&isOk);
726 date_ = (int)floor(d);
738 d = s.toDouble(&isOk);
755 nYear = s.mid(0,2).toInt(&isOk);
761 nDay = s.mid(3,3).toInt(&isOk);
767 dSec = s.mid(7,5).toDouble(&isOk);
773 setUpEpoch(nYear<=50? nYear+2000 : nYear+1900, 0, nDay, 0, 0, dSec);
778 *
this =
SgMJD(QDateTime::fromString(s, Qt::ISODate));
782 *
this =
SgMJD(QDateTime::fromString(s, Qt::RFC2822Date));
795 nDay = s.mid(9,2).toInt(&isOk);
811 nYear = s.mid(0,4).toInt(&isOk);
828 nDay = s.mid(0,2).toInt(&isOk);
844 nYear = s.mid(8,4).toInt(&isOk);
862 nYear = s.mid(0,4).toInt(&isOk);
868 nMonth = s.mid(5,2).toInt(&isOk);
874 nDay = s.mid(8,2).toInt(&isOk);
891 nDay = s.mid(5,2).toInt(&isOk);
907 nYear = s.mid(0,2).toInt(&isOk);
913 setUpEpoch(nYear<=50? nYear+2000 : nYear+1900, nMonth, nDay, 0, 0, 0.0);
924 nDay = s.mid(7,2).toInt(&isOk);
940 nYear = s.mid(0,4).toInt(&isOk);
957 d = s.toDouble(&isOk);
964 time_ = 365.25*fmod(d, 1.0);
976 nYear = s.mid(0,2).toInt(&isOk);
982 nDay = s.mid(3,3).toInt(&isOk);
988 setUpEpoch(nYear<=50? nYear+2000 : nYear+1900, 0, nDay, 0, 0, 0.0);
1010 QString s(
"UNKNOWN");
1012 int nYear, nMonth, nDay, nHour, nMin;
1023 s.sprintf(
"%02d %s, %04d; %02d:%02d:%07.4f",
1047 s.sprintf(
"%s, the %d%s of %s, %04d; %02dhr %02dmin %07.4fsec",
1053 s.sprintf(
"%04d/%02d/%02d %02d:%02d:%04.1f", nYear, nMonth, nDay, nHour, nMin, dSec);
1056 s.sprintf(
"%04d/%02d/%02d %02d:%02d:%02d", nYear, nMonth, nDay, nHour, nMin, (
int)(round(dSec)));
1060 s.sprintf(
"%04d%02d%02d%06d", nYear, nMonth, nDay, nHour*36000 + nMin*600 + (
int)(round(dSec*10.0)));
1064 s.sprintf(
"%04d%02d%02d.%02d", nYear, nMonth, nDay, (
int)round((nHour*3600 + nMin*60 + dSec)/864.0));
1072 s.sprintf(
"%04d.%02d.%02d-%02d.%02d", nYear, nMonth, nDay, nHour, nMin);
1076 s.sprintf(
"%04d.%02d.%02d-%02d:%02d:%02d", nYear, nMonth, nDay, nHour, nMin, (
int)(round(dSec)));
1080 s.sprintf(
"%04d.%02d.%02d-%02d:%02d:%04.1f", nYear, nMonth, nDay, nHour, nMin, dSec);
1084 s.sprintf(
"%04d.%02d.%02d-%02d:%02d:%05.2f", nYear, nMonth, nDay, nHour, nMin, dSec);
1088 nYear -= (nYear/100)*100;
1089 s.sprintf(
"%02d/%02d/%02d %02d:%02d", nYear, nMonth, nDay, nHour, nMin);
1093 s.sprintf(
"%04d.%02d.%02d-%02d:%02d:%06.3f", nYear, nMonth, nDay, nHour, nMin, dSec);
1099 s.sprintf(
"%04d.%03d.%02d:%02d:%05.2f", nYear,
calcDayOfYear(), nHour, nMin, dSec);
1114 s.sprintf(
"%02d:%03d:%05d",
1137 s.sprintf(
"%04d %02d %02d", nYear, nMonth, nDay);
1141 s.sprintf(
"%04d.%02d.%02d", nYear, nMonth, nDay);
1145 s.sprintf(
"%02d%s%02d", nYear-100*(nYear/100),
shortMonthNames_[nMonth-1], nDay);
1157 s.sprintf(
"%02d:%03d", nYear-100*(nYear/100),
calcDayOfYear());
1172 s.sprintf(
"%02d:%02d:%04.1f", nHour, nMin, dSec);
1176 s.sprintf(
"%02d:%02d:%02d", nHour, nMin, (
int)floor(dSec));
1187 s.sprintf(
"%02d:%02d", nHour, nMin);
1199 if (1<=dayOfWeek && dayOfWeek<=7)
1204 QString().sprintf(
": dayOfWeek2Str(): for the date %d dayOfWeek (%d) is out of ranges",
1216 if (1<=dayOfWeek && dayOfWeek<=7)
1221 QString().sprintf(
": dayOfWeek2LongStr(): for the date %d dayOfWeek (%d) is out of ranges",
1236 QDateTime d(QDate(yr, mn, dy), QTime(hr, mi, (
int)(round(sc))), Qt::LocalTime);
1237 QDateTime dUtc = d.toUTC();
1238 SgMJD epoch(dUtc.date().year(), dUtc.date().month(), dUtc.date().day(),
1239 dUtc.time().hour(), dUtc.time().minute(),
1240 dUtc.time().second()+dUtc.time().msec()*0.001);
1253 QDateTime d(QDate(yr, mn, dy), QTime(hr, mi, (
int)(round(sc))), Qt::UTC);
1254 QDateTime dLoc = d.toLocalTime();
1255 SgMJD epoch(dLoc.date().year(), dLoc.date().month(), dLoc.date().day(),
1256 dLoc.time().hour(), dLoc.time().minute(),
1257 dLoc.time().second()+dLoc.time().msec()*0.001);
1266 double dGmst, dGmst0h=0.0, dT_u=0.0, dT_u2=0.0, r;
1284 dGmst0h = (24110.54841 + 8640184.812866*dT_u + 0.093104*dT_u2 - 6.2e-6*dT_u*dT_u2)/
DAY2SEC;
1289 r = 1.002737909350795 + 5.9006e-11*dT_u - 5.9e-15*dT_u2;
1294 dGmst = dGmst0h + r*
time_;
1295 dGmst = fmod(dGmst, 1.0);
1309 dSec = 1.0e-8*round(dSec*1.0e8);
1318 if (s.status() != QDataStream::Ok)
1321 ": saveIntermediateResults(): error writting data");
1324 return s.status() == QDataStream::Ok;
1336 if (s.status() != QDataStream::Ok)
1339 ": loadIntermediateResults(): error reading data: " +
1340 (s.status()==QDataStream::ReadPastEnd?
"read past end of the file":
"read corrupt data"));
1346 return s.status()==QDataStream::Ok;
1373 int nYears=0, nMonths=0, nDays=0, nHours=0, nMins=0;
1376 bool isSignPositive=(days>=0.0);
1378 if (!isSignPositive)
1386 nYears = (int)floor(days/365.25);
1387 days -= 365.25*nYears;
1391 nMonths = (int)floor(days*12.0/365.25);
1392 days -= nMonths*365.25/12.0;
1396 nDays = (int)floor(days);
1397 days -= (double)nDays;
1402 nHours = (int)(days/3600.0);
1403 nMins = (int)((days - 3600.0*nHours)/60.0);
1404 dSecs = days - 3600.0*nHours - 60.0*nMins;
1406 if (nYears==0 && nMonths==0 && nDays==0 && nHours==0 && nMins==0 && dSecs<1.0)
1407 str += QString().sprintf(
"%.6g sec", dSecs);
1411 str += QString().sprintf(
"%d year%s ", nYears, nYears==1?
"":
"s");
1413 str += QString().sprintf(
"%d month%s ", nMonths, nMonths==1?
"":
"s");
1415 str += QString().sprintf(
"%d day%s ", nDays, nDays==1?
"":
"s");
1417 str += QString().sprintf(
"%02dhr ", nHours);
1419 str += QString().sprintf(
"%02dmin ", nMins);
1420 str += QString().sprintf(
"%05.2fsec", dSecs);
1424 if (!isSignPositive)
1441 "Jan",
"Feb",
"Mar",
"Apr",
"May",
"Jun",
1442 "Jul",
"Aug",
"Sep",
"Oct",
"Nov",
"Dec"
1447 "January",
"February",
"March",
"April",
"May",
"June",
1448 "July",
"August",
"September",
"October",
"November",
"December"
1453 "Mon",
"Tue",
"Wed",
"Thu",
"Fri",
"Sat",
"Sun"
1458 "Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday",
"Sunday"
QString interval2Str(double days)
const SgMJD tUnix0(1970, 1, 1)
const SgMJD tZero(1957, 10, 4)
const SgMJD tInf(2100, 1, 1)
const SgMJD tEphem(51544.5)
#define DAY2SEC
radians to mas:
virtual void write(LogLevel, quint32, const QString &, bool=false)
QString dayOfWeek2LongStr() const
bool fromString(Format format, const QString &str, bool isReset=true)
void setTime(double dTime)
@ F_FS_LOG
Another version from spoolfile format: 2012.01.20-09:32:00.960.
@ F_SOLVE_SPLFL_LONG
Another version from spoolfile format: 12/01/20 00:02.
@ F_YYYYMMDD
Another format for a date: 02 Apr, 2010.
@ F_yyyymmdd
Date in digits: 2010 04 02.
@ F_YYYYMMDDHHMMSSSS
Long verbose: Fri, the 2nd of Apr, 2010; 17hr 02min 43.6400sec.
@ F_SOLVE_SPLFL_SHORT
Another spoolfile represenation of epoch: 2012.01.20-09:14:28.05.
@ F_DDMonYYYY
Date: 2010 Apr 02.
@ F_ECCDAT
Digits, MJD and seconds : 055288:61363.6400.
@ F_YYYYMMDDDD
Digits, date and seconds: 20100402613636.
@ F_RFC2822
ISO date format realized by Qt (Qt::ISODate)
@ F_SINEX
UNUX seconds: 1270227763.6400.
@ F_VerboseLong
Verbose output: 02 Apr, 2010; 17:02:43.6400.
@ F_SINEX_S
Year: 2010.25.
@ F_YYYYMonDD
Date in digits: 2010.04.02.
@ F_UNIX
Just MJD: 55288.7102.
@ F_YYMonDD
Date, short: 2016Mar01.
@ F_MJD
Field System logs: 2020.195.11:15:34.11.
@ F_YYYYMMDDSSSSSS
Digits: 2010/04/02 17:02:43.
@ F_ISO
SINEX format: 10:092:61364.
@ F_HHMMSS
Just time: 17:02:43.6.
@ F_SOLVE_SPLFL_V2
A spoolfile represenation of epoch: 2012.01.20-09:14:28.
@ F_Simple
Digits: 2010/04/02 17:02:43.6.
@ F_Date
RFC2822 date format realized by Qt (Qt::RFC2822Date)
@ F_SOLVE_SPLFL_V3
Another spoolfile represenation of epoch: 2012.01.20-09:14:28.0.
@ F_SOLVE_SPLFL
That was used in ECC.dat files: 2010.04.02-17.02.
@ F_Year
Date, more shortly: 10Apr02.
@ F_Time
SINEX, short version: 10:092.
@ F_TimeShort
Time, seconds are integer: 17:02:43.
@ F_INTERNAL
Digits, date and time: 20100402.71.
QString className() const
QString toString(Format format=F_Verbose) const
static const char * shortMonthNames_[]
static const char * longWeekdayNames_[]
bool saveIntermediateResults(QDataStream &) const
void toYMDHMS_tr(int &nYear, int &nMonth, int &nDay, int &nHour, int &nMin, double &dSec) const
static const char * shortWeekdayNames_[]
double time_
integer part of the epoch;
bool loadIntermediateResults(QDataStream &)
static int calcDayNumber(int year, int month, int day)
void normalize()
part of the day, in days.
int calcDayOfYear() const
static SgMJD currentMJD()
SgMJD & operator-=(double days)
static double calcPartOfDay(int hour, int min, double sec)
int calcDayOfWeek() const
void setUpEpoch(int year, int month, int day, int hour, int min, double sec)
static void MJD_reverse(int date, double time, int &nYear, int &nMonth, int &nDay, int &nHour, int &nMin, double &dSec)
static const char * longMonthNames_[]
SgMJD & operator+=(double days)
QDateTime toQDateTime() const
QString dayOfWeek2Str() const