Kstars

kstarsdatetime.h
1 /*
2  SPDX-FileCopyrightText: 2001 Jason Harris <[email protected]>
3 
4  SPDX-License-Identifier: GPL-2.0-or-later
5 */
6 
7 #pragma once
8 
9 #include <QDateTime>
10 
11 #define J2000 2451545.0 //Julian Date for noon on Jan 1, 2000 (epoch J2000)
12 #define B1950 2433282.4235 // Julian date for Jan 0.9235, 1950
13 #define SIDEREALSECOND 1.002737909 //number of sidereal seconds in one solar second
14 
15 class dms;
16 
17 /** @class KStarsDateTime
18  *@short Extension of QDateTime for KStars
19  *KStarsDateTime can represent the date/time as a Julian Day, using a long double,
20  *in which the fractional portion encodes the time of day to a precision of a less than a second.
21  *Also adds Greenwich Sidereal Time and "epoch", which is just the date expressed as a floating
22  *point number representing the year, with the fractional part representing the date and time
23  *(with poor time resolution; typically the Epoch is only taken to the hundredths place, which is
24  *a few days).
25  *@note Local time and Local sideral time are not handled here. Because they depend on the
26  *geographic location, they are part of the GeoLocation class.
27  *@note The default timespec is UTC unless the passed value has different timespec value.
28  *@sa GeoLocation::GSTtoLST()
29  *@sa GeoLocation::UTtoLT()
30  *@author Jason Harris
31  *@author Jasem Mutlaq
32  *@version 1.1
33  */
34 
35 class KStarsDateTime : public QDateTime
36 {
37  public:
38  /**
39  *@short Default constructor
40  *Creates a date/time at J2000 (noon on Jan 1, 200)
41  *@note This sets the timespec to UTC.
42  */
44 
45  /**
46  *@short Constructor
47  *Creates a date/time at the specified Julian Day.
48  *@p jd The Julian Day
49  *@note This sets the timespec to UTC.
50  */
51  explicit KStarsDateTime(long double djd);
52 
53  /**
54  *@short Copy constructor
55  *@p kdt The KStarsDateTime object to copy.
56  *@note The timespec is copied from kdt.
57  */
58  /** @{ */
59  KStarsDateTime(const KStarsDateTime &kdt);
60  KStarsDateTime &operator=(const KStarsDateTime &kdt) noexcept;
61  /** @} */
62 
63  /**
64  *@short Copy constructor
65  *@p qdt The QDateTime object to copy.
66  *@note The timespec is copied from qdt.
67  */
68  explicit KStarsDateTime(const QDateTime &qdt);
69 
70  /**
71  *@short Constructor
72  *Create a KStarsDateTimne based on the specified Date and Time.
73  *@p _d The QDate to assign
74  *@p _t The QTime to assign
75  *@p timespec The desired timespec, UTC by default.
76  */
77  KStarsDateTime(const QDate &_d, const QTime &_t, Qt::TimeSpec timeSpec = Qt::UTC);
78 
79  /**
80  *Assign the static_cast<long double> Julian Day value, which includes the time of day
81  *encoded in the fractional portion.
82  *@p jd the Julian Day value to assign.
83  */
84  void setDJD(long double jd);
85 
86  /**
87  *Assign the Date according to a QDate object.
88  *@p d the QDate to assign
89  */
90  void setDate(const QDate &d);
91 
92  /**
93  *Assign the Time according to a QTime object.
94  *@p t the QTime to assign
95  *@note timespec is NOT changed even if the passed QTime has a different timespec than current.
96  */
97  void setTime(const QTime &t);
98 
99  /**
100  *@return a KStarsDateTime that is the given number of seconds later
101  *than this KStarsDateTime.
102  *@p s the number of seconds to add. The number can be negative.
103  */
104  KStarsDateTime addSecs(double s) const;
105 
106  /**
107  *Modify the Date/Time by adding a number of days.
108  *@p nd the number of days to add. The number can be negative.
109  */
110  inline KStarsDateTime addDays(int nd) const
111  {
112  KStarsDateTime kdt(djd() + static_cast<long double>(nd));
113  kdt.setTimeSpec(timeSpec());
114  return kdt;
115  }
116 
117  inline bool operator==(const KStarsDateTime &d) const
118  {
119  return DJD == d.djd();
120  }
121  inline bool operator!=(const KStarsDateTime &d) const
122  {
123  return DJD != d.djd();
124  }
125  inline bool operator<(const KStarsDateTime &d) const
126  {
127  return DJD < d.djd();
128  }
129  inline bool operator<=(const KStarsDateTime &d) const
130  {
131  return DJD <= d.djd();
132  }
133  inline bool operator>(const KStarsDateTime &d) const
134  {
135  return DJD > d.djd();
136  }
137  inline bool operator>=(const KStarsDateTime &d) const
138  {
139  return DJD >= d.djd();
140  }
141 
142  /**
143  *@return the date and time according to the CPU clock
144  */
146 
147  /**
148  *@return the UTC date and time according to the CPU clock
149  */
151 
152  /**
153  *@return a KStarsDateTime object parsed from the given string.
154  *@note This function is format-agnostic; it will try several formats
155  *when parsing the string.
156  *@param s the string expressing the date/time to be parsed.
157  */
158  static KStarsDateTime fromString(const QString &s);
159 
160  /**
161  *@return the julian day as a long double, including the time as the fractional portion.
162  */
163  inline long double djd() const
164  {
165  return DJD;
166  }
167 
168  /**
169  *@return The Greenwich Sidereal Time
170  *The Greenwich sidereal time is the Right Ascension coordinate that is currently transiting
171  *the Prime Meridian at the Royal Observatory in Greenwich, UK (longitude=0.0)
172  */
173  dms gst() const;
174 
175  /**
176  *Convert a given Greenwich Sidereal Time to Universal Time (=Greenwich Mean Time).
177  *@p GST the Greenwich Sidereal Time to convert to Universal Time.
178  */
179  QTime GSTtoUT(dms GST) const; // FIXME: Shouldn't this be static?
180 
181  /**
182  *@enum EpochType description options
183  *@note After 1976, the IAU standard for epochs is Julian Years.
184  */
186  {
187  JULIAN, /**< Julian epoch (see http://scienceworld.wolfram.com/astronomy/JulianEpoch.html) */
188  BESSELIAN, /**< Besselian epoch (see http://scienceworld.wolfram.com/astronomy/BesselianEpoch.html) */
189  };
190 
191  /**
192  *@return the (Julian) epoch value of the Date/Time.
193  *@short This is (approximately) the year expressed as a floating-point value
194  *@sa setFromEpoch()
195  *@note The definition of Julian Epoch used here comes from http://scienceworld.wolfram.com/astronomy/JulianEpoch.html
196  */
197  inline double epoch() const
198  {
199  return 2000.0 + (djd() - J2000) / 365.25;
200  }
201 
202  /**
203  *Set the Date/Time from an epoch value, represented as a double.
204  *@p e the epoch value
205  *@sa epoch()
206  */
207  bool setFromEpoch(double e, EpochType type);
208 
209  /**
210  *Set the Date/Time from an epoch value, represented as a string.
211  *@p e the epoch value
212  *@return true if date set successfully
213  *@sa epoch()
214  */
215  bool setFromEpoch(const QString &e);
216 
217  /**
218  *Set the Date/Time from an epoch value, represented as a double.
219  *@p e the epoch value
220  *@note This method assumes that the epoch 1950.0 is Besselian, otherwise assumes that the epoch is a Julian epoch. This is provided for backward compatibility, and because custom catalogs may still use 1950.0 to mean B1950.0 despite the IAU standard for epochs being Julian.
221  *@sa epoch()
222  */
223  void setFromEpoch(double e);
224 
225  /**
226  *@short Takes in an epoch and returns a Julian Date
227  *@return the Julian Date (date with fraction)
228  *@param epoch A floating-point year value specifying the Epoch
229  *@param type JULIAN or BESSELIAN depending on what convention the epoch is specified in
230  */
231  static long double epochToJd(double epoch, EpochType type = JULIAN);
232 
233  /**
234  *@short Takes in a Julian Date and returns the corresponding epoch year in the given system
235  *@return the epoch as a floating-point year value
236  *@param jd Julian date
237  *@param type Epoch system (KStarsDateTime::JULIAN or KStarsDateTime::BESSELIAN)
238  */
239  static double jdToEpoch(long double jd, EpochType type = JULIAN);
240 
241  /**
242  *@short Takes in a string and returns a Julian epoch
243  */
244  static double stringToEpoch(const QString &eName, bool &ok);
245 
246  /**
247  * The following values were obtained from Eric Weisstein's world of science:
248  * http://scienceworld.wolfram.com/astronomy/BesselianEpoch.html
249  */
250  constexpr static const double B1900 = 2415020.31352; // Julian date of B1900 epoch
251  constexpr static const double JD_PER_BYEAR = 365.242198781; // Julian days in a Besselian year
252  private:
253  /**
254  *@return the Greenwich Sidereal Time at 0h UT on this object's Date
255  *@note used internally by gst() and GSTtoUT()
256  */
257  dms GSTat0hUT() const;
258 
259  long double DJD { 0 };
260 };
KStarsDateTime()
Default constructor Creates a date/time at J2000 (noon on Jan 1, 200)
static KStarsDateTime currentDateTime()
Extension of QDateTime for KStars KStarsDateTime can represent the date/time as a Julian Day,...
KStarsDateTime addDays(int nd) const
Modify the Date/Time by adding a number of days.
long double djd() const
TimeSpec
@ BESSELIAN
Besselian epoch (see http://scienceworld.wolfram.com/astronomy/BesselianEpoch.html)
static KStarsDateTime fromString(const QString &s)
static KStarsDateTime currentDateTimeUtc()
constexpr static const double B1900
The following values were obtained from Eric Weisstein's world of science: http://scienceworld....
KStarsDateTime addSecs(double s) const
void setTime(const QTime &t)
Assign the Time according to a QTime object.
bool setFromEpoch(double e, EpochType type)
Set the Date/Time from an epoch value, represented as a double.
double epoch() const
This is (approximately) the year expressed as a floating-point value.
static double jdToEpoch(long double jd, EpochType type=JULIAN)
Takes in a Julian Date and returns the corresponding epoch year in the given system.
static double stringToEpoch(const QString &eName, bool &ok)
Takes in a string and returns a Julian epoch.
void setTimeSpec(Qt::TimeSpec spec)
static long double epochToJd(double epoch, EpochType type=JULIAN)
Takes in an epoch and returns a Julian Date.
void setDate(const QDate &d)
Assign the Date according to a QDate object.
An angle, stored as degrees, but expressible in many ways.
Definition: dms.h:37
@ JULIAN
Julian epoch (see http://scienceworld.wolfram.com/astronomy/JulianEpoch.html)
Qt::TimeSpec timeSpec() const const
QTime GSTtoUT(dms GST) const
Convert a given Greenwich Sidereal Time to Universal Time (=Greenwich Mean Time).
void setDJD(long double jd)
Assign the static_cast<long double> Julian Day value, which includes the time of day encoded in the f...
This file is part of the KDE documentation.
Documentation copyright © 1996-2023 The KDE developers.
Generated on Tue Sep 26 2023 03:55:47 by doxygen 1.8.17 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.