/*************************************************************************** kstarsdatetime.h - K Desktop Planetarium ------------------- begin : Tue 05 May 2004 copyright : (C) 2001 by Jason Harris email : jharris@30doradus.org ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ #ifndef KSTARSDATETIME_H #define KSTARSDATETIME_H #define J2000 2451545.0 //Julian Date for noon on Jan 1, 2000 (epoch J2000) //defined here because this file is included in every other class. #define B1950 2433282.4235 // Julian date for Jan 0.9235, 1950 #define SIDEREALSECOND 1.002737909 //number of sidereal seconds in one solar second #include "libtdeedu/extdate/extdatetime.h" class dms; /**@class KStarsDateTime *@short Extension of ExtDateTime for KStars *Instead of an integer Julian Day, KStarsDateTime uses a long double Julian Day, *in which the fractional portion encodes the time of day to a precision of a less than a second. *Also adds Greenwich Sidereal Time. *@note Local time and Local sideral time are not handled here. Because they depend on the *geographic location, they are part of the GeoLocation class. *@sa GeoLocation::GSTtoLST() *@sa GeoLocation::UTtoLT() *@author Jason Harris *@version 1.0 */ class KStarsDateTime : public ExtDateTime { public: /** *@short Default constructor *Creates a date/time at J2000 (noon on Jan 1, 200) */ KStarsDateTime(); /** *@short Constructor *Creates a date/time at the specified Julian Day. *@p jd The Julian Day *@note this is overloaded from ExtDateTime. It does not allow for assigning the *time of day, because the jd argument is an integer */ KStarsDateTime( long int jd ); /** *@short Constructor *Creates a date/time at the specified Julian Day. *@p jd The Julian Day */ KStarsDateTime( double djd ); /** *@short Constructor *Creates a date/time at the specified Julian Day. *@p jd The Julian Day */ KStarsDateTime( long double djd ); /** *@short Copy constructor *@p kdt The KStarsDateTime object to copy. */ KStarsDateTime( const KStarsDateTime &kdt ); /** *@short Copy constructor *@p kdt The ExtDateTime object to copy. */ KStarsDateTime( const ExtDateTime &kdt ); /** *@short Constructor *Create a KStarsDateTimne based on the specified Date and Time. *@p _d The ExtDate to assign *@p _t The TQTime to assign */ KStarsDateTime( const ExtDate &_d, const TQTime &_t ); /** *Assign the (long double) Julian Day value, which includes the time of day *encoded in the fractional portion. *@p jd the Julian Day value to assign. */ void setDJD( long double jd ); /** *Assign the Date according to an ExtDate object. *@p d the ExtDate to assign */ void setDate( const ExtDate &d ); /** *Assign the Time according to a TQTime object. *@p t the TQTime to assign */ void setTime( const TQTime &t ); /** *Modify the Date/Time by adding a number of seconds. *@p s the number of seconds to add. The number can be negative. */ KStarsDateTime addSecs( long double s ) const { return KStarsDateTime( djd() + s/86400. ); } /** *Modify the Date/Time by adding a number of days. *@p nd the number of days to add. The number can be negative. */ KStarsDateTime addDays( int nd ) const { return KStarsDateTime( djd() + (long double)nd ); } bool operator == ( const KStarsDateTime &d ) const { return DJD == d.djd(); } bool operator != ( const KStarsDateTime &d ) const { return DJD != d.djd(); } bool operator < ( const KStarsDateTime &d ) const { return DJD < d.djd(); } bool operator <= ( const KStarsDateTime &d ) const { return DJD <= d.djd(); } bool operator > ( const KStarsDateTime &d ) const { return DJD > d.djd(); } bool operator >= ( const KStarsDateTime &d ) const { return DJD >= d.djd(); } /** *@return the date and time according to the CPU clock (note that this is not *necessarily UT) */ static KStarsDateTime tqcurrentDateTime(); /** *@return the julian day as a long double, including the time as the fractional portion. */ long double djd() const { return DJD; } /** *@return the fraction of the Julian Day corresponding to the current time. *Because the integer Julian Day value jd() is referenced to Noon on the current date, *jdFrac() ranges between values of -0.5 and +0.5 for the previous and next midnights, *respectively. */ double jdFrac() const { return ((time().hour()-12) + (time().minute() + (time().second() + time().msec()/1000.)/60.)/60.)/24.; } /** *@return the Julian Day value for the current date, but at 0h UT. *@note the returned value is always an integer value + 0.5. */ long double JDat0hUT() const { return int( djd() - 0.5 ) + 0.5; } /** *@return The Greenwich Sidereal Time *The Greenwich sidereal time is the Right Ascension coordinate that is currently transiting *the Prime Meridian at the Royal Observatory in Greenwich, UK (longitude=0.0) */ dms gst() const; /** *Convert a given Greenwich Sidereal Time to Universal Time (=Greenwich Mean Time). *@p GST the Greenwich Sidereal Time to convert to Universal Time. */ TQTime GSTtoUT( dms GST ) const; /** *@return the epoch value of the Date/Time. *@note the epoch is shorthand for the date, expressed as a floating-point year value. *@sa setFromEpoch() */ double epoch() const { return ( double( date().year() ) + double( date().dayOfYear() )/double( date().daysInYear() ) ); } /** *Set the Date/Time from an epoch value. *@p e the epoch value *@sa epoch() */ void setFromEpoch( double e ); private: /** *@return the Greenwich Sidereal Time at 0h UT on this object's Date *@note used internally by gst() and GSTtoUT() */ dms GSTat0hUT() const; long double DJD; }; #endif //KSTARSDATETIME_H