From: Vadim Zeitlin Date: Mon, 27 Dec 1999 11:26:59 +0000 (+0000) Subject: 1. wxLongLongWx::Assign(double) added (half implemented) X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/41acf5c0bd373d2dbe127fc6a64ac03b672b2431 1. wxLongLongWx::Assign(double) added (half implemented) 2. small wxDateTime bug fixed git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@5121 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/include/wx/datetime.h b/include/wx/datetime.h index a41287b335..657d1a507b 100644 --- a/include/wx/datetime.h +++ b/include/wx/datetime.h @@ -685,16 +685,21 @@ public: // time. Using the functions below, it may be converted to another time // zone (for example, the Unix epoch is wxDateTime(1, Jan, 1970).ToGMT()) // + // 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) const; - wxDateTime& MakeTimezone(const TimeZone& tz); + inline wxDateTime ToTimezone(const TimeZone& tz, bool noDST = FALSE) const; + wxDateTime& MakeTimezone(const TimeZone& tz, bool noDST = FALSE); // transform to GMT/UTC - wxDateTime ToGMT() const { return ToTimezone(GMT0); } - wxDateTime& MakeGMT() { return MakeTimezone(GMT0); } + wxDateTime ToGMT(bool noDST = FALSE) const { return ToTimezone(GMT0, noDST); } + wxDateTime& MakeGMT(bool noDST = FALSE) { return MakeTimezone(GMT0, noDST); } // is daylight savings time in effect at this moment according to the // rules of the specified country? diff --git a/include/wx/datetime.inl b/include/wx/datetime.inl index 9c0dec16a3..3fb5776196 100644 --- a/include/wx/datetime.inl +++ b/include/wx/datetime.inl @@ -279,9 +279,10 @@ wxDateTime& wxDateTime::operator+=(const wxDateSpan& diff) // wxDateTime and timezones // ---------------------------------------------------------------------------- -wxDateTime wxDateTime::ToTimezone(const wxDateTime::TimeZone& tz) const +wxDateTime wxDateTime::ToTimezone(const wxDateTime::TimeZone& tz, + bool noDST) const { - return wxDateTime(*this).MakeTimezone(tz); + return wxDateTime(*this).MakeTimezone(tz, noDST); } // ---------------------------------------------------------------------------- diff --git a/include/wx/longlong.h b/include/wx/longlong.h index 4fd611a710..8a83c550ea 100644 --- a/include/wx/longlong.h +++ b/include/wx/longlong.h @@ -25,7 +25,7 @@ #include // for LONG_MAX -//#define wxUSE_LONGLONG_WX 1 // for testing (VZ) +// #define wxUSE_LONGLONG_WX 1 // for testing (VZ) // ---------------------------------------------------------------------------- // decide upon which class we will use diff --git a/samples/console/console.cpp b/samples/console/console.cpp index ee96ced5d4..4124632a01 100644 --- a/samples/console/console.cpp +++ b/samples/console/console.cpp @@ -1479,7 +1479,7 @@ int main(int argc, char **argv) #endif // TEST_MIME #ifdef TEST_TIME - if ( 0 ) + if ( 1 ) { TestTimeSet(); TestTimeStatic(); @@ -1491,9 +1491,8 @@ int main(int argc, char **argv) TestTimeWDays(); TestTimeWNumber(); TestTimeParse(); - } - TestTimeFormat(); + } #endif // TEST_TIME wxUninitialize(); diff --git a/src/common/datetime.cpp b/src/common/datetime.cpp index 93682aaca7..a35c8a7bed 100644 --- a/src/common/datetime.cpp +++ b/src/common/datetime.cpp @@ -833,7 +833,8 @@ wxDateTime wxDateTime::GetBeginDST(int year, Country country) dt += wxTimeSpan::Hours(1); - dt.MakeGMT(); + // disable DST tests because it could result in an infinite recursion! + dt.MakeGMT(TRUE); } else switch ( country ) { @@ -933,7 +934,8 @@ wxDateTime wxDateTime::GetEndDST(int year, Country country) dt += wxTimeSpan::Hours(1); - dt.MakeGMT(); + // disable DST tests because it could result in an infinite recursion! + dt.MakeGMT(TRUE); } else switch ( country ) { @@ -1505,7 +1507,7 @@ wxDateTime::wxDateTime_t wxDateTime::GetDayOfYear(const TimeZone& tz) const wxDateTime::wxDateTime_t wxDateTime::GetWeekOfYear(const TimeZone& tz) const { -#if 0 +#if 1 // the first week of the year is the one which contains Jan, 4 (according // to ISO standard rule), so the year day N0 = 4 + 7*W always lies in the // week W+1. As any day N = 7*W + 4 + (N - 4)%7, it lies in the same week @@ -1527,7 +1529,8 @@ wxDateTime::wxDateTime_t wxDateTime::GetWeekOfYear(const TimeZone& tz) const } return week; -#else // this seems to be a bit simpler and I believe is also correct +#else // 0 + // an attempt at doing it simpler - but this doesn't quite work... return (WeekDay)((GetDayOfYear(tz) - (GetWeekDay(tz) - 1 + 7) % 7 + 7) / 7); #endif // 0/1 } @@ -1628,12 +1631,13 @@ int wxDateTime::IsDST(wxDateTime::Country country) const } } -wxDateTime& wxDateTime::MakeTimezone(const TimeZone& tz) +wxDateTime& wxDateTime::MakeTimezone(const TimeZone& tz, bool noDST) { int secDiff = GetTimeZone() + tz.GetOffset(); - // we need to know whether DST is or not in effect for this date - if ( IsDST() == 1 ) + // we need to know whether DST is or not in effect for this date unless + // the test disabled by the caller + if ( !noDST && (IsDST() == 1) ) { // FIXME we assume that the DST is always shifted by 1 hour secDiff -= 3600; @@ -2395,7 +2399,7 @@ const wxChar *wxDateTime::ParseFormat(const wxChar *date, // this is the format which corresponds to ctime() output // and strptime("%c") should parse it, so try it first - static const wxChar *fmtCtime = _T("%a %b %e %H:%M:%S %Y"); + static const wxChar *fmtCtime = _T("%a %b %d %H:%M:%S %Y"); const wxChar *result = dt.ParseFormat(input, fmtCtime); if ( !result ) @@ -2621,18 +2625,27 @@ const wxChar *wxDateTime::ParseFormat(const wxChar *date, { wxDateTime dt; - wxString fmtDate; + wxString fmtDate, fmtDateAlt; if ( IsWestEuropeanCountry(GetCountry()) || GetCountry() == Russia ) { fmtDate = _T("%d/%m/%y"); + fmtDateAlt = _T("%m/%d/%y"); } else // assume USA { fmtDate = _T("%m/%d/%y"); + fmtDateAlt = _T("%d/%m/%y"); } const wxChar *result = dt.ParseFormat(input, fmtDate); + + if ( !result ) + { + // ok, be nice and try another one + result = dt.ParseFormat(input, fmtDateAlt); + } + if ( !result ) { // bad luck diff --git a/src/common/longlong.cpp b/src/common/longlong.cpp index d1738aff74..0792e84902 100644 --- a/src/common/longlong.cpp +++ b/src/common/longlong.cpp @@ -30,6 +30,7 @@ #include "wx/longlong.h" #include // for memset() +#include // for fabs() // ============================================================================ // implementation @@ -80,8 +81,28 @@ ostream& operator<< (ostream& o, const wxLongLongNative& ll) #endif // wxUSE_LONGLONG_NATIVE +// ============================================================================ +// wxLongLongWx: emulation of 'long long' using 2 longs +// ============================================================================ + #if wxUSE_LONGLONG_WX +// assignment +wxLongLongWx& wxLongLongWx::Assign(double d) +{ + if ( fabs(d) <= LONG_MAX ) + { + m_hi = d < 0 ? 1 << (8*sizeof(long) - 1) : 0l; + m_lo = (long)d; + } + else + { + wxFAIL_MSG(_T("TODO")); + } + + return *this; +} + wxLongLongWx wxLongLongWx::operator<<(int shift) const { if (shift == 0)