summaryrefslogtreecommitdiffstats
path: root/kstars/kstars/timezonerule.h
diff options
context:
space:
mode:
Diffstat (limited to 'kstars/kstars/timezonerule.h')
-rw-r--r--kstars/kstars/timezonerule.h171
1 files changed, 171 insertions, 0 deletions
diff --git a/kstars/kstars/timezonerule.h b/kstars/kstars/timezonerule.h
new file mode 100644
index 00000000..c24f7243
--- /dev/null
+++ b/kstars/kstars/timezonerule.h
@@ -0,0 +1,171 @@
+/***************************************************************************
+ timezonerule.h - description
+ -------------------
+ begin : Tue Apr 2 2002
+ copyright : (C) 2002 by Jason Harris
+ email : kstars@30doradus.org
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef TIMEZONERULE_H
+#define TIMEZONERULE_H
+
+/**@class TimeZoneRule
+ *This class provides the information needed to determine whether Daylight
+ *Savings Time (DST; a.k.a. "Summer Time") is currently active at a given
+ *location. There are (at least) 25 different "rules" which govern DST
+ *around the world; a string identifying the appropriate rule is attachded
+ *to each city in Cities.dat.
+ *
+ *The rules themselves are stored in the TZrulebook.dat file, which is read
+ *on startup; each line in the file creates a TimeZoneRule object.
+ *
+ *TimeZoneRule consists of QStrings identifying the months and days on which
+ *DST starts and ends, QTime objects identifying the time at which the
+ *changes occur, and a double indicating the size of the offset in hours
+ *(probably always 1.00).
+ *
+ *Month names should be the English three-letter abbreviation, uncapitalized.
+ *Day names are either an integer indicating the calendar date (i.e., "15" is
+ *the fifteenth of the month), or a number paired with a three-letter
+ *abbreviation for a weekday. This indicates the Nth weekday of the month
+ *(i.e., "2sun" is the second Sunday of the Month). Finally, the weekday
+ *string on its own indicates the last weekday of the month (i.e.,
+ *"mon" is the last Monday of the month).
+ *
+ *The isDSTActive(KStarsDateTime) function returns true if DST is active for the
+ *DateTime given as an argument.
+ *
+ *The nextDSTChange(KStarsDateTime) function returns the KStarsDateTime of the moment
+ *at which the next DST change will occur for the current location.
+ *@author Jason Harris
+ *@version 1.0
+ */
+
+#include <qstring.h>
+#include "kstarsdatetime.h"
+
+class TimeZoneRule {
+public:
+ /**Default Constructor. Makes the "empty" time zone rule (i.e., no DST correction)*/
+ TimeZoneRule();
+
+ /**Constructor. Create a TZ rule according to the arguments.
+ *@p smonth the three-letter code for the month in which DST starts
+ *@p sday a string encoding the day on which DST starts (see the class description)
+ *@p stime the time at which DST starts
+ *@p rmonth the three-letter code for the month in which DST reverts
+ *@p rday a string encoding the day on which DST reverts (see the class description)
+ *@p rtime the time at which DST reverts
+ *@p offset the offset between normal time and DS time (always 1.00?)
+ */
+ TimeZoneRule( const QString &smonth, const QString &sday, const QTime &stime,
+ const QString &rmonth, const QString &rday, const QTime &rtime, const double &offset=1.00 );
+
+ /**Destructor. (empty)*/
+ ~TimeZoneRule();
+
+ /**Determine whether DST is in effect for the given DateTime, according to this rule
+ *@p date the date/time to test for DST
+ */
+ bool isDSTActive( const KStarsDateTime &date );
+
+ /**@return TRUE if the rule is the "empty" TZ rule. */
+ bool isEmptyRule() { return ( HourOffset == 0.0 ); }
+
+ /** Toggle DST on/off. The @p activate argument should probably be isDSTActive()
+ *@param activate if TRUE, then set DST active; otherwise, deactivate DST
+ */
+ void setDST( bool activate=true );
+
+ /**@return the current Timezone offset, compared to the timezone's Standard Time.
+ *This is typically 0.0 if DST is inactive, and 1.0 if DST is active. */
+ double deltaTZ() const { return dTZ; }
+
+/** Recalculate next dst change and if DST is active by a given local time with
+ *timezone offset and time direction.
+ *@param ltime the time to be tested
+ *@param time_runs_forward time direction
+ *@param TZoffset offset of timezone in some fictional unit
+ *@param automaticDSTchange is automatic DST change?
+ *
+ * @todo Check dox for TZoffset
+ */
+ void reset_with_ltime( KStarsDateTime &ltime, const double TZoffset, const bool time_runs_forward,
+ const bool automaticDSTchange = false );
+
+ /**@return computed value for next DST change in universal time.
+ */
+ KStarsDateTime nextDSTChange() { return next_change_utc; }
+
+ /**@return computed value for next DST change in local time.
+ */
+ KStarsDateTime nextDSTChange_LTime() { return next_change_ltime; }
+
+ /**@return TRUE if this rule is the same as the argument.
+ *@p r the rule to check for equivalence
+ */
+ bool equals( TimeZoneRule *r );
+
+ int StartMonth, RevertMonth;
+
+private:
+
+ /**@return the KStarsDateTime of the moment when the next DST change will occur in local time
+ *This is useful because DST change times are saved in local times*/
+ void nextDSTChange_LTime( const KStarsDateTime &date );
+
+ /**@return the KStarsDateTime of the moment when the last DST change occurred in local time
+ *This is useful because DST change times are saved in local times
+ *We need this in case time is running backwards. */
+ void previousDSTChange_LTime( const KStarsDateTime &date );
+
+ /**calculate the next DST change in universal time for current location */
+ void nextDSTChange( const KStarsDateTime &local_date, const double TZoffset );
+
+ /**calculate the previous DST change in universal time for current location */
+ void previousDSTChange( const KStarsDateTime &local_date, const double TZoffset );
+
+ /**Interpret the string as a month of the year;
+ *@return the month integer (1=jan ... 12=dec)
+ */
+ int initMonth( const QString &m );
+
+ /**Interpret the day string as a week ID and a day-of-week ID. The day-of-week
+ *is an integer between 1 (sunday) and 7 (saturday); the week integer can
+ *be 1-3 (1st/2nd/third weekday of the month), or 5 (last weekday of the month)
+ *@p day the day integer is returned by reference through this value
+ *@p week the week integer is returned by reference through this value
+ *@return TRUE if the day string was successfully parsed
+ */
+ bool initDay( const QString &d, int &day, int &week );
+
+ /**Find the calendar date on which DST starts for the calendar year
+ *of the given KStarsDateTime.
+ *@p d the date containing the year to be tested
+ *@return the calendar date, an integer between 1 and 31. */
+ int findStartDay( const KStarsDateTime &d );
+
+ /**Find the calendar date on which DST ends for the calendar year
+ *of the given KStarsDateTime.
+ *@p d the date containing the year to be tested
+ *@return the calendar date, an integer between 1 and 31. */
+ int findRevertDay( const KStarsDateTime &d );
+
+ int StartDay, RevertDay;
+ int StartWeek, RevertWeek;
+ QTime StartTime, RevertTime;
+ KStarsDateTime next_change_utc, next_change_ltime;
+ double dTZ, HourOffset;
+
+};
+
+#endif