julian-date.h
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2016 INESC TEC
4  * Copyright (c) 2021 CNES
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 as
8  * published by the Free Software Foundation;
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18  *
19  * Code from https://gitlab.inesctec.pt/pmms/ns3-satellite
20  *
21  * Author: Pedro Silva <pmms@inesctec.pt>
22  * Author: Bastien Tauran <bastien.tauran@viveris.fr>
23  */
24 
25 #ifndef JULIANDATE_H
26 #define JULIANDATE_H
27 
28 #include <ns3/nstime.h>
29 
30 #include <functional>
31 #include <ostream>
32 #include <stdint.h>
33 #include <string>
34 
35 namespace ns3
36 {
37 
44 struct DateTime
45 {
47  {
48  UTC,
49  UT1,
50  TAI,
51  TT,
52  GPST,
53  POSIX
54  };
55 
56  uint32_t year, month, day;
59 
60  friend std::ostream& operator<<(std::ostream& os, DateTime::TimeSystem ts);
61 };
62 
78 {
81 
82  public:
83  static const uint32_t PosixYear;
84  static const uint32_t MinYear;
85  static const uint32_t MaxYear;
86  static const double PosixEpoch;
87  static const uint32_t J2000Epoch;
88  static const uint32_t Posix1992;
89  static const uint32_t HourToMs;
90  static const uint32_t DayToMs;
91  static const Time TtToTai;
92  static const Time TaiToGps;
93 
97  JulianDate(void);
98 
107  JulianDate(double jd);
108 
114  JulianDate(uint32_t days, uint32_t ms_day);
115 
121  JulianDate(const std::string& date, TimeSystem ts = DateTime::UTC);
122 
128  double GetDouble(TimeSystem ts = DateTime::UTC) const;
129 
134  DateTime GetDateTime(void) const;
135 
140  DateTime GetDateTime(TimeSystem ts) const;
141 
151  std::string ToString(void) const;
152 
163  std::string ToString(TimeSystem ts) const;
164 
169  std::pair<double, double> GetPolarMotion(void) const;
170 
175  double GetOmegaEarth(void) const;
176 
181  double GetGmst(void) const;
182 
191  void SetDate(double jd);
192 
198  void SetDate(uint32_t days, uint32_t ms_day);
199 
205  void SetDate(const std::string& date, TimeSystem ts = DateTime::UTC);
206 
212  JulianDate operator+(const Time& t) const;
213 
218  void operator+=(const Time& t);
219 
225  JulianDate operator-(const Time& t) const;
226 
231  void operator-=(const Time& t);
232 
238  Time operator-(const JulianDate& jd) const;
239 
245  bool operator<(const JulianDate& jd) const;
246 
252  bool operator<=(const JulianDate& jd) const;
253 
259  bool operator>(const JulianDate& jd) const;
260 
266  bool operator>=(const JulianDate& jd) const;
267 
273  bool operator==(const JulianDate& jd) const;
274 
280  bool operator!=(const JulianDate& jd) const;
281 
292  friend std::ostream& operator<<(std::ostream& os, const JulianDate& jd);
293 
294  private:
303  static bool IsLeapYear(uint32_t year);
304 
310  static Time TaiMinusUtc(uint32_t daysInPosix);
311 
317  static Time Dut1(uint32_t daysInPosix);
318 
325  static DateTime GregorianDate(uint32_t days, uint32_t ms_day);
326 
333  static Time OffsetFromUtc(uint32_t daysInPosix, TimeSystem ts);
334 
342  static Time OffsetToUtc(uint32_t daysInPosix, uint32_t ms_day, TimeSystem ts);
343 
348  DateTime GregorianDate(void) const;
349 
358  Time OffsetFromUtc(void) const;
359 
368  Time OffsetToUtc(void) const;
369 
370  uint32_t m_days;
371  uint32_t m_ms_day;
373 };
374 
375 } // namespace ns3
376 
377 #endif /* JULIANDATE_H */
Class to handle Julian days and provide respective Earth Orientation Parameters (EOP).
Definition: julian-date.h:78
static bool IsLeapYear(uint32_t year)
Check if it is a leap year.
Definition: julian-date.cc:401
JulianDate(void)
Default constructor.
Definition: julian-date.cc:85
double GetGmst(void) const
Retrieve the Greenwich Mean Sidereal Time.
Definition: julian-date.cc:183
static const Time TaiToGps
offset from TAI to GPST
Definition: julian-date.h:92
void SetDate(double jd)
Set the Julian days.
Definition: julian-date.cc:214
uint32_t m_days
full days since epoch.
Definition: julian-date.h:370
double GetDouble(TimeSystem ts=DateTime::UTC) const
GetDouble Get the Julian days.
Definition: julian-date.cc:109
bool operator>(const JulianDate &jd) const
operator > (compare Julian dates).
Definition: julian-date.cc:353
bool operator==(const JulianDate &jd) const
operator == (compare Julian dates).
Definition: julian-date.cc:371
JulianDate operator-(const Time &t) const
operator - (negative time adjustment).
Definition: julian-date.cc:294
JulianDate operator+(const Time &t) const
operator + (positive time adjustment).
Definition: julian-date.cc:268
Time OffsetFromUtc(void) const
Returns the offset from UTC.
Definition: julian-date.cc:481
TimeSystem m_time_scale
external time system.
Definition: julian-date.h:372
static const uint32_t PosixYear
POSIX/Unix epoch year.
Definition: julian-date.h:83
static const uint32_t DayToMs
milliseconds in a day
Definition: julian-date.h:90
static const uint32_t MinYear
Minimum year supported.
Definition: julian-date.h:84
Time OffsetToUtc(void) const
Returns the offset to UTC.
Definition: julian-date.cc:514
static Time TaiMinusUtc(uint32_t daysInPosix)
The difference between TAI and UTC time systems.
Definition: julian-date.cc:409
static const Time TtToTai
offset from TT to TAI
Definition: julian-date.h:91
static const double PosixEpoch
1 Jan 1970, 0h
Definition: julian-date.h:86
uint32_t m_ms_day
milliseconds of the day.
Definition: julian-date.h:371
static const uint32_t HourToMs
milliseconds in an hour
Definition: julian-date.h:89
std::string ToString(void) const
Get the string representation of the Gregorian calendar date.
Definition: julian-date.cc:133
DateTime GetDateTime(void) const
Get the Gregorian calendar date in current time system.
Definition: julian-date.cc:121
bool operator<(const JulianDate &jd) const
operator < (compare Julian dates).
Definition: julian-date.cc:335
double GetOmegaEarth(void) const
Retrieve Earth's angular velocity.
Definition: julian-date.cc:170
bool operator!=(const JulianDate &jd) const
operator != (compare Julian dates).
Definition: julian-date.cc:380
static Time Dut1(uint32_t daysInPosix)
Retrieve the DUT1 (UT1 - UTC) value for a given day.
Definition: julian-date.cc:420
DateTime::TimeSystem TimeSystem
equivalent to C++11 using TimeSystem = DateTime::TimeSystem.
Definition: julian-date.h:80
std::pair< double, double > GetPolarMotion(void) const
Retrieve the polar motion cofficients measured/predicted.
Definition: julian-date.cc:157
DateTime GregorianDate(void) const
Convert into Gregorian calendar.
Definition: julian-date.cc:429
bool operator<=(const JulianDate &jd) const
operator <= (compare Julian dates).
Definition: julian-date.cc:344
friend std::ostream & operator<<(std::ostream &os, const JulianDate &jd)
operator << (print as GregorianDate).
Definition: julian-date.cc:389
bool operator>=(const JulianDate &jd) const
operator >= (compare Julian dates).
Definition: julian-date.cc:362
void operator+=(const Time &t)
operator += (positive time adjustment).
Definition: julian-date.cc:288
static const uint32_t J2000Epoch
1 Jan 2000, 12h
Definition: julian-date.h:87
void operator-=(const Time &t)
operator -= (negative time adjustment).
Definition: julian-date.cc:320
static const uint32_t Posix1992
1 Jan 1992 (POSIX days)
Definition: julian-date.h:88
static const uint32_t MaxYear
Maximum year supported.
Definition: julian-date.h:85
SatArqSequenceNumber is handling the sequence numbers for the ARQ process.
The DateTime struct.
Definition: julian-date.h:45
uint32_t year
Definition: julian-date.h:56
uint32_t day
Definition: julian-date.h:56
uint32_t minutes
Definition: julian-date.h:57
@ POSIX
Unix/POSIX Time.
Definition: julian-date.h:53
@ UTC
Coordinated Universal Time [French: Temps Universel Coordonné].
Definition: julian-date.h:48
@ TAI
International Atomic Time [French: Temps Atomique International].
Definition: julian-date.h:50
@ TT
Terrestrial Time.
Definition: julian-date.h:51
@ UT1
Universal Time.
Definition: julian-date.h:49
@ GPST
Global Positioning System (GPS) Time.
Definition: julian-date.h:52
TimeSystem time_system
Definition: julian-date.h:58
uint32_t seconds
Definition: julian-date.h:57
uint32_t month
Definition: julian-date.h:56
uint32_t hours
Definition: julian-date.h:57
uint32_t millisecs
Definition: julian-date.h:57
friend std::ostream & operator<<(std::ostream &os, DateTime::TimeSystem ts)
Definition: julian-date.cc:56