synchronize GTK2 minimum version in docs
[wxWidgets.git] / interface / wx / datetime.h
index 82b744d995aa3865c8d350018854b492511fb91a..0ad913cbd7ae1a5ba1973a194932551e7b5a5267 100644 (file)
@@ -9,7 +9,7 @@
 /**
     @class wxDateTime
 
-    wxDateTime class represents an absolute moment in the time.
+    wxDateTime class represents an absolute moment in time.
 
     The type @c wxDateTime_t is typedefed as <tt>unsigned short</tt> and is
     used to contain the number of years, hours, minutes, seconds and
     parameter, it is currently ignored as only the Gregorian calendar is
     supported. Future versions will support other calendars.
 
-    @beginWxPythonOnly
-    These methods are standalone functions named
-    "wxDateTime_<StaticMethodName>" in wxPython.
-    @endWxPythonOnly
-
-
     @section datetime_formatting Date Formatting and Parsing
 
     The date formatting and parsing functions convert wxDateTime objects to and
@@ -50,7 +44,7 @@
     ParseFormat() which can parse any date in the given (rigid) format.
     ParseRfc822Date() is another function for parsing dates in predefined
     format -- the one of RFC 822 which (still...) defines the format of email
-    messages on the Internet. This format can not be described with
+    messages on the Internet. This format cannot be described with
     @c strptime(3)-like format strings used by Format(), hence the need for a
     separate function.
 
@@ -102,7 +96,7 @@ public:
         Local,
 
         //@{
-        /// zones from GMT (= Greenwhich Mean Time): they're guaranteed to be
+        /// zones from GMT (= Greenwich Mean Time): they're guaranteed to be
         /// consequent numbers, so writing something like `GMT0 + offset' is
         /// safe if abs(offset) <= 12
 
@@ -170,6 +164,128 @@ public:
         Julian      ///< calendar in use since -45 until the 1582 (or later)
     };
 
+    /**
+        Values corresponding to different dates of adoption of the Gregorian
+        calendar.
+
+        @see IsGregorianDate
+     */
+    enum GregorianAdoption
+    {
+        Gr_Unknown,    ///< no data for this country or it's too uncertain to use
+        Gr_Standard,   ///< on the day 0 of Gregorian calendar: 15 Oct 1582
+
+        Gr_Alaska,             ///< Oct 1867 when Alaska became part of the USA
+        Gr_Albania,            ///< Dec 1912
+
+        Gr_Austria = Gr_Unknown,    ///< Different regions on different dates
+        Gr_Austria_Brixen,          ///< 5 Oct 1583 -> 16 Oct 1583
+        Gr_Austria_Salzburg = Gr_Austria_Brixen,
+        Gr_Austria_Tyrol = Gr_Austria_Brixen,
+        Gr_Austria_Carinthia,       ///< 14 Dec 1583 -> 25 Dec 1583
+        Gr_Austria_Styria = Gr_Austria_Carinthia,
+
+        Gr_Belgium,            ///< Then part of the Netherlands
+
+        Gr_Bulgaria = Gr_Unknown, ///< Unknown precisely (from 1915 to 1920)
+        Gr_Bulgaria_1,         ///<      18 Mar 1916 -> 1 Apr 1916
+        Gr_Bulgaria_2,         ///<      31 Mar 1916 -> 14 Apr 1916
+        Gr_Bulgaria_3,         ///<      3 Sep 1920 -> 17 Sep 1920
+
+        Gr_Canada = Gr_Unknown,   ///< Different regions followed the changes in
+                               ///< Great Britain or France
+
+        Gr_China = Gr_Unknown,    ///< Different authorities say:
+        Gr_China_1,            ///<      18 Dec 1911 -> 1 Jan 1912
+        Gr_China_2,            ///<      18 Dec 1928 -> 1 Jan 1929
+
+        Gr_Czechoslovakia,     ///< (Bohemia and Moravia) 6 Jan 1584 -> 17 Jan 1584
+        Gr_Denmark,            ///< (including Norway) 18 Feb 1700 -> 1 Mar 1700
+        Gr_Egypt,              ///< 1875
+        Gr_Estonia,            ///< 1918
+        Gr_Finland,            ///< Then part of Sweden
+
+        Gr_France,             ///< 9 Dec 1582 -> 20 Dec 1582
+        Gr_France_Alsace,      ///<      4 Feb 1682 -> 16 Feb 1682
+        Gr_France_Lorraine,    ///<      16 Feb 1760 -> 28 Feb 1760
+        Gr_France_Strasbourg,  ///< February 1682
+
+        Gr_Germany = Gr_Unknown,  ///< Different states on different dates:
+        Gr_Germany_Catholic,   ///<      1583-1585 (we take 1584)
+        Gr_Germany_Prussia,    ///<      22 Aug 1610 -> 2 Sep 1610
+        Gr_Germany_Protestant, ///<      18 Feb 1700 -> 1 Mar 1700
+
+        Gr_GreatBritain,       ///< 2 Sep 1752 -> 14 Sep 1752 (use 'cal(1)')
+
+        Gr_Greece,             ///< 9 Mar 1924 -> 23 Mar 1924
+        Gr_Hungary,            ///< 21 Oct 1587 -> 1 Nov 1587
+        Gr_Ireland = Gr_GreatBritain,
+        Gr_Italy = Gr_Standard,
+
+        Gr_Japan = Gr_Unknown,    ///< Different authorities say:
+        Gr_Japan_1,            ///<      19 Dec 1872 -> 1 Jan 1873
+        Gr_Japan_2,            ///<      19 Dec 1892 -> 1 Jan 1893
+        Gr_Japan_3,            ///<      18 Dec 1918 -> 1 Jan 1919
+
+        Gr_Latvia,             ///< 1915-1918 (we take 1915)
+        Gr_Lithuania,          ///< 1915
+        Gr_Luxemburg,          ///< 14 Dec 1582 -> 25 Dec 1582
+        Gr_Netherlands = Gr_Belgium, ///< (including Belgium) 1 Jan 1583
+
+        /**
+            Special case of Groningen.
+
+            The Gregorian calendar was introduced twice in Groningen, first
+            time 28 Feb 1583 was followed by 11 Mar 1583, then it has gone back
+            to Julian in the summer of 1584 and then 13 Dec 1700 was followed
+            by 12 Jan 1701 -- which is the date we take into account here.
+         */
+        Gr_Netherlands_Groningen,  ///< 13 Dec 1700 -> 12 Jan 1701
+        Gr_Netherlands_Gelderland, ///< 30 Jun 1700 -> 12 Jul 1700
+        Gr_Netherlands_Utrecht,    ///< (and Overijssel) 30 Nov 1700->12 Dec 1700
+        Gr_Netherlands_Friesland,  ///< (and Drenthe) 31 Dec 1700 -> 12 Jan 1701
+
+        Gr_Norway = Gr_Denmark,       ///< Then part of Denmark
+        Gr_Poland = Gr_Standard,
+        Gr_Portugal = Gr_Standard,
+        Gr_Romania,                ///< 31 Mar 1919 -> 14 Apr 1919
+        Gr_Russia,                 ///< 31 Jan 1918 -> 14 Feb 1918
+        Gr_Scotland = Gr_GreatBritain,
+        Gr_Spain = Gr_Standard,
+
+        /**
+            Special case of Sweden.
+
+            Sweden has a curious history. Sweden decided to make a gradual
+            change from the Julian to the Gregorian calendar. By dropping every
+            leap year from 1700 through 1740 the eleven superfluous days would
+            be omitted and from 1 Mar 1740 they would be in sync with the
+            Gregorian calendar. (But in the meantime they would be in sync with
+            nobody!)
+
+            So 1700 (which should have been a leap year in the Julian calendar)
+            was not a leap year in Sweden. However, by mistake 1704 and 1708
+            became leap years. This left Sweden out of synchronisation with
+            both the Julian and the Gregorian world, so they decided to go back
+            to the Julian calendar. In order to do this, they inserted an extra
+            day in 1712, making that year a double leap year! So in 1712,
+            February had 30 days in Sweden.
+
+            Later, in 1753, Sweden changed to the Gregorian calendar by
+            dropping 11 days like everyone else and this is what we use here.
+         */
+        Gr_Sweden = Gr_Finland,       ///< 17 Feb 1753 -> 1 Mar 1753
+
+        Gr_Switzerland = Gr_Unknown,///< Different cantons used different dates
+        Gr_Switzerland_Catholic,    ///<      1583, 1584 or 1597 (we take 1584)
+        Gr_Switzerland_Protestant,  ///<      31 Dec 1700 -> 12 Jan 1701
+
+        Gr_Turkey,                 ///< 1 Jan 1927
+        Gr_USA = Gr_GreatBritain,
+        Gr_Wales = Gr_GreatBritain,
+        Gr_Yugoslavia              ///< 1919
+    };
+
     /**
         Date calculations often depend on the country and wxDateTime allows to set
         the country whose conventions should be used using SetCountry(). It takes
@@ -233,7 +349,7 @@ public:
         in the functions whose result depends on it (GetWeekOfYear() and
         GetWeekOfMonth()).
 
-        The desired behvaiour may be specified by giving one of the following
+        The desired behaviour may be specified by giving one of the following
         constants as argument to these functions.
     */
     enum WeekFlags
