• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdeedu API Reference
  • KDE Home
  • Contact Us
 

kstars

  • sources
  • kde-4.12
  • kdeedu
  • kstars
  • kstars
kstarsdatetime.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  kstarsdatetime.cpp - K Desktop Planetarium
3  -------------------
4  begin : Tue 05 May 2004
5  copyright : (C) 2004 by Jason Harris
6  email : jharris@30doradus.org
7 ***************************************************************************/
8 
9 /***************************************************************************
10  * *
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. *
15  * *
16  ***************************************************************************/
17 
18 #include "kstarsdatetime.h"
19 
20 #include <kdebug.h>
21 #include <klocale.h>
22 
23 #include "ksnumbers.h"
24 #include "dms.h"
25 
26 KStarsDateTime::KStarsDateTime() : KDateTime()
27 {
28  setDJD( J2000 );
29 }
30 
31 KStarsDateTime::KStarsDateTime( const KStarsDateTime &kdt ) : KDateTime()
32 {
33  setDJD( kdt.djd() );
34 }
35 
36 KStarsDateTime::KStarsDateTime( const KDateTime &kdt ) :
37  KDateTime( kdt )
38 {
39  //don't call setDJD() because we don't need to compute the time; just set DJD directly
40  QTime _t = kdt.time();
41  QDate _d = kdt.date();
42  long double jdFrac = ( _t.hour()-12 + ( _t.minute() + ( _t.second() + _t.msec()/1000.)/60.)/60.)/24.;
43  DJD = (long double)( _d.toJulianDay() ) + jdFrac;
44 }
45 
46 KStarsDateTime::KStarsDateTime( const QDateTime &qdt ) :
47  KDateTime( qdt, KDateTime::Spec::UTC() )
48 {
49  QTime _t = qdt.time();
50  QDate _d = qdt.date();
51  long double jdFrac = ( _t.hour()-12 + ( _t.minute() + ( _t.second() + _t.msec()/1000.)/60.)/60.)/24.;
52  DJD = (long double)( _d.toJulianDay() ) + jdFrac;
53 }
54 
55 KStarsDateTime::KStarsDateTime( const QDate &_d, const QTime &_t ) :
56  KDateTime( _d, _t, KDateTime::Spec::UTC() )
57 {
58  //don't call setDJD() because we don't need to compute the time; just set DJD directly
59  long double jdFrac = ( _t.hour()-12 + ( _t.minute() + ( _t.second() + _t.msec()/1000.)/60.)/60.)/24.;
60  DJD = (long double)( _d.toJulianDay() ) + jdFrac;
61 }
62 
63 KStarsDateTime::KStarsDateTime( long double _jd ) : KDateTime() {
64  setDJD( _jd );
65 }
66 
67 KStarsDateTime KStarsDateTime::currentDateTime( KDateTime::Spec spec ) {
68  KStarsDateTime dt( KDateTime::currentDateTime(spec) );
69  if ( dt.time().hour()==0 && dt.time().minute()==0 ) // midnight or right after?
70  dt.setDate( KDateTime::currentDateTime(spec).date() ); // fetch date again
71 
72  return dt;
73 }
74 
75 KStarsDateTime KStarsDateTime::fromString( const QString &s ) {
76  //DEBUG
77  kDebug() << "Date string: " << s;
78 
79  KStarsDateTime dtResult = KDateTime::fromString( s, KDateTime::QtTextDate );
80  if ( dtResult.isValid() )
81  return dtResult;
82 
83  dtResult = KDateTime::fromString( s, KDateTime::ISODate );
84  if ( dtResult.isValid() )
85  return dtResult;
86 
87  dtResult = KDateTime::fromString( s, KDateTime::RFCDate );
88  if ( dtResult.isValid() )
89  return dtResult;
90 
91  kWarning() << i18n( "Could not parse Date/Time string: " ) << s ;
92  kWarning() << i18n( "Valid date formats: " ) ;
93  kWarning() << " 1950-02-25 ; 1950-02-25T05:30:00" ;
94  kWarning() << " 25 Feb 1950 ; 25 Feb 1950 05:30:00" ;
95  kWarning() << " Sat Feb 25 1950 ; Sat Feb 25 05:30:00 1950";
96  return KStarsDateTime( KDateTime() ); //invalid
97 }
98 
99 void KStarsDateTime::setDJD( long double _jd ) {
100  KDateTime::setTimeSpec( KDateTime::Spec::UTC() );
101 
102  DJD = _jd;
103  long int ijd = (long int)_jd;
104  double dayfrac = _jd - (double)ijd + 0.5;
105  if ( dayfrac > 1.0 ) { ijd++; dayfrac -= 1.0; }
106 
107  QDate dd = QDate::fromJulianDay( ijd );
108  KDateTime::setDate( dd );
109 
110  double hour = 24.*dayfrac;
111  int h = int(hour);
112  int m = int( 60.*(hour - h) );
113  int s = int( 60.*(60.*(hour - h) - m) );
114  int ms = int( 1000.*(60.*(60.*(hour - h) - m) - s) );
115 
116  KDateTime::setTime( QTime( h, m, s, ms ) );
117 }
118 
119 void KStarsDateTime::setDate( const QDate &_d ) {
120  //Save the JD fraction
121  long double jdFrac = djd() - (long double)( date().toJulianDay() );
122 
123  //set the integer portion of the JD and add back the JD fraction:
124  setDJD( (long double)_d.toJulianDay() + jdFrac );
125 }
126 
127 KStarsDateTime KStarsDateTime::addSecs( double s ) const {
128  long double ds = (long double)s/86400.;
129  KStarsDateTime kdt( djd() + ds );
130  return kdt;
131 }
132 
133 void KStarsDateTime::setTime( const QTime &_t ) {
134  KStarsDateTime _dt( date(), _t );
135  setDJD( _dt.djd() );
136 }
137 
138 dms KStarsDateTime::gst() const {
139  dms gst0 = GSTat0hUT();
140 
141  double hr = double( time().hour() );
142  double mn = double( time().minute() );
143  double sc = double( time().second() ) + double ( 0.001 * time().msec() );
144  double st = (hr + ( mn + sc/60.0)/60.0)*SIDEREALSECOND;
145 
146  dms gst = dms( gst0.Degrees() + st*15.0 ).reduce();
147  return gst;
148 }
149 
150 dms KStarsDateTime::GSTat0hUT() const {
151  double sinOb, cosOb;
152 
153  // Mean greenwich sidereal time
154  KStarsDateTime t0( date(), QTime( 0, 0, 0 ) );
155  long double s = t0.djd() - J2000;
156  double t = s/36525.0;
157  double t1 = 6.697374558 + 2400.051336*t + 0.000025862*t*t +
158  0.000000002*t*t*t;
159 
160  // To obtain the apparent sidereal time, we have to correct the
161  // mean greenwich sidereal time with nutation in longitude multiplied
162  // by the cosine of the obliquity of the ecliptic. This correction
163  // is called nutation in right ascention, and may amount to 0.3 secs.
164  KSNumbers num( t0.djd() );
165  num.obliquity()->SinCos( sinOb, cosOb );
166 
167  // nutLong has to be in hours of time since t1 is hours of time.
168  double nutLong = num.dEcLong()*cosOb/15.0;
169  t1 += nutLong;
170 
171  dms gst;
172  gst.setH( t1 );
173  return gst.reduce();
174 }
175 
176 QTime KStarsDateTime::GSTtoUT( dms GST ) const {
177  dms gst0 = GSTat0hUT();
178 
179  //dt is the number of sidereal hours since UT 0h.
180  double dt = GST.Hours() - gst0.Hours();
181  while ( dt < 0.0 ) dt += 24.0;
182  while ( dt >= 24.0 ) dt -= 24.0;
183 
184  //convert to solar time. dt is now the number of hours since 0h UT.
185  dt /= SIDEREALSECOND;
186 
187  int hr = int( dt );
188  int mn = int( 60.0*( dt - double( hr ) ) );
189  int sc = int( 60.0*( 60.0*( dt - double( hr ) ) - double( mn ) ) );
190  int ms = int( 1000.0*( 60.0*( 60.0*( dt - double(hr) ) - double(mn) ) - double(sc) ) );
191 
192  return( QTime( hr, mn, sc, ms ) );
193 }
194 
195 bool KStarsDateTime::setFromEpoch( double epoch ) {
196  if (epoch == 1950.0) {
197  setDJD( 2433282.4235 );
198  return true;
199  } else if ( epoch == 2000.0 ) {
200  setDJD( J2000 );
201  return true;
202  } else {
203  int year = int( epoch );
204  KStarsDateTime dt( QDate( year, 1, 1 ), QTime( 0, 0, 0 ) );
205  double days = (double)(dt.date().daysInYear())*( epoch - (double)year );
206  dt = dt.addSecs( days*86400. ); //set date and time based on the number of days into the year
207 
208  if ( dt.isValid() ) {
209  setDJD( dt.djd() );
210  return true;
211  } else
212  return false;
213  }
214 }
215 
216 bool KStarsDateTime::setFromEpoch( const QString &eName ) {
217  bool result;
218  double epoch = eName.toDouble(&result);
219  if( !result )
220  return false;
221  return setFromEpoch( epoch );
222 }
KStarsDateTime::fromString
static KStarsDateTime fromString(const QString &s)
Definition: kstarsdatetime.cpp:75
KStarsDateTime::GSTtoUT
QTime GSTtoUT(dms GST) const
Convert a given Greenwich Sidereal Time to Universal Time (=Greenwich Mean Time). ...
Definition: kstarsdatetime.cpp:176
dms::Degrees
const double & Degrees() const
Definition: dms.h:98
KStarsDateTime::epoch
double epoch() const
Definition: kstarsdatetime.h:166
KStarsDateTime::setDate
void setDate(const QDate &d)
Assign the Date according to a QDate object.
Definition: kstarsdatetime.cpp:119
SIDEREALSECOND
#define SIDEREALSECOND
Definition: kstarsdatetime.h:23
KStarsDateTime::setTime
void setTime(const QTime &t)
Assign the Time according to a QTime object.
Definition: kstarsdatetime.cpp:133
KStarsDateTime::setFromEpoch
bool setFromEpoch(double e)
Set the Date/Time from an epoch value, represented as a double.
Definition: kstarsdatetime.cpp:195
dms.h
KStarsDateTime::currentDateTime
static KStarsDateTime currentDateTime(KDateTime::Spec ts=KDateTime::Spec::ClockTime())
Definition: kstarsdatetime.cpp:67
KStarsDateTime::djd
long double djd() const
Definition: kstarsdatetime.h:145
KStarsDateTime::addSecs
KStarsDateTime addSecs(double s) const
Definition: kstarsdatetime.cpp:127
KStarsDateTime
Extension of KDateTime for KStars KStarsDateTime can represent the date/time as a Julian Day...
Definition: kstarsdatetime.h:45
ksnumbers.h
KSNumbers::obliquity
const dms * obliquity() const
Definition: ksnumbers.h:58
dms
An angle, stored as degrees, but expressible in many ways.
Definition: dms.h:42
KDateTime
dms::Hours
double Hours() const
Definition: dms.h:125
KSNumbers
There are several time-dependent values used in position calculations, that are not specific to an ob...
Definition: ksnumbers.h:43
KStarsDateTime::KStarsDateTime
KStarsDateTime()
Default constructor Creates a date/time at J2000 (noon on Jan 1, 200)
Definition: kstarsdatetime.cpp:26
KStarsDateTime::setDJD
void setDJD(long double jd)
Assign the (long double) Julian Day value, which includes the time of day encoded in the fractional p...
Definition: kstarsdatetime.cpp:99
J2000
#define J2000
Definition: kstarsdatetime.h:21
kstarsdatetime.h
KStarsDateTime::gst
dms gst() const
Definition: kstarsdatetime.cpp:138
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:36:20 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

kstars

Skip menu "kstars"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdeedu API Reference

Skip menu "kdeedu API Reference"
  • Analitza
  •     lib
  • kalgebra
  • kalzium
  •   libscience
  • kanagram
  • kig
  •   lib
  • klettres
  • kstars
  • libkdeedu
  •   keduvocdocument
  • marble
  • parley
  • rocs
  •   App
  •   RocsCore
  •   VisualEditor
  •   stepcore

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal