]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/datetime.cpp
Another place we need an autorelease pool.
[wxWidgets.git] / src / common / datetime.cpp
index 00d6b690e7f5fef46132f149d5ae5cdcbc14caa7..2474382dba6d6190fe7b136e852d065d84d0b767 100644 (file)
@@ -381,7 +381,8 @@ extern const char *wxDumpDate(const wxDateTime* dt)
     static char buf[128];
 
     wxString fmt(dt->Format("%Y-%m-%d (%a) %H:%M:%S"));
     static char buf[128];
 
     wxString fmt(dt->Format("%Y-%m-%d (%a) %H:%M:%S"));
-    wxStrlcpy(buf, fmt + " (" + dt->GetValue().ToString() + " ticks)",
+    wxStrlcpy(buf,
+              (fmt + " (" + dt->GetValue().ToString() + " ticks)").ToAscii(),
               WXSIZEOF(buf));
 
     return buf;
               WXSIZEOF(buf));
 
     return buf;
@@ -1272,6 +1273,17 @@ wxDateTime wxDateTime::GetBeginDST(int year, Country country)
                             wxFAIL_MSG( _T("no first Sunday in April?") );
                         }
                     }
                             wxFAIL_MSG( _T("no first Sunday in April?") );
                         }
                     }
+                    else if ( year > 2006 )
+                    // Energy Policy Act of 2005, Pub. L. no. 109-58, 119 Stat 594 (2005).
+                    // Starting in 2007, daylight time begins in the United States on the
+                    // second Sunday in March and ends on the first Sunday in November
+                    {
+                        if ( !dt.SetToWeekDay(Sun, 2, Mar, year) )
+                        {
+                            // weird...
+                            wxFAIL_MSG( _T("no second Sunday in March?") );
+                        }
+                    }
                     else
                     {
                         if ( !dt.SetToWeekDay(Sun, 1, Apr, year) )
                     else
                     {
                         if ( !dt.SetToWeekDay(Sun, 1, Apr, year) )
@@ -1348,21 +1360,36 @@ wxDateTime wxDateTime::GetEndDST(int year, Country country)
                     dt.Set(30, Sep, year);
                     break;
 
                     dt.Set(30, Sep, year);
                     break;
 
-                default:
-                    // DST ends at 2 a.m. on the last Sunday of October
-                    if ( !dt.SetToLastWeekDay(Sun, Oct, year) )
+                default: // default for switch (year)
+                    if ( year > 2006 )
+                      // Energy Policy Act of 2005, Pub. L. no. 109-58, 119 Stat 594 (2005).
+                      // Starting in 2007, daylight time begins in the United States on the
+                      // second Sunday in March and ends on the first Sunday in November
+                    {
+                        if ( !dt.SetToWeekDay(Sun, 1, Nov, year) )
+                        {
+                            // weird...
+                            wxFAIL_MSG( _T("no first Sunday in November?") );
+                        }
+                    }
+                    else
+                     // pre-2007
+                     // DST ends at 2 a.m. on the last Sunday of October
                     {
                     {
-                        // weirder and weirder...
-                        wxFAIL_MSG( _T("no last Sunday in October?") );
+                        if ( !dt.SetToLastWeekDay(Sun, Oct, year) )
+                        {
+                            // weirder and weirder...
+                            wxFAIL_MSG( _T("no last Sunday in October?") );
+                        }
                     }
 
                     dt += wxTimeSpan::Hours(2);
 
                     }
 
                     dt += wxTimeSpan::Hours(2);
 
-                    // TODO what about timezone??
+            // TODO: what about timezone??
             }
             break;
 
             }
             break;
 
-        default:
+        default: // default for switch (country)
             // assume October 26th as the end of the DST - totally bogus too
             dt.Set(26, Oct, year);
     }
             // assume October 26th as the end of the DST - totally bogus too
             dt.Set(26, Oct, year);
     }
