source: ntrip/branches/BNC_2.12/src/bnctime.cpp @ 8089

Last change on this file since 8089 was 7138, checked in by stuerze, 4 years ago

method added to set TOE from BDS week and sec

File size: 9.8 KB
Line 
1
2#include <qdatetime.h>
3#include <time.h>
4#include <cmath>
5#include <cstdio>
6#include <sstream>
7#include <iomanip>
8
9#include "bnctime.h"
10#include "bncutils.h"
11
12using namespace std;
13
14// Constructor
15//////////////////////////////////////////////////////////////////////////////
16bncTime::bncTime(int gpsw, double gpssec) {
17  this->set(gpsw, gpssec);
18}
19 
20// Constructor (from ISO String yyyy-mm-ddThh:mm:ss)
21//////////////////////////////////////////////////////////////////////////////
22bncTime::bncTime(const std::string& isoString) {
23  if (!isoString.empty()) {
24    QDateTime dt = QDateTime::fromString(isoString.c_str(), Qt::ISODate);
25    this->set(dt.date().year(), dt.date().month(), dt.date().day(),
26              dt.time().hour(), dt.time().minute(), 
27              dt.time().second() + dt.time().msec()/1000.0);
28  }
29  else {
30    this->reset();
31  }
32}
33
34//
35//////////////////////////////////////////////////////////////////////////////
36bncTime& bncTime::set(int gpsw, double gpssec) {
37  int  deltad;
38  int  dow = 0;
39  while ( gpssec >= 86400 ) {
40    gpssec-=86400;
41    dow++;
42  }
43  while ( gpssec <  0 ) {
44    gpssec+=86400;
45    dow--;
46  }
47  deltad = gpsw*7 + dow;
48  _mjd = 44244 + deltad;
49  _sec = gpssec;
50  return *this;
51}
52
53
54//
55//////////////////////////////////////////////////////////////////////////////
56bncTime& bncTime::setBDS(int gpsw, double gpssec) {
57  int  deltad;
58  int  dow = 0;
59  gpssec += 14.0;
60  gpsw   += 1356.0;
61  while ( gpssec >= 86400 ) {
62    gpssec-=86400;
63    dow++;
64  }
65  while ( gpssec <  0 ) {
66    gpssec+=86400;
67    dow--;
68  }
69  deltad = gpsw*7 + dow;
70  _mjd = 44244 + deltad;
71  _sec = gpssec;
72  return *this;
73}
74
75//
76//////////////////////////////////////////////////////////////////////////////
77bncTime &bncTime::set(int msec) {
78  int week;
79  double sec;
80
81  currentGPSWeeks(week, sec);
82  if(msec/1000.0 < sec - 86400.0)
83    ++week;
84  return set(week, msec/1000.0);
85}
86
87//
88//////////////////////////////////////////////////////////////////////////////
89bncTime &bncTime::setTOD(int msec) {
90  int week;
91  double sec;
92
93  currentGPSWeeks(week, sec);
94  int intsec = sec;
95  int day = intsec/(24*60*60);
96  int tod = (intsec%(24*60*60))*1000;
97  if(msec > 19*60*60*1000 && tod < 5*60*60*1000)
98    --day;
99  else if(msec < 5*60*60 && tod > 19*60*60*1000)
100    ++day;
101  msec += day*24*60*60*1000;
102  if(msec < 0.0) {
103    msec += 7*24*60*60*1000;
104    --week;
105  }
106
107  return set(week, msec/1000.0);
108}
109
110//
111//////////////////////////////////////////////////////////////////////////////
112bncTime &bncTime::setTk(int msec) {
113  int week;
114  double sec;
115  int intsec;
116
117  currentGPSWeeks(week, sec);
118  intsec = sec;
119  updatetime(&week, &intsec, msec, 0); /* Moscow -> GPS */
120  sec = intsec+(msec%1000)/1000.0;
121  return set(week, sec);
122}
123
124//
125//////////////////////////////////////////////////////////////////////////////
126bncTime &bncTime::setBDS(int msec) {
127  int week;
128  double sec;
129
130  msec += 14000;
131  if(msec >= 7*24*60*60*1000)
132    msec -= 7*24*60*60*1000;
133  currentGPSWeeks(week, sec);
134  if(msec/1000.0 < sec - 86400.0)
135    ++week;
136  return set(week, msec/1000.0);
137}
138
139//
140//////////////////////////////////////////////////////////////////////////////
141bncTime& bncTime::setmjd(double daysec, int mjd) {
142  _sec = daysec;
143  _mjd = mjd;
144  while ( _sec >= 86400 ) {
145    _sec-=86400;
146    _mjd++;
147  }
148  while ( _sec <  0 ) {
149    _sec+=86400;
150    _mjd--;
151  }
152  return *this;
153}
154
155//
156//////////////////////////////////////////////////////////////////////////////
157bncTime& bncTime::setmjd(double mjddec) {
158  _mjd = static_cast<unsigned int>(mjddec);
159  _sec = (mjddec - _mjd)*86400.0;
160  return *this;
161}
162
163//
164//////////////////////////////////////////////////////////////////////////////
165unsigned int bncTime::mjd() const {
166  return _mjd;
167}
168 
169//
170//////////////////////////////////////////////////////////////////////////////
171double bncTime::daysec() const {
172  return _sec;
173}
174
175//
176//////////////////////////////////////////////////////////////////////////////
177unsigned int bncTime::gpsw() const {
178  double   gsec;
179  long     gpsw;
180  jdgp(_mjd, gsec, gpsw);
181  return (int)gpsw;
182}
183
184//
185//////////////////////////////////////////////////////////////////////////////
186double bncTime::gpssec() const {
187  double   gsec;
188  long     gpsw;
189  jdgp(_mjd, gsec, gpsw);
190  return gsec + _sec;
191}
192
193//
194//////////////////////////////////////////////////////////////////////////////
195unsigned int bncTime::bdsw() const {
196  double   gsec;
197  long     gpsw;
198  jdgp(_mjd, gsec, gpsw);
199  if(gsec <= 14.0)
200    gpsw -= 1;
201  return (int)gpsw-1356;
202}
203
204//
205//////////////////////////////////////////////////////////////////////////////
206double bncTime::bdssec() const {
207  double   gsec;
208  long     gpsw;
209  jdgp(_mjd, gsec, gpsw);
210  if(gsec <= 14.0)
211    gsec += 7.0*24.0*60.0*60.0-14.0;
212  else
213    gsec -= 14.0;
214  return gsec + _sec;
215}
216
217//
218//////////////////////////////////////////////////////////////////////////////
219bool bncTime::operator!=(const bncTime &time1) const {
220  if ( fabs((*this) - time1) > 0.000000000001 ) {
221    return true;
222  }
223  else {
224    return false;
225  }
226}
227
228//
229//////////////////////////////////////////////////////////////////////////////
230bool bncTime::operator==(const bncTime &time1) const {
231  if ( fabs((*this) - time1) < 0.000000000001 ) {
232    return true;
233  }
234  else {
235    return false;
236  }
237}
238
239//
240//////////////////////////////////////////////////////////////////////////////
241bool bncTime::operator>(const bncTime &time1) const {
242  if ( ((*this) - time1) > 0.0 ) {
243    return true;
244  }
245  else {
246    return false;
247  }
248}
249
250//
251//////////////////////////////////////////////////////////////////////////////
252bool bncTime::operator>=(const bncTime &time1) const {
253  if ( ((*this) - time1) >= 0.0 ) {
254    return true;
255  }
256  else {
257    return false;
258  }
259}
260
261//
262//////////////////////////////////////////////////////////////////////////////
263bool bncTime::operator<(const bncTime &time1) const {
264  if ( ((*this) - time1) < 0.0 ) {
265    return true;
266  }
267  else {
268    return false;
269  }
270}
271
272//
273//////////////////////////////////////////////////////////////////////////////
274bool bncTime::operator<=(const bncTime &time1) const {
275  if ( ((*this) - time1) <= 0.0 ) {
276    return true;
277  }
278  else {
279    return false;
280  }
281}
282
283//
284//////////////////////////////////////////////////////////////////////////////
285bncTime bncTime::operator+(double sec) const {
286  int     mjd    = this->mjd();
287  double  daysec = this->daysec();
288  daysec+=sec;
289  return bncTime().setmjd(daysec, mjd);
290}
291
292//
293//////////////////////////////////////////////////////////////////////////////
294bncTime bncTime::operator-(double sec) const {
295  return (*this) + (-sec);
296}
297
298//
299//////////////////////////////////////////////////////////////////////////////
300double bncTime::operator-(const bncTime &time1) const {
301  int mjdDiff = this->_mjd - time1._mjd;
302  if ( mjdDiff != 0 ) {
303    return mjdDiff * 86400.0 + this->_sec - time1._sec;
304  }
305  else {
306    return this->_sec - time1._sec;
307  }
308}
309
310bncTime& bncTime::operator+=(double sec) {
311  _sec+=sec;
312
313  while ( _sec >= 86400 ) {
314    _sec-=86400;
315    _mjd++;
316  }
317  while ( _sec < 0 ) {
318    _sec+=86400;
319    _mjd--;
320  }
321
322  return *this;
323}
324
325//
326//////////////////////////////////////////////////////////////////////////////
327void bncTime::civil_date (unsigned int& year, unsigned int& month,
328                          unsigned int& day) const {
329  double day_d;
330  long int yy, mm;
331  jmt(_mjd, yy, mm, day_d);
332  year  = yy;
333  month = mm;
334  day   = static_cast<unsigned int>(day_d);
335}
336
337//
338//////////////////////////////////////////////////////////////////////////////
339void bncTime::civil_time(unsigned int &hour, unsigned int &min, 
340                          double &sec) const {
341  hour = static_cast<unsigned int>(_sec/3600.0);
342  min  = static_cast<unsigned int>((_sec - hour*3600)/60.0);
343  sec  = _sec - min*60 - hour*3600;
344  if (sec==60.0) {
345    min++;
346    sec=0;
347  }
348  if (min==60) {
349    hour++;
350    min=0;
351  }
352}
353
354//
355//////////////////////////////////////////////////////////////////////////////
356string bncTime::timestr(unsigned numdec, char sep) const {
357  ostringstream str;
358  unsigned int hour, minute;
359  double sec;
360  this->civil_time(hour, minute, sec);
361  unsigned sw;
362  if (numdec == 0) {
363    sw = 2;
364  }
365  else {
366    sw = numdec + 3;
367  }
368  double chk = 0.5;
369  for (unsigned int ii=0; ii<numdec; ii++) chk *= 0.1;
370  if (sec > (60.0-chk)) {
371    sec = 0;
372    minute++;
373    if (minute == 60) {
374      minute = 0;
375      hour++;
376    }
377  }
378  str.setf(ios::fixed);
379  str << setfill('0');
380  str << setw(2)  << hour;
381  if (sep) str << sep;
382  str << setw(2)  << minute;
383  if (sep) str << sep;
384  str << setw(sw) << setprecision(numdec) << sec;
385  return str.str();
386}
387
388//
389//////////////////////////////////////////////////////////////////////////////
390string bncTime::datestr(char sep) const {
391  unsigned int year, month, day;
392  civil_date(year,month,day);
393  ostringstream str;
394  str.setf(ios::fixed);
395  str << setfill('0');
396  str << setw(4)  << year;
397  if (sep) str << sep;
398  str << setw(2)  << month;
399  if (sep) str << sep;
400  str << setw(2)  << day;
401  return str.str();
402}
403
404//
405//////////////////////////////////////////////////////////////////////////////
406bncTime::operator std::string() const {
407  return datestr() + '_' + timestr();
408}
409
410//
411//////////////////////////////////////////////////////////////////////////////
412bncTime& bncTime::set(int year, int month, int day, 
413                      int hour, int min, double sec) {
414  return set(year, month, day, hour*3600 + min*60 + sec);
415}
416
417//
418//////////////////////////////////////////////////////////////////////////////
419bncTime& bncTime::setBDS(int year, int month, int day, 
420                      int hour, int min, double sec) {
421  return set(year, month, day, hour*3600 + min*60 + sec+14.0);
422}
423
424//
425//////////////////////////////////////////////////////////////////////////////
426bncTime& bncTime::set(int year, int month, int day, double daysec) {
427  _sec = daysec;
428 
429  _mjd = (unsigned int)djul(year, month, day);
430 
431  while ( _sec >= 86400 ) {
432    _sec-=86400;
433    _mjd++;
434  }
435  while ( _sec <  0 ) {
436    _sec+=86400;
437    _mjd--;
438  }
439
440  return *this;
441}
Note: See TracBrowser for help on using the repository browser.