2011-03-24 15:55:10 +00:00
|
|
|
#ifndef JULIAN_H_
|
|
|
|
#define JULIAN_H_
|
|
|
|
|
|
|
|
#include "Globals.h"
|
2011-04-07 13:56:02 +00:00
|
|
|
#include "Timespan.h"
|
2011-03-24 15:55:10 +00:00
|
|
|
|
|
|
|
#include <ctime>
|
2011-05-27 09:40:19 +00:00
|
|
|
#include <iostream>
|
2011-03-24 15:55:10 +00:00
|
|
|
|
|
|
|
class Julian {
|
|
|
|
public:
|
|
|
|
Julian();
|
|
|
|
Julian(const Julian& jul);
|
|
|
|
Julian(const time_t t);
|
|
|
|
Julian(int year, double day);
|
|
|
|
Julian(int year, int mon, int day, int hour, int min, double sec);
|
|
|
|
|
2011-05-27 09:40:19 +00:00
|
|
|
~Julian() {
|
|
|
|
};
|
|
|
|
|
2011-06-10 19:34:39 +00:00
|
|
|
// comparison operators
|
2011-03-30 17:16:37 +00:00
|
|
|
bool operator==(const Julian &date) const;
|
|
|
|
bool operator!=(const Julian &date) const;
|
2011-04-05 14:06:45 +00:00
|
|
|
bool operator>(const Julian &date) const;
|
|
|
|
bool operator<(const Julian &date) const;
|
|
|
|
bool operator>=(const Julian &date) const;
|
|
|
|
bool operator<=(const Julian &date) const;
|
2011-03-30 17:16:37 +00:00
|
|
|
|
2011-06-10 19:34:39 +00:00
|
|
|
// assignment
|
|
|
|
Julian& operator =(const Julian& b);
|
|
|
|
Julian& operator =(const double b);
|
|
|
|
// arithmetic
|
|
|
|
Julian operator +(const Timespan& b) const;
|
|
|
|
Julian operator -(const Timespan& b) const;
|
|
|
|
Timespan operator -(const Julian& b) const;
|
|
|
|
// compound assignment
|
|
|
|
Julian & operator +=(const Timespan& b);
|
|
|
|
Julian & operator -=(const Timespan& b);
|
2011-06-08 14:05:33 +00:00
|
|
|
|
2011-05-27 09:40:19 +00:00
|
|
|
friend std::ostream & operator<<(std::ostream& stream, const Julian& julian);
|
2011-03-24 15:55:10 +00:00
|
|
|
|
2011-05-01 22:58:33 +00:00
|
|
|
struct DateTimeComponents {
|
2011-06-10 12:41:11 +00:00
|
|
|
|
|
|
|
DateTimeComponents()
|
|
|
|
: years(0), months(0), days(0),
|
|
|
|
hours(0), minutes(0), seconds(0.0) {
|
|
|
|
}
|
|
|
|
|
2011-05-01 22:58:33 +00:00
|
|
|
int years;
|
|
|
|
int months;
|
|
|
|
int days;
|
|
|
|
int hours;
|
|
|
|
int minutes;
|
|
|
|
double seconds;
|
|
|
|
};
|
|
|
|
|
2011-05-28 19:05:46 +00:00
|
|
|
void ToGregorian(struct DateTimeComponents* datetime) const;
|
2011-05-01 22:58:33 +00:00
|
|
|
|
2011-03-24 15:55:10 +00:00
|
|
|
time_t ToTime() const;
|
2011-04-03 10:48:47 +00:00
|
|
|
double ToGreenwichSiderealTime() const;
|
|
|
|
double ToLocalMeanSiderealTime(const double& lon) const;
|
2011-03-24 15:55:10 +00:00
|
|
|
|
|
|
|
double FromJan1_00h_1900() const {
|
2011-05-20 21:09:23 +00:00
|
|
|
return date_ - kEPOCH_JAN1_00H_1900;
|
2011-03-24 15:55:10 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
double FromJan1_12h_1900() const {
|
2011-05-20 21:09:23 +00:00
|
|
|
return date_ - kEPOCH_JAN1_12H_1900;
|
2011-03-24 15:55:10 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
double FromJan1_12h_2000() const {
|
2011-05-20 21:09:23 +00:00
|
|
|
return date_ - kEPOCH_JAN1_12H_2000;
|
2011-03-24 15:55:10 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
double GetDate() const {
|
|
|
|
return date_;
|
|
|
|
}
|
|
|
|
|
|
|
|
void AddDay(double day) {
|
|
|
|
date_ += day;
|
|
|
|
}
|
|
|
|
|
|
|
|
void AddHour(double hr) {
|
2011-05-20 21:09:23 +00:00
|
|
|
date_ += (hr / kHOURS_PER_DAY);
|
2011-03-24 15:55:10 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void AddMin(double min) {
|
2011-05-20 21:09:23 +00:00
|
|
|
date_ += (min / kMINUTES_PER_DAY);
|
2011-03-24 15:55:10 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void AddSec(double sec) {
|
2011-05-20 21:09:23 +00:00
|
|
|
date_ += (sec / kSECONDS_PER_DAY);
|
2011-03-24 15:55:10 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static bool IsLeapYear(int y) {
|
|
|
|
return (y % 4 == 0 && y % 100 != 0) || (y % 400 == 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
protected:
|
|
|
|
void Initialize(int year, double day);
|
|
|
|
void Initialize(int year, int mon, int day, int hour, int min, double sec);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* the stored julian date
|
|
|
|
*/
|
|
|
|
double date_;
|
|
|
|
};
|
|
|
|
|
|
|
|
#endif
|