/********************************************************************************
* *
* D a t e C l a s s *
* *
*********************************************************************************
* Copyright (C) 2005,2024 by Jeroen van der Zijp. All Rights Reserved. *
*********************************************************************************
* This library is free software; you can redistribute it and/or modify *
* it under the terms of the GNU Lesser General Public License as published by *
* the Free Software Foundation; either version 3 of the License, or *
* (at your option) any later version. *
* *
* This library is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU Lesser General Public License for more details. *
* *
* You should have received a copy of the GNU Lesser General Public License *
* along with this program. If not, see *
********************************************************************************/
#ifndef FXDATE_H
#define FXDATE_H
namespace FX {
/**
* Gregorian date class, which is useful for calendrical calculations.
*/
class FXAPI FXDate {
private:
FXuint julian;
private:
static const FXchar shortMonthName[12][4];
static const FXchar longMonthName[12][10];
static const FXchar shortWeekDay[7][4];
static const FXchar longWeekDay[7][10];
public:
/// Names for the months
enum {
Jan=1,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec
};
/// Names for the weekdays
enum {
Sun=0,Mon,Tue,Wed,Thu,Fri,Sat
};
public:
/// Default constructor
FXDate(){}
/// Copy constructor
FXDate(const FXDate& date):julian(date.julian){}
/// Initialize with julian day number
FXDate(FXuint jd):julian(jd){}
/// Initialize with year and day of year
FXDate(FXint yr,FXint dy);
/// Initialize with year, month, and day of month
FXDate(FXint yr,FXint mo,FXint dy);
/// Set julian day number
void setJulian(FXuint jd){ julian=jd; }
/// Get julian day number
FXuint getJulian() const { return julian; }
/// Set date to year and day of year
void setDate(FXint yr,FXint dy);
/// Get year and day of year from date
void getDate(FXint& yr,FXint& dy) const;
/// Set date to year, month, and day of month
void setDate(FXint yr,FXint mo,FXint dy);
/// Get year, month, and day of month from date
void getDate(FXint& yr,FXint& mo,FXint& dy) const;
/// Set date from nanoseconds since 1/1/1970
void setTime(FXTime ns);
/// Get nanoseconds since 1/1/1970 from date
FXTime getTime() const;
/// Return day of the month (1..31)
FXint day() const;
/// Return month (1..12)
FXint month() const;
/// Return year
FXint year() const;
/// Return day of the week
FXint dayOfWeek() const;
/// Return day of year (1..366)
FXint dayOfYear() const;
/// Return ISO8601 week number of this date
FXint weekOfYear() const;
/// Return true if this is a leap year
FXbool leapYear() const;
/// Return number of days in this year
FXint daysInYear() const;
/// Return days in this month
FXint daysInMonth() const;
/// Add d days to this date
FXDate& addDays(FXint d);
/// Add m months to this date; day of month is adjusted for leap-years
FXDate& addMonths(FXint m);
/// Add y years to this date; day of month is adjusted for leap-years
FXDate& addYears(FXint y);
/// Is the value a leap year
static FXbool leapYear(FXint yr);
/// Return number of days in a given year
static FXint daysInYear(FXint yr);
/// Return number of days in the month in given year, month
static FXint daysInMonth(FXint yr,FXint mo);
/// Get the name of the month
static const FXchar *monthName(FXint mo){ return longMonthName[mo-1]; }
/// Get the abbreviated name of the month
static const FXchar *monthNameShort(FXint mo){ return shortMonthName[mo-1]; }
/// Get the name of the day
static const FXchar *dayName(FXint dy){ return longWeekDay[dy]; }
/// Get the abbreviated name of the day
static const FXchar *dayNameShort(FXint dy){ return shortWeekDay[dy]; }
/// Return current local date
static FXDate localDate();
/// Return current universal (UTC) date
static FXDate universalDate();
/// Assignment
FXDate& operator=(const FXDate& date){julian=date.julian;return *this;}
/// Assignment operators
FXDate& operator+=(FXint x){ julian+=x; return *this; }
FXDate& operator-=(FXint x){ julian-=x; return *this; }
/// Pre-Increment and decrement
FXDate& operator++(){ ++julian; return *this; }
FXDate& operator--(){ --julian; return *this; }
/// Post-Increment and decrement
FXDate operator++(int){ FXDate t(julian++); return t; }
FXDate operator--(int){ FXDate t(julian--); return t; }
/// Equality tests
FXbool operator==(const FXDate& date) const { return julian==date.julian;}
FXbool operator!=(const FXDate& date) const { return julian!=date.julian;}
/// Inequality tests
FXbool operator<(const FXDate& date) const { return julian(const FXDate& date) const { return julian>date.julian;}
FXbool operator>=(const FXDate& date) const { return julian>=date.julian;}
/// Add days to date yielding another date
friend inline FXDate operator+(const FXDate& d,FXint x);
friend inline FXDate operator+(FXint x,const FXDate& d);
/// Subtract dates yielding days
friend inline FXint operator-(const FXDate& a,const FXDate& b);
/// save to stream
friend FXAPI FXStream& operator<<(FXStream& store,const FXDate& d);
/// load from stream
friend FXAPI FXStream& operator>>(FXStream& store,FXDate& d);
/// Destructor
~FXDate(){}
};
inline FXDate operator+(const FXDate& d,FXint x){ return FXDate(d.julian+x); }
inline FXDate operator+(FXint x,const FXDate& d){ return FXDate(x+d.julian); }
inline FXint operator-(const FXDate& a,const FXDate& b){return a.julian-b.julian; }
extern FXAPI FXStream& operator<<(FXStream& store,const FXDate& d);
extern FXAPI FXStream& operator>>(FXStream& store,FXDate& d);
}
#endif