@@ -244,13 +360,70 @@ public:
     };
 
 
+    /**
+        Class representing a time zone.
+
+        The representation is simply the offset, in seconds, from UTC.
+     */
+    class WXDLLIMPEXP_BASE TimeZone
+    {
+    public:
+        /// Constructor for a named time zone.
+        TimeZone(TZ tz);
+
+        /// Constructor for the given offset in seconds.
+        TimeZone(long offset = 0);
+
+        /// Create a time zone with the given offset in seconds.
+        static TimeZone Make(long offset);
+
+        /// Return the offset of this time zone from UTC, in seconds.
+        long GetOffset() const;
+    };
+
+    /**
+        Contains broken down date-time representation.
+
+        This struct is analogous to standard C <code>struct tm</code> and uses
+        the same, not always immediately obvious, conventions for its members:
+        notably its mon and mday fields count from 0 while yday counts from 1.
+     */
+    struct Tm
+    {
+        wxDateTime_t msec,  ///< Number of milliseconds.
+                     sec,   ///< Seconds in 0..59 (60 with leap seconds) range.
+                     min,   ///< Minutes in 0..59 range.
+                     hour,  ///< Hours since midnight in 0..23 range.
+                     mday,  ///< Day of the month in 1..31 range.
+                     yday;  ///< Day of the year in 0..365 range.
+        Month mon;          ///< Month, as an enumerated constant.
+        int year;           ///< Year.
+
+        /**
+            Check if the given date/time is valid (in Gregorian calendar).
+
+            Return @false if the components don't correspond to a correct date.
+         */
+        bool IsValid() const;
+
+        /**
+            Return the week day corresponding to this date.
+
+            Unlike the other fields, the week day is not always available and
+            so must be accessed using this method as it is computed on demand
+            when it is called.
+         */
+        WeekDay GetWeekDay();
+    };
+
+
     /**
         @name Constructors, Assignment Operators and Setters
 
         Constructors and various Set() methods are collected here. If you
         construct a date object from separate values for day, month and year,
         you should use IsValid() method to check that the values were correct
-        as constructors can not return an error code.
+        as constructors cannot return an error code.
     */
     //@{
 