@@ -3159,13 +3186,15 @@ wxDateTime::ParseFormat(const wxString& date,
          haveYear = false,
          haveHour = false,
          haveMin = false,
          haveYear = false,
          haveHour = false,
          haveMin = false,
-         haveSec = false;
+         haveSec = false,
+         haveMsec = false;
 
     bool hourIsIn12hFormat = false, // or in 24h one?
          isPM = false;              // AM by default
 
     // and the value of the items we have (init them to get rid of warnings)
 
     bool hourIsIn12hFormat = false, // or in 24h one?
          isPM = false;              // AM by default
 
     // and the value of the items we have (init them to get rid of warnings)
-    wxDateTime_t sec = 0,
+    wxDateTime_t msec = 0,
+                 sec = 0,
                  min = 0,
                  hour = 0;
     WeekDay wday = Inv_WeekDay;
                  min = 0,
                  hour = 0;
     WeekDay wday = Inv_WeekDay;
@@ -3349,6 +3378,14 @@ wxDateTime::ParseFormat(const wxString& date,
                 yday = (wxDateTime_t)num;
                 break;
 
                 yday = (wxDateTime_t)num;
                 break;
 
+            case _T('l'):       // milliseconds (0-999)
+                if ( !GetNumericToken(width, input, &num) )
+                    return NULL;
+
+                haveMsec = true;
+                msec = (wxDateTime_t)num;
+                break;
+
             case _T('m'):       // month as a number (01-12)
                 if ( !GetNumericToken(width, input, &num) || !num || (num > 12) )
                 {
             case _T('m'):       // month as a number (01-12)
                 if ( !GetNumericToken(width, input, &num) || !num || (num > 12) )
                 {
@@ -3730,6 +3767,9 @@ wxDateTime::ParseFormat(const wxString& date,
         tm.sec = sec;
     }
 
         tm.sec = sec;
     }
 
+    if ( haveMsec )
+        tm.msec = msec;
+
     Set(tm);
 
     // finally check that the week day is consistent -- if we had it
     Set(tm);
 
     // finally check that the week day is consistent -- if we had it
@@ -4273,6 +4313,14 @@ enum TimeSpanPart
 //  %l          milliseconds (000 - 999)
 wxString wxTimeSpan::Format(const wxString& format) const
 {
 //  %l          milliseconds (000 - 999)
 wxString wxTimeSpan::Format(const wxString& format) const
 {
+    // we deal with only positive time spans here and just add the sign in
+    // front for the negative ones
+    if ( IsNegative() )
+    {
+        wxString str(Negate().Format(format));
+        return "-" + str;
+    }
+
     wxCHECK_MSG( !format.empty(), wxEmptyString,
                  _T("NULL format in wxTimeSpan::Format") );
 
     wxCHECK_MSG( !format.empty(), wxEmptyString,
                  _T("NULL format in wxTimeSpan::Format") );
 
@@ -4344,13 +4392,6 @@ wxString wxTimeSpan::Format(const wxString& format) const
                     n = GetHours();
                     if ( partBiggest < Part_Hour )
                     {
                     n = GetHours();
                     if ( partBiggest < Part_Hour )
                     {
-                        if ( n < 0 )
-                        {
-                            // the sign has already been taken into account
-                            // when outputting the biggest part
-                            n = -n;
-                        }
-
                         n %= HOURS_PER_DAY;
                     }
                     else
                         n %= HOURS_PER_DAY;
                     }
                     else
@@ -4365,9 +4406,6 @@ wxString wxTimeSpan::Format(const wxString& format) const
                     n = GetMilliseconds().ToLong();
                     if ( partBiggest < Part_MSec )
                     {
                     n = GetMilliseconds().ToLong();
                     if ( partBiggest < Part_MSec )
                     {
-                        if ( n < 0 )
-                            n = -n;
-
                         n %= 1000;
                     }
                     //else: no need to reset partBiggest to Part_MSec, it is
                         n %= 1000;
                     }
                     //else: no need to reset partBiggest to Part_MSec, it is
@@ -4380,9 +4418,6 @@ wxString wxTimeSpan::Format(const wxString& format) const
                     n = GetMinutes();
                     if ( partBiggest < Part_Min )
                     {
                     n = GetMinutes();
                     if ( partBiggest < Part_Min )
                     {
-                        if ( n < 0 )
-                            n = -n;
-
                         n %= MIN_PER_HOUR;
                     }
                     else
                         n %= MIN_PER_HOUR;
                     }
                     else
@@ -4397,9 +4432,6 @@ wxString wxTimeSpan::Format(const wxString& format) const
                     n = GetSeconds().ToLong();
                     if ( partBiggest < Part_Sec )
                     {
                     n = GetSeconds().ToLong();
                     if ( partBiggest < Part_Sec )
                     {
-                        if ( n < 0 )
-                            n = -n;
-
                         n %= SEC_PER_MIN;
                     }
                     else
                         n %= SEC_PER_MIN;
                     }
                     else
@@ -4413,10 +4445,6 @@ wxString wxTimeSpan::Format(const wxString& format) const
 
             if ( digits )
             {
 
             if ( digits )
             {
-                // negative numbers need one extra position for '-' display
-                if ( n < 0 )
-                    digits++;
-
                 fmtPrefix << _T("0") << digits;
             }
 
                 fmtPrefix << _T("0") << digits;
             }