MeteoIODoc  2.10.0
Date.h
Go to the documentation of this file.
1 // SPDX-License-Identifier: LGPL-3.0-or-later
2 /***********************************************************************************/
3 /* Copyright 2009 WSL Institute for Snow and Avalanche Research SLF-DAVOS */
4 /***********************************************************************************/
5 /* This file is part of MeteoIO.
6  MeteoIO is free software: you can redistribute it and/or modify
7  it under the terms of the GNU Lesser General Public License as published by
8  the Free Software Foundation, either version 3 of the License, or
9  (at your option) any later version.
10 
11  MeteoIO is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  GNU Lesser General Public License for more details.
15 
16  You should have received a copy of the GNU Lesser General Public License
17  along with MeteoIO. If not, see <http://www.gnu.org/licenses/>.
18 */
19 #ifndef DATE_H
20 #define DATE_H
21 
22 #include <meteoio/IOExceptions.h>
23 
24 #include <string>
25 #include <sstream>
26 #include <map>
27 
28 //uncomment below to support negative julian dates
29 //#define NEGATIVE_JULIAN
30 
31 namespace mio {
32 
87 class Date {
88  public:
90  typedef enum {
91  ISO,
94  FULL,
95  NUM,
96  DIN,
98  ISO_DATE
100 
102  typedef enum RND_TYPE {
103  UP,
105  CLOSEST
106  } RND;
107 
108  static const double DST_shift;
109  static const double MJD_offset;
110  static const double RFC868_offset;
111  static const double Unix_offset;
112  static const double Excel_offset;
113  static const double Matlab_offset;
114  static const double epsilon_sec;
115 
116  Date();
117  Date(const double& in_timezone);
118  Date(const double& julian_in, const double& in_timezone);
119  Date(const int& year, const int& month, const int& day, const int& hour, const int& minute, const double& in_timezone);
120  Date(const int& year, const int& month, const int& day, const int& hour, const int& minute, const int& second, const double& in_timezone);
121  Date(const int& year, const int& month, const int& day, const int& hour, const int& minute, const double& second, const double& in_timezone);
122  Date(const time_t&);
123  Date(const int& year, const double& jdn, const double& in_timezone);
124 
125  void setFromSys();
126  void setTimeZone(const double& in_timezone);
127  void setDate(const Date& in_date);
128  void setDate(const double& julian_in, const double& in_timezone);
129  void setDate(const int& year, const int& month, const int& day, const int& hour, const int& minute, const double& in_timezone);
130  void setDate(const int& year, const int& month, const int& day, const int& hour, const int& minute, const int& second, const double& in_timezone);
131  void setDate(const int& year, const int& month, const int& day, const int& hour, const int& minute, const double& second, const double& in_timezone);
132  void setDate(const int& year, const unsigned int& month, const unsigned int& day, const unsigned int& hour, const unsigned int& minute, const double& in_timezone);
133  void setDate(const int& year, const unsigned int& month, const unsigned int& day, const unsigned int& hour, const unsigned int& minute, const unsigned int& second, const double& in_timezone);
134  void setDate(const int& year, const unsigned int& month, const unsigned int& day, const unsigned int& hour, const unsigned int& minute, const double& second, const double& in_timezone);
135  void setDate(const int& year, const double& jdn, const double& in_timezone);
136  void setDate(const time_t& in_time);
137  void setModifiedJulianDate(const double& julian_in, const double& in_timezone);
138  void setRFC868Date(const double& julian_in, const double& in_timezone);
139  void setUnixDate(const time_t& in_time);
140  void setExcelDate(const double excel_in, const double& in_timezone);
141  void setMatlabDate(const double matlab_in, const double& in_timezone);
142  void setUndef(const bool& flag=true);
143 
144  bool isUndef() const {return undef;}
145  double getTimeZone() const;
146  double getJulian(const bool& gmt=false) const;
147  double getModifiedJulianDate(const bool& gmt=false) const;
148  double getTruncatedJulianDate(const bool& gmt=false) const;
149  double getRFC868Date(const bool& gmt=false) const;
150  time_t getUnixDate() const;
151  double getExcelDate(const bool& gmt=false) const;
152  double getMatlabDate(const bool& gmt=false) const;
153 
154  void getDate(double& julian_out, const bool& gmt=false) const;
155  void getDate(int& year, int& month, int& day, const bool& gmt=false) const;
156  void getDate(int& year, int& month, int& day, int& hour, const bool& gmt=false) const;
157  void getDate(int& year, int& month, int& day, int& hour, int& minute, const bool& gmt=false) const;
158  void getDate(int& year, int& month, int& day, int& hour, int& minute, double& second, const bool& gmt=false) const;
159  void getDate(int& year, int& month, int& day, int& hour, int& minute, int& second, const bool& gmt=false) const;
160  void getTime(int& hour_out, int& minute_out, const bool& gmt=false) const;
161  void getTime(int& hour_out, int& minute_out, double& second_out, const bool& gmt=false) const;
162  int getYear(const bool& gmt=false) const;
163 
164  unsigned short getDayOfWeek(const bool& gmt=false) const;
165  unsigned short getISOWeekNr(const bool& gmt=false) const;
166  unsigned short getISOWeekNr(int &ISO_year, const bool& gmt=false) const;
167  int getJulianDayNumber(const bool& gmt=false) const;
168  bool isLeapYear() const;
169 
170  static unsigned int mod(const double& julian, const unsigned int& seconds);
171  static unsigned int mod(const Date& indate, const unsigned int& seconds);
172  static double rnd(const double& julian, const double& precision, const RND& type=CLOSEST);
173  void rnd(const double& precision, const RND& type=CLOSEST);
174  static const Date rnd(const Date& indate, const double& precision, const RND& type=CLOSEST);
175  static double parseTimeZone(const std::string& timezone_iso);
176 
177  static std::string printFractionalDay(const double& fractional);
178  const std::string toString(const FORMATS& type, const bool& gmt=false) const;
179  const std::string toString() const;
180  friend std::ostream& operator<<(std::ostream& os, const Date& date);
181  friend std::istream& operator>>(std::istream& is, Date& date);
182 
183  //Operator Prototypes
184  bool operator==(const Date&) const;
185  bool operator!=(const Date&) const;
186  bool operator<(const Date&) const;
187  bool operator<=(const Date&) const;
188  bool operator>(const Date&) const;
189  bool operator>=(const Date&) const;
190 
195  Date& operator+=(const Date&);
196  Date& operator-=(const Date&);
197  Date& operator+=(const double&);
198  Date& operator-=(const double&);
199  Date& operator*=(const double&);
200  Date& operator/=(const double&);
201 
202  const Date operator+(const Date&) const;
203  const Date operator-(const Date&) const;
204  const Date operator+(const double&) const;
205  const Date operator-(const double&) const;
206  const Date operator*(const double&) const;
207  const Date operator/(const double&) const;
208 
209  static const double epsilon;
210 
211  protected:
212  double localToGMT(const double& in_julian) const;
213  double GMTToLocal(const double& in_gmt_julian) const;
214  static double calculateJulianDate(const int& in_year, const int& in_month, const int& in_day, const int& in_hour, const int& in_minute, const double& i_second);
215  static void calculateDate(const double& i_julian, int& out_year, int& out_month, int& out_day);
216  static void calculateTime(const double& i_julian, int& o_hour, int& o_minute, double& o_second);
217  static void calculateValues(const double& i_julian, int& out_year, int& out_month, int& out_day, int& out_hour, int& out_minute, double& o_second);
218  static long getJulianDayNumber(const int&, const int&, const int&);
219  static bool isLeapYear(const int&);
220  static void plausibilityCheck(const int& in_year, const int& in_month, const int& in_day, const int& in_hour, const int& in_minute, const double& in_second);
221  static bool initStaticData();
222 
223  static std::map< std::string, double> TZAbbrev;
224  static const int daysLeapYear[];
225  static const int daysNonLeapYear[];
226  static const bool __init;
227  double timezone;
228  double gmt_julian;
229  bool undef;
230 };
231 
240 class DateRange {
241  public:
242  DateRange() : start(), end() {}
243  DateRange(const Date& d1, const Date& d2) : start(d1), end(d2) {}
244 
250  bool in(const Date& a) const {
251  return (a >= start && a <= end);
252  }
253 
259  bool operator<(const Date& a) const {
260  return end < a;
261  }
262 
268  bool operator>(const Date& a) const {
269  return start > a;
270  }
271 
272  bool operator<(const DateRange& a) const { //needed for "sort"
273  if (start==a.start) return end < a.end;
274  return start < a.start;
275  }
276 
277  bool operator==(const DateRange& a) const { //needed to check for uniqueness
278  return (start==a.start) && (end==a.end);
279  }
280 
281  const std::string toString() const {std::ostringstream os; os << "[" << start.toString(Date::ISO) << " - " << end.toString(Date::ISO) << "]"; return os.str();}
282 
284 };
285 
286 typedef Date Duration; //so that later, we can implement a true Interval/Duration class
287 
288 } //end namespace
289 
290 #endif
A class to represent and handle date ranges. They can be sorted, checked for uniqueness and a date ca...
Definition: Date.h:240
DateRange()
Definition: Date.h:242
bool operator<(const DateRange &a) const
Definition: Date.h:272
Date end
Definition: Date.h:283
bool operator<(const Date &a) const
Is the provided date before the end of the range?
Definition: Date.h:259
Date start
Definition: Date.h:283
bool operator==(const DateRange &a) const
Definition: Date.h:277
bool operator>(const Date &a) const
Is the provided date after the start of the range?
Definition: Date.h:268
DateRange(const Date &d1, const Date &d2)
Definition: Date.h:243
const std::string toString() const
Definition: Date.h:281
bool in(const Date &a) const
Is the provided date within the current range?
Definition: Date.h:250
A class to handle timestamps. This class handles conversion between different time display formats (I...
Definition: Date.h:87
double GMTToLocal(const double &in_gmt_julian) const
Definition: Date.cc:1384
void setModifiedJulianDate(const double &julian_in, const double &in_timezone)
Set date from a modified julian date (MJD).
Definition: Date.cc:349
double gmt_julian
Definition: Date.h:228
bool isLeapYear() const
Return true if the current year is a leap year.
Definition: Date.cc:781
bool operator>=(const Date &) const
Definition: Date.cc:968
static double calculateJulianDate(const int &in_year, const int &in_month, const int &in_day, const int &in_hour, const int &in_minute, const double &i_second)
Definition: Date.cc:1259
static void calculateTime(const double &i_julian, int &o_hour, int &o_minute, double &o_second)
Calculate the time components (y,m,d) from a given julian date.
Definition: Date.cc:1305
static void calculateValues(const double &i_julian, int &out_year, int &out_month, int &out_day, int &out_hour, int &out_minute, double &o_second)
Definition: Date.cc:1317
friend std::ostream & operator<<(std::ostream &os, const Date &date)
Definition: Date.cc:1244
static const int daysLeapYear[]
Definition: Date.h:224
double getExcelDate(const bool &gmt=false) const
Return Excel date. The (sick) Excel date is defined as the number of days since 1900-01-00T00:00 (no,...
Definition: Date.cc:506
static const double Excel_offset
offset between julian date and Excel dates (note that excel invented some days...)
Definition: Date.h:112
void getDate(double &julian_out, const bool &gmt=false) const
Retrieve julian date. This method is a candidate for deletion: it should now be obsolete.
Definition: Date.cc:544
static const double MJD_offset
offset between julian date and modified julian date
Definition: Date.h:109
bool operator<=(const Date &) const
Definition: Date.cc:942
void getTime(int &hour_out, int &minute_out, const bool &gmt=false) const
Return time of the day.
Definition: Date.cc:573
const Date operator+(const Date &) const
Definition: Date.cc:981
double getModifiedJulianDate(const bool &gmt=false) const
Return modified julian date (MJD). The modified julian date is defined as the fractional number of da...
Definition: Date.cc:432
unsigned short getDayOfWeek(const bool &gmt=false) const
Return the day of the week for the current date. The day of the week is between 1 (Monday) and 7 (Sun...
Definition: Date.cc:682
static double parseTimeZone(const std::string &timezone_iso)
Parse an ISO 8601 formatted time zone specification. Time zones MUST be specified right after a date/...
Definition: Date.cc:1044
static unsigned int mod(const double &julian, const unsigned int &seconds)
Modulus of a julian date by a given number of seconds. This returns the modulus (in seconds) of a giv...
Definition: Date.cc:795
double localToGMT(const double &in_julian) const
Definition: Date.cc:1379
void setTimeZone(const double &in_timezone)
Set timezone and Daylight Saving Time flag.
Definition: Date.cc:216
void setMatlabDate(const double matlab_in, const double &in_timezone)
Set date from an Matlab date.
Definition: Date.cc:390
const Date operator/(const double &) const
Definition: Date.cc:1024
static double rnd(const double &julian, const double &precision, const RND &type=CLOSEST)
Round a julian date to a given precision. If you want to round a local date, do NOT provide it as gmt...
Definition: Date.cc:823
static const double Unix_offset
offset between julian date and Unix Epoch time
Definition: Date.h:111
time_t getUnixDate() const
Return Unix time (or POSIX time). The Unix time is defined as the number of seconds since 1970-01-01T...
Definition: Date.cc:488
void setFromSys()
Set internal gmt time from system time as well as system time zone.
Definition: Date.cc:199
static std::map< std::string, double > TZAbbrev
Definition: Date.h:223
Date & operator+=(const Date &)
Definition: Date.cc:865
Date & operator*=(const double &)
Definition: Date.cc:901
void setUnixDate(const time_t &in_time)
Set date from a Unix date.
Definition: Date.cc:368
double getTimeZone() const
Returns timezone.
Definition: Date.cc:401
const std::string toString(const FORMATS &type, const bool &gmt=false) const
Return a nicely formated string.
Definition: Date.cc:1120
FORMATS
Keywords for selecting the date formats (the subsecond resolution is dropped when not needed)
Definition: Date.h:90
@ ISO_TZ
ISO 8601 format (same as ISO) but with time zone specification.
Definition: Date.h:92
@ ISO_Z
ISO 8601 format, forcing GMT and Zulu (Z) timezone specification.
Definition: Date.h:93
@ ISO_DATE
ISO 8601 date format without the time (ie YYYY-MM-DD)
Definition: Date.h:98
@ ISO
ISO 8601 extended format combined date: YYYY-MM-DDTHH:mm:SS.sss (fields might be dropped,...
Definition: Date.h:91
@ ISO_WEEK
ISO 8601 week date: YYYY-Www-D (for example: 2014-W41-1)
Definition: Date.h:97
@ NUM
ISO 8601 basic format date: YYYYMMDDHHmmSS (fields might be dropped, in the least to the most signifi...
Definition: Date.h:95
@ FULL
ISO 8601 followed by the julian date (in parenthesis)
Definition: Date.h:94
@ DIN
DIN5008 format: DD.MM.YYYY HH:MM:SS.sss.
Definition: Date.h:96
static const double epsilon_sec
Definition: Date.h:114
unsigned short getISOWeekNr(const bool &gmt=false) const
Return the ISO 8601 week number The week number range from 1 to 53 for a leap year....
Definition: Date.cc:749
RND
Keywords for selecting rounding strategy.
Definition: Date.h:102
@ CLOSEST
rounding toward closest
Definition: Date.h:105
@ DOWN
rounding toward smallest absolute value
Definition: Date.h:104
@ UP
rounding toward highest absolute value
Definition: Date.h:103
bool undef
Definition: Date.h:229
static const double Matlab_offset
offset between julian date and Matlab dates
Definition: Date.h:113
static std::string printFractionalDay(const double &fractional)
Nicely format an hour given as fractional day into a human readable hour.
Definition: Date.cc:1100
Date & operator/=(const double &)
Definition: Date.cc:909
bool operator<(const Date &) const
Definition: Date.cc:929
const Date operator*(const double &) const
Definition: Date.cc:1017
static const double RFC868_offset
offset between julian date and RFC868 time (ref is 1900-01-01T00:00 GMT)
Definition: Date.h:110
static void calculateDate(const double &i_julian, int &out_year, int &out_month, int &out_day)
Calculate the date components (y,m,d) from a given julian date.
Definition: Date.cc:1276
const std::string toString() const
Definition: Date.cc:1221
double timezone
Definition: Date.h:227
void setRFC868Date(const double &julian_in, const double &in_timezone)
Set date from an RFC868 date (time since 1900-01-01T00:00 GMT, valid until 2036).
Definition: Date.cc:359
int getJulianDayNumber(const bool &gmt=false) const
Return the julian day for the current date. Return the day of the year index for the current Date obj...
Definition: Date.cc:761
Date()
Default constructor: timezone is set to GMT without DST, julian date is set to 0 (meaning -4713-01-01...
Definition: Date.cc:115
bool operator==(const Date &) const
Definition: Date.cc:917
double getJulian(const bool &gmt=false) const
Return julian date (JD). The julian date is defined as the fractional number of days since -4713-01-0...
Definition: Date.cc:414
double getRFC868Date(const bool &gmt=false) const
Return RFC868 date. The RFC868 date is defined as the fractional number of days since 1900-01-01T00:0...
Definition: Date.cc:449
static void plausibilityCheck(const int &in_year, const int &in_month, const int &in_day, const int &in_hour, const int &in_minute, const double &in_second)
Definition: Date.cc:1347
Date & operator-=(const Date &)
Definition: Date.cc:875
static const bool __init
Definition: Date.h:226
static const int daysNonLeapYear[]
Definition: Date.h:225
friend std::istream & operator>>(std::istream &is, Date &date)
Definition: Date.cc:1251
void setExcelDate(const double excel_in, const double &in_timezone)
Set date from an Excel date.
Definition: Date.cc:378
static const double DST_shift
Definition: Date.h:108
double getMatlabDate(const bool &gmt=false) const
Return Matlab date. This is the number of days since 0000-01-01T00:00:00. See http://www....
Definition: Date.cc:526
bool operator>(const Date &) const
Definition: Date.cc:955
bool operator!=(const Date &) const
Definition: Date.cc:925
void setDate(const Date &in_date)
Copy setter.
Definition: Date.cc:229
int getYear(const bool &gmt=false) const
Return year.
Definition: Date.cc:556
const Date operator-(const Date &) const
Definition: Date.cc:992
double getTruncatedJulianDate(const bool &gmt=false) const
Return truncated julian date (TJD). The truncated julian date is defined as the julian day shifted to...
Definition: Date.cc:468
static const double epsilon
minimum difference between two dates in days. 3600.025 is intentional to support high sampling rates
Definition: Date.h:209
void setUndef(const bool &flag=true)
Definition: Date.cc:192
static bool initStaticData()
initialize the static map TZAbbrev
Definition: Date.cc:64
bool isUndef() const
Definition: Date.h:144
Definition: Config.cc:30
Date Duration
Definition: Date.h:286