X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/271f6072240c0f07bf34366322bfecbde59238d7..f321ab7fb40525098cea6594ffbf2daf0186b1a3:/include/wx/datetime.h diff --git a/include/wx/datetime.h b/include/wx/datetime.h index dec975265e..c65e1f64d8 100644 --- a/include/wx/datetime.h +++ b/include/wx/datetime.h @@ -13,10 +13,6 @@ #ifndef _WX_DATETIME_H #define _WX_DATETIME_H -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) - #pragma interface "datetime.h" -#endif - #include "wx/defs.h" #if wxUSE_DATETIME @@ -56,6 +52,27 @@ class WXDLLIMPEXP_BASE wxDateSpan; * 5. wxDateTimeHolidayAuthority for Easter and other christian feasts */ +/* Two wrapper functions for thread safety */ +#ifdef HAVE_LOCALTIME_R +#define wxLocaltime_r localtime_r +#else +WXDLLIMPEXP_BASE struct tm *wxLocaltime_r(const time_t*, struct tm*); +#if wxUSE_THREADS && !defined(__WINDOWS__) && !defined(__WATCOMC__) + // On Windows, localtime _is_ threadsafe! +#warning using pseudo thread-safe wrapper for localtime to emulate localtime_r +#endif +#endif + +#ifdef HAVE_GMTIME_R +#define wxGmtime_r gmtime_r +#else +WXDLLIMPEXP_BASE struct tm *wxGmtime_r(const time_t*, struct tm*); +#if wxUSE_THREADS && !defined(__WINDOWS__) && !defined(__WATCOMC__) + // On Windows, gmtime _is_ threadsafe! +#warning using pseudo thread-safe wrapper for gmtime to emulate gmtime_r +#endif +#endif + /* The three (main) classes declared in this header represent: @@ -151,7 +168,7 @@ public: GMT_6, GMT_5, GMT_4, GMT_3, GMT_2, GMT_1, GMT0, GMT1, GMT2, GMT3, GMT4, GMT5, GMT6, - GMT7, GMT8, GMT9, GMT10, GMT11, GMT12, + GMT7, GMT8, GMT9, GMT10, GMT11, GMT12, GMT13, // Note that GMT12 and GMT_12 are not the same: there is a difference // of exactly one day between them @@ -185,10 +202,14 @@ public: // Australia A_WST = GMT8, // Western Standard Time - A_CST = GMT12 + 1, // Central Standard Time (+9.5) + A_CST = GMT13 + 1, // Central Standard Time (+9.5) A_EST = GMT10, // Eastern Standard Time A_ESST = GMT11, // Eastern Summer Time + // New Zealand + NZST = GMT12, // Standard Time + NZDT = GMT13, // Daylight Saving Time + // TODO add more symbolic timezone names here // Universal Coordinated Time = the new and politically correct name @@ -486,7 +507,7 @@ public: static bool IsLeapYear(int year = Inv_Year, Calendar cal = Gregorian); // get the century (19 for 1999, 20 for 2000 and -5 for 492 BC) - static int GetCentury(int year = Inv_Year); + static int GetCentury(int year); // returns the number of days in this year (356 or 355 for Gregorian // calendar usually :-) @@ -687,6 +708,7 @@ public: Month month = Inv_Month, int year = Inv_Year); +#if WXWIN_COMPATIBILITY_2_6 // sets the date to the given day of the given week in the year, // returns true on success and false if given date doesn't exist (e.g. // numWeek is > 53) @@ -699,6 +721,7 @@ public: wxDEPRECATED( wxDateTime GetWeek(wxDateTime_t numWeek, WeekDay weekday = Mon, WeekFlags flags = Monday_First) const ); +#endif // WXWIN_COMPATIBILITY_2_6 // returns the date corresponding to the given week day of the given // week (in ISO notation) of the specified year @@ -757,26 +780,38 @@ public: // religious holidays (Easter...) or moon/solar eclipses? Some // algorithms can be found in the calendar FAQ - // timezone stuff: a wxDateTime object constructed using given - // day/month/year/hour/min/sec values correspond to this moment in local - // time. Using the functions below, it may be converted to another time - // zone (for example, the Unix epoch is wxDateTime(1, Jan, 1970).ToGMT()) + + // Timezone stuff: a wxDateTime object constructed using given + // day/month/year/hour/min/sec values is interpreted as this moment in + // local time. Using the functions below, it may be converted to another + // time zone (e.g., the Unix epoch is wxDateTime(1, Jan, 1970).ToGMT()). // - // these functions try to handle DST internally, but there is no magical + // These functions try to handle DST internally, but there is no magical // way to know all rules for it in all countries in the world, so if the // program can handle it itself (or doesn't want to handle it at all for // whatever reason), the DST handling can be disabled with noDST. - // - // Converting to the local time zone doesn't do anything. // ------------------------------------------------------------------------ // transform to any given timezone inline wxDateTime ToTimezone(const TimeZone& tz, bool noDST = false) const; wxDateTime& MakeTimezone(const TimeZone& tz, bool noDST = false); - // transform to GMT/UTC - wxDateTime ToGMT(bool noDST = false) const { return ToTimezone(GMT0, noDST); } - wxDateTime& MakeGMT(bool noDST = false) { return MakeTimezone(GMT0, noDST); } + // interpret current value as being in another timezone and transform + // it to local one + inline wxDateTime FromTimezone(const TimeZone& tz, bool noDST = false) const; + wxDateTime& MakeFromTimezone(const TimeZone& tz, bool noDST = false); + + // transform to/from GMT/UTC + wxDateTime ToUTC(bool noDST = false) const { return ToTimezone(UTC, noDST); } + wxDateTime& MakeUTC(bool noDST = false) { return MakeTimezone(UTC, noDST); } + + wxDateTime ToGMT(bool noDST = false) const { return ToUTC(noDST); } + wxDateTime& MakeGMT(bool noDST = false) { return MakeUTC(noDST); } + + wxDateTime FromUTC(bool noDST = false) const + { return FromTimezone(UTC, noDST); } + wxDateTime& MakeFromUTC(bool noDST = false) + { return MakeFromTimezone(UTC, noDST); } // is daylight savings time in effect at this moment according to the // rules of the specified country? @@ -785,6 +820,7 @@ public: // the information is not available (this is compatible with ANSI C) int IsDST(Country country = Country_Default) const; + // accessors: many of them take the timezone parameter which indicates the // timezone for which to make the calculations and the default value means // to do it for the current timezone of this machine (even if the function @@ -806,6 +842,9 @@ public: // if the value is out of range inline time_t GetTicks() const; + // get the century, same as GetCentury(GetYear()) + int GetCentury(const TimeZone& tz = Local) const + { return GetCentury(GetYear(tz)); } // get the year (returns Inv_Year if date is invalid) int GetYear(const TimeZone& tz = Local) const { return GetTm(tz).year; } @@ -1046,6 +1085,9 @@ public: return localtime(&t); } + // get current time using thread-safe function + static struct tm *GetTmNow(struct tm *tmstruct); + private: // the current country - as it's the same for all program objects (unless // it runs on a _really_ big cluster system :-), this is a static member: @@ -1079,8 +1121,12 @@ public: // constructors // ------------------------------------------------------------------------ + // return the timespan for the given number of milliseconds + static wxTimeSpan Milliseconds(wxLongLong ms) { return wxTimeSpan(0, 0, 0, ms); } + static wxTimeSpan Millisecond() { return Milliseconds(1); } + // return the timespan for the given number of seconds - static wxTimeSpan Seconds(long sec) { return wxTimeSpan(0, 0, sec); } + static wxTimeSpan Seconds(wxLongLong sec) { return wxTimeSpan(0, 0, sec); } static wxTimeSpan Second() { return Seconds(1); } // return the timespan for the given number of minutes @@ -1107,8 +1153,8 @@ public: // milliseconds) inline wxTimeSpan(long hours, long minutes = 0, - long seconds = 0, - long milliseconds = 0); + wxLongLong seconds = 0, + wxLongLong milliseconds = 0); // default copy ctor is ok @@ -1150,7 +1196,7 @@ public: return wxTimeSpan(*this).Multiply(n); } - // return this timespan with inversed sign + // return this timespan with opposite sign wxTimeSpan Negate() const { return wxTimeSpan(-GetValue()); } // negate the value of the timespan wxTimeSpan& Neg() { m_diff = -GetValue(); return *this; } @@ -1528,7 +1574,8 @@ inline bool wxDateTime::IsInStdRange() const /* static */ inline wxDateTime wxDateTime::Now() { - return wxDateTime(*GetTmNow()); + struct tm tmstruct; + return wxDateTime(*GetTmNow(&tmstruct)); } /* static */ @@ -1839,20 +1886,26 @@ inline wxDateTime& wxDateTime::operator+=(const wxDateSpan& diff) // wxDateTime and timezones // ---------------------------------------------------------------------------- -inline wxDateTime wxDateTime::ToTimezone(const wxDateTime::TimeZone& tz, - bool noDST) const +inline wxDateTime +wxDateTime::ToTimezone(const wxDateTime::TimeZone& tz, bool noDST) const { MODIFY_AND_RETURN( MakeTimezone(tz, noDST) ); } +inline wxDateTime +wxDateTime::FromTimezone(const wxDateTime::TimeZone& tz, bool noDST) const +{ + MODIFY_AND_RETURN( MakeFromTimezone(tz, noDST) ); +} + // ---------------------------------------------------------------------------- // wxTimeSpan construction // ---------------------------------------------------------------------------- inline wxTimeSpan::wxTimeSpan(long hours, long minutes, - long seconds, - long milliseconds) + wxLongLong seconds, + wxLongLong milliseconds) { // assign first to avoid precision loss m_diff = hours; @@ -1875,7 +1928,9 @@ inline wxLongLong wxTimeSpan::GetSeconds() const inline int wxTimeSpan::GetMinutes() const { - return (GetSeconds() / 60l).GetLo(); + // explicit cast to int suppresses a warning with CodeWarrior and possibly + // others (changing the return type to long from int is impossible in 2.8) + return (int)((GetSeconds() / 60l).GetLo()); } inline int wxTimeSpan::GetHours() const