]> git.saurik.com Git - wxWidgets.git/commitdiff
1. wxLongLongWx::Assign(double) added (half implemented)
authorVadim Zeitlin <vadim@wxwidgets.org>
Mon, 27 Dec 1999 11:26:59 +0000 (11:26 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Mon, 27 Dec 1999 11:26:59 +0000 (11:26 +0000)
2. small wxDateTime bug fixed

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@5121 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/datetime.h
include/wx/datetime.inl
include/wx/longlong.h
samples/console/console.cpp
src/common/datetime.cpp
src/common/longlong.cpp

index a41287b335387307cf6e65ff58f5145b31f92151..657d1a507babf6ae2d2ac03039a0cf5b18b05cff 100644 (file)
@@ -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())
     //
     // 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
     // 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
 
         // 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?
 
         // is daylight savings time in effect at this moment according to the
         // rules of the specified country?
index 9c0dec16a370c2370f240537036bc834c4387829..3fb5776196c9bc6933bd5005a5d592ca9876256d 100644 (file)
@@ -279,9 +279,10 @@ wxDateTime& wxDateTime::operator+=(const wxDateSpan& diff)
 // wxDateTime and timezones
 // ----------------------------------------------------------------------------
 
 // 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);
 }
 
 // ----------------------------------------------------------------------------
 }
 
 // ----------------------------------------------------------------------------
index 4fd611a7103fe93201bf582e7d237c74a1634608..8a83c550ea605b060792c638c5d5c3861df43ef1 100644 (file)
@@ -25,7 +25,7 @@
 
 #include <limits.h>     // for LONG_MAX
 
 
 #include <limits.h>     // 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
 
 // ----------------------------------------------------------------------------
 // decide upon which class we will use
index ee96ced5d48c86515d4e6764b0b72d4f0ea01f1b..4124632a01477493fb0058092b231ad2f4552468 100644 (file)
@@ -1479,7 +1479,7 @@ int main(int argc, char **argv)
 #endif // TEST_MIME
 
 #ifdef TEST_TIME
 #endif // TEST_MIME
 
 #ifdef TEST_TIME
-    if ( 0 )
+    if ( 1 )
     {
     TestTimeSet();
     TestTimeStatic();
     {
     TestTimeSet();
     TestTimeStatic();
@@ -1491,9 +1491,8 @@ int main(int argc, char **argv)
     TestTimeWDays();
     TestTimeWNumber();
     TestTimeParse();
     TestTimeWDays();
     TestTimeWNumber();
     TestTimeParse();
-    }
-
     TestTimeFormat();
     TestTimeFormat();
+    }
 #endif // TEST_TIME
 
     wxUninitialize();
 #endif // TEST_TIME
 
     wxUninitialize();
index 93682aaca7346b257670cbf6a664ef37204b4d18..a35c8a7bedba4a7733b97e4805aa04b32e65b32e 100644 (file)
@@ -833,7 +833,8 @@ wxDateTime wxDateTime::GetBeginDST(int year, Country country)
 
         dt += wxTimeSpan::Hours(1);
 
 
         dt += wxTimeSpan::Hours(1);
 
-        dt.MakeGMT();
+        // disable DST tests because it could result in an infinite recursion!
+        dt.MakeGMT(TRUE);
     }
     else switch ( country )
     {
     }
     else switch ( country )
     {
@@ -933,7 +934,8 @@ wxDateTime wxDateTime::GetEndDST(int year, Country country)
 
         dt += wxTimeSpan::Hours(1);
 
 
         dt += wxTimeSpan::Hours(1);
 
-        dt.MakeGMT();
+        // disable DST tests because it could result in an infinite recursion!
+        dt.MakeGMT(TRUE);
     }
     else switch ( country )
     {
     }
     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
 {
 
 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
     // 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;
     }
 
     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
 }
     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();
 
 {
     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;
     {
         // 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
 
                     // 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 )
 
                     const wxChar *result = dt.ParseFormat(input, fmtCtime);
                     if ( !result )
@@ -2621,18 +2625,27 @@ const wxChar *wxDateTime::ParseFormat(const wxChar *date,
                 {
                     wxDateTime dt;
 
                 {
                     wxDateTime dt;
 
-                    wxString fmtDate;
+                    wxString fmtDate, fmtDateAlt;
                     if ( IsWestEuropeanCountry(GetCountry()) ||
                          GetCountry() == Russia )
                     {
                         fmtDate = _T("%d/%m/%y");
                     if ( IsWestEuropeanCountry(GetCountry()) ||
                          GetCountry() == Russia )
                     {
                         fmtDate = _T("%d/%m/%y");
+                        fmtDateAlt = _T("%m/%d/%y");
                     }
                     else // assume USA
                     {
                         fmtDate = _T("%m/%d/%y");
                     }
                     else // assume USA
                     {
                         fmtDate = _T("%m/%d/%y");
+                        fmtDateAlt = _T("%d/%m/%y");
                     }
 
                     const wxChar *result = dt.ParseFormat(input, fmtDate);
                     }
 
                     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
                     if ( !result )
                     {
                         // bad luck
index d1738aff745d0ab3594734eeb3304a69055da45d..0792e84902c663f7fa8b289710a72c5de500f01f 100644 (file)
@@ -30,6 +30,7 @@
 #include "wx/longlong.h"
 
 #include <memory.h>     // for memset()
 #include "wx/longlong.h"
 
 #include <memory.h>     // for memset()
+#include <math.h>       // for fabs()
 
 // ============================================================================
 // implementation
 
 // ============================================================================
 // implementation
@@ -80,8 +81,28 @@ ostream& operator<< (ostream& o, const wxLongLongNative& ll)
 
 #endif // wxUSE_LONGLONG_NATIVE
 
 
 #endif // wxUSE_LONGLONG_NATIVE
 
+// ============================================================================
+// wxLongLongWx: emulation of 'long long' using 2 longs
+// ============================================================================
+
 #if wxUSE_LONGLONG_WX
 
 #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)
 wxLongLongWx wxLongLongWx::operator<<(int shift) const
 {
     if (shift == 0)