@@ -259,45 +432,33 @@ public:
         object later.
     */
     wxDateTime();
+
+    /**
+       Copy constructor.
+    */
+    wxDateTime(const wxDateTime& date);
+    
     /**
         Same as Set().
-
-        @beginWxPythonOnly
-        This constructor is named "wxDateTimeFromTimeT" in wxPython.
-        @endWxPythonOnly
     */
     wxDateTime(time_t timet);
     /**
         Same as Set().
-
-        @beginWxPythonOnly Unsupported. @endWxPythonOnly
     */
     wxDateTime(const struct tm& tm);
     /**
         Same as Set().
-
-        @beginWxPythonOnly
-        This constructor is named "wxDateTimeFromJDN" in wxPython.
-        @endWxPythonOnly
     */
     wxDateTime(double jdn);
     /**
         Same as Set().
-
-        @beginWxPythonOnly
-        This constructor is named "wxDateTimeFromHMS" in wxPython.
-        @endWxPythonOnly
     */
     wxDateTime(wxDateTime_t hour, wxDateTime_t minute = 0,
                wxDateTime_t second = 0, wxDateTime_t millisec = 0);
     /**
         Same as Set().
-
-        @beginWxPythonOnly
-        This constructor is named "wxDateTimeFromDMY" in wxPython.
-        @endWxPythonOnly
     */
