27 #include <QtCore/QDataStream>
43 return sec/
DAY2SEC + (double)min/1440.0 + (
double)hour/24.0;
53 unsigned int century, yrsInCent;
66 yrsInCent = year - 100*century;
67 return -678882 + day + (146097*century)/4 + (1461*yrsInCent)/4 + (153*month + 2)/5;
75 int& nYear,
int& nMonth,
int& nDay,
int& nHour,
int& nMin,
double& dSec)
84 unsigned int j=date + 678882;
85 nYear = (j*4 - 1)/146097;
86 j = j*4 - 146097*nYear - 1;
89 nYear = 100*nYear + j;
92 nMonth = (5*x - 3)/153;
93 x = 5*x - 3 - 153*nMonth;
104 double dTmp=time*
DAY2SEC + 1.0E-7;
105 nHour = (int)floor(dTmp/3600.0);
106 nMin = (int)floor((dTmp - 3600.0*nHour)/60.0);
107 dSec = dTmp - 3600.0*nHour - 60.0*nMin;
120 QDateTime d(QDate::currentDate(), QTime::currentTime());
121 SgMJD currentEpoch( d.date().year(), d.date().month(), d.date().day(),
122 d.time().hour(), d.time().minute(),
123 d.time().second()+d.time().msec()*0.001);
153 int nYr, nMo, nDy, nHr, nMi, nSec, nMsec;
157 nSec = (int)floor(dSec);
158 nMsec = (int)floor((dSec - nSec)*1000.0);
159 return QDateTime(QDate(nYr, nMo, nDy), QTime(nHr, nMi, nSec, nMsec), Qt::UTC);
177 int nDays=(int)trunc(days);
178 double dPart=days - nDays;
192 int nDays=(int)trunc(days);
193 double dPart=days - nDays;
206 int nYear, nMonth, nDay, nHour, nMin;
217 int nYear, nMonth, nDay, nHour, nMin;
228 int nYear, nMonth, nDay, nHour, nMin;
247 int i = (
date_ - 55291)%7;
248 return (i<0?i+7:i)+1;
269 int i, nYear, nMonth, nDay, nHour, nMin;
295 nDay = s.mid(0,2).toInt(&isOk);
311 nYear = s.mid(8,4).toInt(&isOk);
317 nHour = s.mid(14,2).toInt(&isOk);
323 nMin = s.mid(17,2).toInt(&isOk);
329 dSec = s.mid(20,7).toDouble(&isOk);
335 setUpEpoch(nYear, nMonth, nDay, nHour, nMin, dSec);
351 nDay = s.mid(8,2).toInt(&isOk);
357 nMonth = s.mid(5,2).toInt(&isOk);
363 nYear = s.mid(0,4).toInt(&isOk);
369 nHour = s.mid(11,2).toInt(&isOk);
375 nMin = s.mid(14,2).toInt(&isOk);
381 dSec = s.mid(17,4).toDouble(&isOk);
387 setUpEpoch(nYear, nMonth, nDay, nHour, nMin, dSec);
398 nDay = s.mid(6,2).toInt(&isOk);
404 nMonth = s.mid(4,2).toInt(&isOk);
410 nYear = s.mid(0,4).toInt(&isOk);
416 dSec = s.mid(8,6).toDouble(&isOk);
422 setUpEpoch(nYear, nMonth, nDay, 0, 0, dSec/10.0);
434 nDay = s.mid(6,2).toInt(&isOk);
440 nMonth = s.mid(4,2).toInt(&isOk);
446 nYear = s.mid(0,4).toInt(&isOk);
452 dSec = s.mid(9).toDouble(&isOk);
458 setUpEpoch(nYear, nMonth, nDay, 0, 0, dSec*86400.0);
475 nDay = s.mid(0,6).toInt(&isOk);
481 dSec = s.mid(7,12).toDouble(&isOk);
499 nYear = s.mid(0,4).toInt(&isOk);
505 nMonth = s.mid(5,2).toInt(&isOk);
511 nDay = s.mid(8,2).toInt(&isOk);
517 nHour = s.mid(11,2).toInt(&isOk);
523 nMin = s.mid(14,2).toInt(&isOk);
529 setUpEpoch(nYear, nMonth, nDay, nHour, nMin, 0.0);
542 nYear = s.mid(0,4).toInt(&isOk);
548 nMonth = s.mid(5,2).toInt(&isOk);
554 nDay = s.mid(8,2).toInt(&isOk);
560 nHour = s.mid(11,2).toInt(&isOk);
566 nMin = s.mid(14,2).toInt(&isOk);
572 dSec = s.mid(17).toDouble(&isOk);
578 setUpEpoch(nYear, nMonth, nDay, nHour, nMin, dSec);
589 nYear = s.mid(0,4).toInt(&isOk);
595 nMonth = s.mid(5,2).toInt(&isOk);
601 nDay = s.mid(8,2).toInt(&isOk);
607 nHour = s.mid(11,2).toInt(&isOk);
613 nMin = s.mid(14,2).toInt(&isOk);
619 dSec = s.mid(17,6).toDouble(&isOk);
625 setUpEpoch(nYear, nMonth, nDay, nHour, nMin, dSec);
636 nYear = s.mid(0,4).toInt(&isOk);
642 nDay = s.mid(5,3).toInt(&isOk);
648 nHour = s.mid(9,2).toInt(&isOk);
654 nMin = s.mid(12,2).toInt(&isOk);
660 dSec = s.mid(15,5).toDouble(&isOk);
666 setUpEpoch(nYear, 0, nDay, nHour, nMin, dSec);
677 nYear = s.mid(0,2).toInt(&isOk);
678 nYear += (nYear<65)?2000:1900;
684 nMonth = s.mid(3,2).toInt(&isOk);
690 nDay = s.mid(6,2).toInt(&isOk);
696 nHour = s.mid(9,2).toInt(&isOk);
702 nMin = s.mid(12,2).toInt(&isOk);
708 setUpEpoch(nYear, nMonth, nDay, nHour, nMin, 0.0);
719 d = s.toDouble(&isOk);
725 date_ = (int)floor(d);
737 d = s.toDouble(&isOk);
754 nYear = s.mid(0,2).toInt(&isOk);
760 nDay = s.mid(3,3).toInt(&isOk);
766 dSec = s.mid(7,5).toDouble(&isOk);
772 setUpEpoch(nYear<=50? nYear+2000 : nYear+1900, 0, nDay, 0, 0, dSec);
777 *
this =
SgMJD(QDateTime::fromString(s, Qt::ISODate));
781 *
this =
SgMJD(QDateTime::fromString(s, Qt::RFC2822Date));
794 nDay = s.mid(9,2).toInt(&isOk);
810 nYear = s.mid(0,4).toInt(&isOk);
827 nDay = s.mid(0,2).toInt(&isOk);
843 nYear = s.mid(8,4).toInt(&isOk);
861 nYear = s.mid(0,4).toInt(&isOk);
867 nMonth = s.mid(5,2).toInt(&isOk);
873 nDay = s.mid(8,2).toInt(&isOk);
890 nDay = s.mid(5,2).toInt(&isOk);
906 nYear = s.mid(0,2).toInt(&isOk);
912 setUpEpoch(nYear<=50? nYear+2000 : nYear+1900, nMonth, nDay, 0, 0, 0.0);
923 nDay = s.mid(7,2).toInt(&isOk);
939 nYear = s.mid(0,4).toInt(&isOk);
956 d = s.toDouble(&isOk);
963 time_ = 365.25*fmod(d, 1.0);
975 nYear = s.mid(0,2).toInt(&isOk);
981 nDay = s.mid(3,3).toInt(&isOk);
987 setUpEpoch(nYear<=50? nYear+2000 : nYear+1900, 0, nDay, 0, 0, 0.0);
1009 QString s(
"UNKNOWN");
1011 int nYear, nMonth, nDay, nHour, nMin;
1022 s.sprintf(
"%02d %s, %04d; %02d:%02d:%07.4f",
1046 s.sprintf(
"%s, the %d%s of %s, %04d; %02dhr %02dmin %07.4fsec",
1052 s.sprintf(
"%04d/%02d/%02d %02d:%02d:%04.1f", nYear, nMonth, nDay, nHour, nMin, dSec);
1055 s.sprintf(
"%04d/%02d/%02d %02d:%02d:%02d", nYear, nMonth, nDay, nHour, nMin, (
int)(round(dSec)));
1059 s.sprintf(
"%04d%02d%02d%06d", nYear, nMonth, nDay, nHour*36000 + nMin*600 + (
int)(round(dSec*10.0)));
1063 s.sprintf(
"%04d%02d%02d.%02d", nYear, nMonth, nDay, (
int)round((nHour*3600 + nMin*60 + dSec)/864.0));
1071 s.sprintf(
"%04d.%02d.%02d-%02d.%02d", nYear, nMonth, nDay, nHour, nMin);
1075 s.sprintf(
"%04d.%02d.%02d-%02d:%02d:%02d", nYear, nMonth, nDay, nHour, nMin, (
int)(round(dSec)));
1079 s.sprintf(
"%04d.%02d.%02d-%02d:%02d:%04.1f", nYear, nMonth, nDay, nHour, nMin, dSec);
1083 s.sprintf(
"%04d.%02d.%02d-%02d:%02d:%05.2f", nYear, nMonth, nDay, nHour, nMin, dSec);
1087 nYear -= (nYear/100)*100;
1088 s.sprintf(
"%02d/%02d/%02d %02d:%02d", nYear, nMonth, nDay, nHour, nMin);
1092 s.sprintf(
"%04d.%02d.%02d-%02d:%02d:%06.3f", nYear, nMonth, nDay, nHour, nMin, dSec);
1098 s.sprintf(
"%04d.%03d.%02d:%02d:%05.2f", nYear,
calcDayOfYear(), nHour, nMin, dSec);
1113 s.sprintf(
"%02d:%03d:%05d",
1136 s.sprintf(
"%04d %02d %02d", nYear, nMonth, nDay);
1140 s.sprintf(
"%04d.%02d.%02d", nYear, nMonth, nDay);
1144 s.sprintf(
"%02d%s%02d", nYear-100*(nYear/100),
shortMonthNames_[nMonth-1], nDay);
1156 s.sprintf(
"%02d:%03d", nYear-100*(nYear/100),
calcDayOfYear());
1171 s.sprintf(
"%02d:%02d:%04.1f", nHour, nMin, dSec);
1175 s.sprintf(
"%02d:%02d:%02d", nHour, nMin, (
int)floor(dSec));
1186 s.sprintf(
"%02d:%02d", nHour, nMin);
1198 if (1<=dayOfWeek && dayOfWeek<=7)
1203 QString().sprintf(
": dayOfWeek2Str(): for the date %d dayOfWeek (%d) is out of ranges",
1215 if (1<=dayOfWeek && dayOfWeek<=7)
1220 QString().sprintf(
": dayOfWeek2LongStr(): for the date %d dayOfWeek (%d) is out of ranges",
1235 QDateTime d(QDate(yr, mn, dy), QTime(hr, mi, (
int)(round(sc))), Qt::LocalTime);
1236 QDateTime dUtc = d.toUTC();
1237 SgMJD epoch(dUtc.date().year(), dUtc.date().month(), dUtc.date().day(),
1238 dUtc.time().hour(), dUtc.time().minute(),
1239 dUtc.time().second()+dUtc.time().msec()*0.001);
1252 QDateTime d(QDate(yr, mn, dy), QTime(hr, mi, (
int)(round(sc))), Qt::UTC);
1253 QDateTime dLoc = d.toLocalTime();
1254 SgMJD epoch(dLoc.date().year(), dLoc.date().month(), dLoc.date().day(),
1255 dLoc.time().hour(), dLoc.time().minute(),
1256 dLoc.time().second()+dLoc.time().msec()*0.001);
1265 double dGmst, dGmst0h=0.0, dT_u=0.0, dT_u2=0.0, r;
1283 dGmst0h = (24110.54841 + 8640184.812866*dT_u + 0.093104*dT_u2 - 6.2e-6*dT_u*dT_u2)/
DAY2SEC;
1288 r = 1.002737909350795 + 5.9006e-11*dT_u - 5.9e-15*dT_u2;
1293 dGmst = dGmst0h + r*
time_;
1294 dGmst = fmod(dGmst, 1.0);
1308 dSec = 1.0e-8*round(dSec*1.0e8);
1317 if (s.status() != QDataStream::Ok)
1320 ": saveIntermediateResults(): error writting data");
1323 return s.status() == QDataStream::Ok;
1335 if (s.status() != QDataStream::Ok)
1338 ": loadIntermediateResults(): error reading data: " +
1339 (s.status()==QDataStream::ReadPastEnd?
"read past end of the file":
"read corrupt data"));
1345 return s.status()==QDataStream::Ok;
1372 int nYears=0, nMonths=0, nDays=0, nHours=0, nMins=0;
1375 bool isSignPositive=(days>=0.0);
1377 if (!isSignPositive)
1385 nYears = (int)floor(days/365.25);
1386 days -= 365.25*nYears;
1390 nMonths = (int)floor(days*12.0/365.25);
1391 days -= nMonths*365.25/12.0;
1395 nDays = (int)floor(days);
1396 days -= (double)nDays;
1401 nHours = (int)(days/3600.0);
1402 nMins = (int)((days - 3600.0*nHours)/60.0);
1403 dSecs = days - 3600.0*nHours - 60.0*nMins;
1405 if (nYears==0 && nMonths==0 && nDays==0 && nHours==0 && nMins==0 && dSecs<1.0)
1406 str += QString().sprintf(
"%.6g sec", dSecs);
1410 str += QString().sprintf(
"%d year%s ", nYears, nYears==1?
"":
"s");
1412 str += QString().sprintf(
"%d month%s ", nMonths, nMonths==1?
"":
"s");
1414 str += QString().sprintf(
"%d day%s ", nDays, nDays==1?
"":
"s");
1416 str += QString().sprintf(
"%02dhr ", nHours);
1418 str += QString().sprintf(
"%02dmin ", nMins);
1419 str += QString().sprintf(
"%05.2fsec", dSecs);
1423 if (!isSignPositive)
1440 "Jan",
"Feb",
"Mar",
"Apr",
"May",
"Jun",
1441 "Jul",
"Aug",
"Sep",
"Oct",
"Nov",
"Dec"
1446 "January",
"February",
"March",
"April",
"May",
"June",
1447 "July",
"August",
"September",
"October",
"November",
"December"
1452 "Mon",
"Tue",
"Wed",
"Thu",
"Fri",
"Sat",
"Sun"
1457 "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