1 /***************************************************************************
2 kstarsdatetime.cpp - K Desktop Planetarium
4 begin : Tue 05 May 2004
5 copyright : (C) 2004 by Jason Harris
6 email : jharris@30doradus.org
7 ***************************************************************************/
9 /***************************************************************************
11 * This program is free software; you can redistribute it and/or modify *
12 * it under the terms of the GNU General Public License as published by *
13 * the Free Software Foundation; either version 2 of the License, or *
14 * (at your option) any later version. *
16 ***************************************************************************/
20 #include "kstarsdatetime.h"
21 #include "ksnumbers.h"
24 KStarsDateTime::KStarsDateTime() : ExtDateTime() {
28 KStarsDateTime::KStarsDateTime( long int _jd
) : ExtDateTime(){
29 setDJD( (long double)( _jd
) );
32 KStarsDateTime::KStarsDateTime( const KStarsDateTime
&kdt
) : ExtDateTime() {
36 KStarsDateTime::KStarsDateTime( const ExtDateTime
&edt
) : ExtDateTime( edt
) {
37 //don't call setDJD() because we don't need to compute the time; just set DJD directly
38 QTime _t
= edt
.time();
39 ExtDate _d
= edt
.date();
40 long double jdFrac
= ( _t
.hour()-12 + ( _t
.minute() + ( _t
.second() + _t
.msec()/1000.)/60.)/60.)/24.;
41 DJD
= (long double)( _d
.jd() ) + jdFrac
;
44 KStarsDateTime::KStarsDateTime( const ExtDate
&_d
, const QTime
&_t
) : ExtDateTime( _d
, _t
) {
45 //don't call setDJD() because we don't need to compute the time; just set DJD directly
46 long double jdFrac
= ( _t
.hour()-12 + ( _t
.minute() + ( _t
.second() + _t
.msec()/1000.)/60.)/60.)/24.;
47 DJD
= (long double)( _d
.jd() ) + jdFrac
;
50 KStarsDateTime::KStarsDateTime( double _jd
) : ExtDateTime() {
51 setDJD( (long double)_jd
);
54 KStarsDateTime::KStarsDateTime( long double _jd
) : ExtDateTime() {
58 KStarsDateTime
KStarsDateTime::currentDateTime() {
59 KStarsDateTime
dt( ExtDate::currentDate(), QTime::currentTime() );
60 if ( dt
.time().hour()==0 && dt
.time().minute()==0 ) // midnight or right after?
61 dt
.setDate( ExtDate::currentDate() ); // fetch date again
66 void KStarsDateTime::setDJD( long double _jd
) {
70 dd
.setJD( (long int)( _jd
+ 0.5 ) );
71 ExtDateTime::setDate( dd
);
73 double dayfrac
= _jd
- (double)( date().jd() ) + 0.5;
74 if ( dayfrac
> 1.0 ) dayfrac
-= 1.0;
75 double hour
= 24.*dayfrac
;
77 int m
= int( 60.*(hour
- h
) );
78 int s
= int( 60.*(60.*(hour
- h
) - m
) );
79 int ms
= int( 1000.*(60.*(60.*(hour
- h
) - m
) - s
) );
81 ExtDateTime::setTime( QTime( h
, m
, s
, ms
) );
84 void KStarsDateTime::setDate( const ExtDate
&_d
) {
85 //Save the JD fraction
86 long double jdFrac
= djd() - (long double)( date().jd() );
88 //set the integer portion of the JD and add back the JD fraction:
89 setDJD( (long double)_d
.jd() + jdFrac
);
92 void KStarsDateTime::setTime( const QTime
&_t
) {
93 KStarsDateTime
_dt( date(), _t
);
97 dms
KStarsDateTime::gst() const {
98 dms gst0
= GSTat0hUT();
100 double hr
= double( time().hour() );
101 double mn
= double( time().minute() );
102 double sc
= double( time().second() ) + double ( 0.001 * time().msec() );
103 double st
= (hr
+ ( mn
+ sc
/60.0)/60.0)*SIDEREALSECOND
;
105 dms gst
= dms( gst0
.Degrees() + st
*15.0 ).reduce();
109 dms
KStarsDateTime::GSTat0hUT() const {
112 // Mean greenwich sidereal time
113 KStarsDateTime
t0( date(), QTime( 0, 0, 0 ) );
114 long double s
= t0
.djd() - J2000
;
115 double t
= s
/36525.0;
116 double t1
= 6.697374558 + 2400.051336*t
+ 0.000025862*t
*t
+
119 // To obtain the apparent sidereal time, we have to correct the
120 // mean greenwich sidereal time with nutation in longitude multiplied
121 // by the cosine of the obliquity of the ecliptic. This correction
122 // is called nutation in right ascention, and may amount to 0.3 secs.
123 KSNumbers
num( t0
.djd() );
124 num
.obliquity()->SinCos( sinOb
, cosOb
);
126 // nutLong has to be in hours of time since t1 is hours of time.
127 double nutLong
= num
.dEcLong()*cosOb
/15.0;
135 QTime
KStarsDateTime::GSTtoUT( dms GST
) const {
136 dms gst0
= GSTat0hUT();
138 //dt is the number of sidereal hours since UT 0h.
139 double dt
= GST
.Hours() - gst0
.Hours();
140 while ( dt
< 0.0 ) dt
+= 24.0;
141 while ( dt
>= 24.0 ) dt
-= 24.0;
143 //convert to solar time. dt is now the number of hours since 0h UT.
144 dt
/= SIDEREALSECOND
;
147 int mn
= int( 60.0*( dt
- double( hr
) ) );
148 int sc
= int( 60.0*( 60.0*( dt
- double( hr
) ) - double( mn
) ) );
149 int ms
= int( 1000.0*( 60.0*( 60.0*( dt
- double(hr
) ) - double(mn
) ) - double(sc
) ) );
151 return( QTime( hr
, mn
, sc
, ms
) );
154 void KStarsDateTime::setFromEpoch( double epoch
) {
155 if (epoch
== 1950.0) {
156 setDJD( 2433282.4235 );
157 } else if ( epoch
== 2000.0 ) {
160 int year
= int( epoch
);
161 KStarsDateTime
dt( ExtDate( year
, 1, 1 ), QTime( 0, 0, 0 ) );
162 double days
= (double)(dt
.date().daysInYear())*( epoch
- (double)year
);
163 dt
= dt
.addSecs( days
*86400. ); //set date and time based on the number of days into the year