-    wxDateTime(wxDateTime_t day, Month month = Inv_Month,
+    wxDateTime(wxDateTime_t day, Month month,
                int year = Inv_Year, wxDateTime_t hour = 0,
                wxDateTime_t minute = 0, wxDateTime_t second = 0,
                wxDateTime_t millisec = 0);
@@ -309,6 +470,7 @@ public:
             Input, Windows SYSTEMTIME reference
         @since 2.9.0
         @remarks MSW only
+        @onlyfor{wxmsw}
     */
     wxDateTime(const struct _SYSTEMTIME& st);
 
@@ -321,19 +483,20 @@ public:
     /**
         Constructs the object from @a timet value holding the number of seconds
         since Jan 1, 1970.
-
-        @beginWxPythonOnly
-        This method is named "SetTimeT" in wxPython.
-        @endWxPythonOnly
     */
     wxDateTime& Set(time_t timet);
     /**
         Sets the date and time from the broken down representation in the
         standard @a tm structure.
-
-        @beginWxPythonOnly Unsupported. @endWxPythonOnly
     */
     wxDateTime& Set(const struct tm& tm);
+
+    /**
+       Sets the date and time from the broken down representation in the
+       @a wxDateTime::Tm structure.
+    */
+    wxDateTime& Set(const Tm& tm);
+    
     /**
         Sets the date from the so-called Julian Day Number.
 
@@ -341,26 +504,18 @@ public:
         particular instant is the fractional number of days since 12 hours
         Universal Coordinated Time (Greenwich mean noon) on January 1 of the
         year -4712 in the Julian proleptic calendar.
-
-        @beginWxPythonOnly
-        This method is named "SetJDN" in wxPython.
-        @endWxPythonOnly
     */
     wxDateTime& Set(double jdn);
     /**
         Sets the date to be equal to Today() and the time from supplied
         parameters.
-
-        @beginWxPythonOnly
-        This method is named "SetHMS" in wxPython.
-        @endWxPythonOnly
     */
     wxDateTime& Set(wxDateTime_t hour, wxDateTime_t minute = 0,
                     wxDateTime_t second = 0, wxDateTime_t millisec = 0);
     /**
         Sets the date and time from the parameters.
     */
-    wxDateTime& Set(wxDateTime_t day, Month month = Inv_Month,
+    wxDateTime& Set(wxDateTime_t day, Month month,
                     int year = Inv_Year, wxDateTime_t hour = 0,
                     wxDateTime_t minute = 0, wxDateTime_t second = 0,
                     wxDateTime_t millisec = 0);
@@ -436,7 +591,7 @@ public:
     /**
         Returns the date and time in DOS format.
     */
-    long unsigned int GetAsDOS() const;
+    unsigned long GetAsDOS() const;
 
     /**
         Initialize using the Windows SYSTEMTIME structure.
@@ -444,6 +599,7 @@ public:
             Input, Windows SYSTEMTIME reference
         @since 2.9.0
         @remarks MSW only
+        @onlyfor{wxmsw}
     */
     wxDateTime& SetFromMSWSysTime(const struct _SYSTEMTIME& st);
 
@@ -453,6 +609,7 @@ public:
             Output, pointer to Windows SYSTEMTIME
         @since 2.9.0
         @remarks MSW only
+        @onlyfor{wxmsw}
     */
     void GetAsMSWSysTime(struct _SYSTEMTIME* st) const;
 
@@ -474,28 +631,28 @@ public:
     /**
         Returns the day in the given timezone (local one by default).
     */
-    short unsigned int GetDay(const TimeZone& tz = Local) const;
+    unsigned short GetDay(const TimeZone& tz = Local) const;
 
     /**
         Returns the day of the year (in 1-366 range) in the given timezone
         (local one by default).
     */
-    short unsigned int GetDayOfYear(const TimeZone& tz = Local) const;
+    unsigned short GetDayOfYear(const TimeZone& tz = Local) const;
 
     /**
         Returns the hour in the given timezone (local one by default).
     */
-    short unsigned int GetHour(const TimeZone& tz = Local) const;
+    unsigned short GetHour(const TimeZone& tz = Local) const;
 
     /**
         Returns the milliseconds in the given timezone (local one by default).
     */
-    short unsigned int GetMillisecond(const TimeZone& tz = Local) const;
+    unsigned short GetMillisecond(const TimeZone& tz = Local) const;
 
     /**
         Returns the minute in the given timezone (local one by default).
     */
-    short unsigned int GetMinute(const TimeZone& tz = Local) const;
+    unsigned short GetMinute(const TimeZone& tz = Local) const;
 
     /**
         Returns the month in the given timezone (local one by default).
@@ -505,7 +662,7 @@ public:
     /**
         Returns the seconds in the given timezone (local one by default).
     */
-    short unsigned int GetSecond(const TimeZone& tz = Local) const;
+    unsigned short GetSecond(const TimeZone& tz = Local) const;
 
     /**
         Returns the number of seconds since Jan 1, 1970. An assert failure will
@@ -653,67 +810,35 @@ public:
 
     /**
         Adds the given date span to this object.
-
-        @beginWxPythonOnly
-        This method is named "AddDS" in wxPython.
-        @endWxPythonOnly
     */
     wxDateTime Add(const wxDateSpan& diff) const;
     /**
         Adds the given date span to this object.
-
-        @beginWxPythonOnly
-        This method is named "AddDS" in wxPython.
-        @endWxPythonOnly
     */
     wxDateTime Add(const wxDateSpan& diff);
     /**
         Adds the given time span to this object.
-
-        @beginWxPythonOnly
-        This method is named "AddTS" in wxPython.
-        @endWxPythonOnly
     */
     wxDateTime Add(const wxTimeSpan& diff) const;
     /**
         Adds the given time span to this object.
-
-        @beginWxPythonOnly
-        This method is named "AddTS" in wxPython.
-        @endWxPythonOnly
     */
     wxDateTime& Add(const wxTimeSpan& diff);
 
     /**
         Subtracts the given time span from this object.
-
-        @beginWxPythonOnly
-        This method is named "SubtractTS" in wxPython.
-        @endWxPythonOnly
     */
     wxDateTime Subtract(const wxTimeSpan& diff) const;
     /**
         Subtracts the given time span from this object.
-
-        @beginWxPythonOnly
-        This method is named "SubtractTS" in wxPython.
-        @endWxPythonOnly
     */
     wxDateTime& Subtract(const wxTimeSpan& diff);
     /**
         Subtracts the given date span from this object.
-
-        @beginWxPythonOnly
-        This method is named "SubtractDS" in wxPython.
-        @endWxPythonOnly
     */
     wxDateTime Subtract(const wxDateSpan& diff) const;
     /**
         Subtracts the given date span from this object.
-
-        @beginWxPythonOnly
-        This method is named "SubtractDS" in wxPython.
-        @endWxPythonOnly
     */
     wxDateTime& Subtract(const wxDateSpan& diff);
     /**
@@ -725,7 +850,7 @@ public:
     /**
         Adds the given date span to this object.
     */
-    wxDateTime operator+=(const wxDateSpan& diff);
+    wxDateTime& operator+=(const wxDateSpan& diff);
     /**
         Subtracts the given date span from this object.
     */
@@ -775,7 +900,7 @@ public:
         Returns the combined date-time representation in the ISO 8601 format
         @c "YYYY-MM-DDTHH:MM:SS". The @a sep parameter default value produces
         the result exactly corresponding to the ISO standard, but it can also
-        be useful to use a space as seprator if a more human-readable combined
+        be useful to use a space as separator if a more human-readable combined
         date-time representation is needed.
 
         @see FormatISODate(), FormatISOTime(), ParseISOCombined()
@@ -820,7 +945,7 @@ public:
 
         This function tries as hard as it can to interpret the given string as
         date and time. Unlike ParseRfc822Date(), it will accept anything that
-        may be accepted and will only reject strings which can not be parsed in
+        may be accepted and will only reject strings which cannot be parsed in
         any way at all. Notice that the function will fail if either date or
         time part is present but not both, use ParseDate() or ParseTime() to
         parse strings containing just the date or time component.
@@ -1325,20 +1450,12 @@ public:
     /**
         Returns the number of days in the given year. The only supported value
         for @a cal currently is @c Gregorian.
-
-        @beginWxPythonOnly
-        This method is named "GetNumberOfDaysInYear" in wxPython.
-        @endWxPythonOnly
     */
     static wxDateTime_t GetNumberOfDays(int year, Calendar cal = Gregorian);
 
     /**
         Returns the number of days in the given month of the given year. The
         only supported value for @a cal currently is @c Gregorian.
-
-        @beginWxPythonOnly
-        This method is named "GetNumberOfDaysInMonth" in wxPython.
-        @endWxPythonOnly
     */
     static wxDateTime_t GetNumberOfDays(Month month, int year = Inv_Year,
                                         Calendar cal = Gregorian);
@@ -1349,7 +1466,7 @@ public:
     static time_t GetTimeNow();
 
     /**
-        Returns the current time broken down using the buffer whose adress is
+        Returns the current time broken down using the buffer whose address is
         passed to the function with @a tm to store the result.
     */
     static tm* GetTmNow(struct tm *tm);
@@ -1409,9 +1526,8 @@ public:
         printf("Current time in Paris:\t%s\n", now.Format("%c", wxDateTime::CET).c_str());
         @endcode
 
-        @note This function is accurate up to seconds. UNow() should be used
-              for better precision, but it is less efficient and might not be
-              available on all platforms.
+        @note This function is accurate up to seconds. UNow() can be used if
+              better precision is required.
 
         @see Today()
     */
@@ -1446,11 +1562,13 @@ public:
     static wxDateTime Today();
 
     /**
-        Returns the object corresponding to the current time including the
-        milliseconds if a function to get time with such precision is available
-        on the current platform (supported under most Unices and Win32).
+        Returns the object corresponding to the current UTC time including the
+        milliseconds.
 
-        @see Now()
+        Notice that unlike Now(), this method creates a wxDateTime object
+        corresponding to UTC, not local, time.
+
+        @see Now(), wxGetUTCTimeMillis()
     */
     static wxDateTime UNow();
 };
@@ -1733,7 +1851,7 @@ public:
     /**
         Returns @true if this date span is different from the other one.
     */
-    bool operator!=(const wxDateSpan&) const;
+    bool operator!=(const wxDateSpan& other) const;
 
     /**
         Returns @true if this date span is equal to the other one. Two date
@@ -1741,7 +1859,7 @@ public:
         years and months and the same total number of days (counting both days
         and weeks).
     */
-    bool operator==(const wxDateSpan&) const;
+    bool operator==(const wxDateSpan& other) const;
 };
 
 
@@ -1823,7 +1941,7 @@ public:
         specifier of larger unit, only the rest part is taken, otherwise the
         full value is used.
     */
-    wxString Format(const wxString& = wxDefaultTimeSpanFormat) const;
+    wxString Format(const wxString& format = wxDefaultTimeSpanFormat) const;
 
     /**
         Returns the difference in number of days.