Reviewed by Brady.
authorkmccullo <kmccullo@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 6 Oct 2006 18:16:38 +0000 (18:16 +0000)
committerkmccullo <kmccullo@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 6 Oct 2006 18:16:38 +0000 (18:16 +0000)
        DST and TimeZones were wrong in some cases, specifically on some of the dates where DST changes.

        * kjs/DateMath.cpp:
        (KJS::equivalentYearForDST):
        (KJS::getUTCOffset):
        (KJS::getDSTOffsetSimple):
        (KJS::getDSTOffset):
        (KJS::dateToMseconds):
        (KJS::msToTM):
        * kjs/DateMath.h:
        * kjs/date_object.cpp:
        (KJS::gmtoffset):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@16855 268f45cc-cd09-0410-ab3c-d52691b4dbfc

JavaScriptCore/ChangeLog
JavaScriptCore/kjs/DateMath.cpp
JavaScriptCore/kjs/DateMath.h
JavaScriptCore/kjs/date_object.cpp

index c3b95a05d3f38882bb69cb4abcfede15975d8187..3366e3125dbf877cc50cb80fba55acdeea38ae9d 100644 (file)
@@ -1,3 +1,20 @@
+2006-10-06  Kevin McCullough  <KMcCullough@apple.com>
+
+        Reviewed by Brady.
+
+        DST and TimeZones were wrong in some cases, specifically on some of the dates where DST changes.
+
+        * kjs/DateMath.cpp:
+        (KJS::equivalentYearForDST):
+        (KJS::getUTCOffset):
+        (KJS::getDSTOffsetSimple):
+        (KJS::getDSTOffset):
+        (KJS::dateToMseconds):
+        (KJS::msToTM):
+        * kjs/DateMath.h:
+        * kjs/date_object.cpp:
+        (KJS::gmtoffset):
+
 2006-10-05  Darin Adler  <darin@apple.com>
 
         Reviewed by Kevin McCullough.
index 193bd678ac1acb2cf937f26b895024bc033386bf..8f31c63e71f4115add1632e33e497d7d531b4b20 100644 (file)
@@ -303,7 +303,7 @@ static inline int equivalentYearForDST(int year)
     int day;
 
     day = (int) daysFrom1970ToYear(year) + 4;
-    day = day % 7;
+    day %= 7;
 
     if (day < 0)
         day += 7;
@@ -329,7 +329,7 @@ double getUTCOffset() {
         ltime.tm_yday = 0;
         ltime.tm_isdst = 0;
 
-        /* get the difference between this time zone and GMT */
+        // get the difference between this time zone and GMT 
         ltime.tm_mday = 2;
         ltime.tm_year = 70;
 
@@ -355,14 +355,14 @@ static double getDSTOffsetSimple(double localTimeSeconds)
 {
     if(localTimeSeconds > maxUnixTime)
         localTimeSeconds = maxUnixTime;
-    else if(localTimeSeconds < 0) /*go ahead a day to make localtime work (does not work with 0) */
-        localTimeSeconds = secondsPerDay;
+    else if(localTimeSeconds < 0) // Go ahead a day to make localtime work (does not work with 0)
+        localTimeSeconds += secondsPerDay;
 
+    struct tm prtm;
     double offsetTime = (localTimeSeconds * usecPerMsec) + getUTCOffset() ;
 
-    struct tm prtm;
-    prtm.tm_min   =  msToMinutes(offsetTime);
     prtm.tm_hour  =  msToHours(offsetTime);
+    prtm.tm_min   =  msToMinutes(offsetTime);
 
     // FIXME: time_t has a potential problem in 2038
     time_t localTime = static_cast<time_t>(localTimeSeconds);
@@ -398,41 +398,32 @@ static double getDSTOffset(double ms)
         ms = (day * msPerDay) + msToMilliseconds(ms);
     }
 
-    /* put our ms in an LL, and map it to usec for prtime */
     return getDSTOffsetSimple(ms / usecPerMsec);
 }
 
-static inline double localTimeToUTC(double ms)
-{
-    ms -= getUTCOffset();
-    ms -= getDSTOffset(ms);
-    return ms;
-}
-
-static inline double UTCToLocalTime(double ms)
-{
-    ms += getUTCOffset();
-    ms += getDSTOffset(ms);
-    return ms;
-}
-
 double dateToMseconds(tm* t, double ms, bool inputIsUTC)
 {
     int day = dateToDayInYear(t->tm_year + 1900, t->tm_mon, t->tm_mday);
     double msec_time = timeToMseconds(t->tm_hour, t->tm_min, t->tm_sec, ms);
     double result = (day * msPerDay) + msec_time;
 
-    if(!inputIsUTC)
-        result = localTimeToUTC(result);
+    if(!inputIsUTC) { // convert to UTC
+        result -= getUTCOffset();
+        result -= getDSTOffset(result);
+    }
 
     return result;
 }
 
 void msToTM(double ms, bool outputIsUTC, struct tm& tm)
 {
-    //input is UTC
-    if(!outputIsUTC)
-        ms = UTCToLocalTime(ms);
+    // input is UTC
+    double dstOff = 0.0;
+    
+    if(!outputIsUTC) {  // convert to local time
+        dstOff = getDSTOffset(ms);
+        ms += dstOff + getUTCOffset();
+    }
 
     tm.tm_sec   =  msToSeconds(ms);
     tm.tm_min   =  msToMinutes(ms);
@@ -442,9 +433,9 @@ void msToTM(double ms, bool outputIsUTC, struct tm& tm)
     tm.tm_yday  =  dayInYear(ms, msToYear(ms));
     tm.tm_mon   =  msToMonth(ms);
     tm.tm_year  =  msToYear(ms) - 1900;
-    tm.tm_isdst =  isDST(ms);
+    tm.tm_isdst =  dstOff != 0.0;
 
-    //everyone else seems to have these fields
+    // All other OS' seems to have these fields
 #if !PLATFORM(WIN_OS)
     struct tm xtm;
     // FIXME: time_t has a potential problem in 2038
@@ -455,10 +446,5 @@ void msToTM(double ms, bool outputIsUTC, struct tm& tm)
 #endif
 }
 
-bool isDST(const double& ms)
-{
-    return getDSTOffset(ms) != 0;
-}
-
-}   //namespace KJS
+}   // namespace KJS
 
index b977d5dc94ea2027d4da3f602cfc5198e187c5e0..a0b0447c678bcd893517e73ba27fb391c9655a88 100644 (file)
@@ -61,7 +61,6 @@ const double msPerHour = 60.0 * 60.0 * 1000.0;
 // Exported Functions //
 void msToTM(double, bool outputIsUTC, struct tm& );
 double dateToMseconds(tm*, double, bool inputIsUTC);
-bool isDST(const double&);
 double getUTCOffset();
 
 }   //namespace KJS
index 2c8be277071e1e75037124031669cc616bc129ad..7008c75c3c99925bc33c66035837b7771482750d 100644 (file)
@@ -69,8 +69,7 @@ inline int gmtoffset(const tm& t)
 {
 #if PLATFORM(WIN_OS)
     // Time is supposed to be in the current timezone.
-    static int utcOffset = static_cast<int>(getUTCOffset()/1000.0);
-    return utcOffset;
+    return -(_timezone / 60 - (t.tm_isdst != 0 ? 60 : 0 )) * 60;
 #else
     return t.tm_gmtoff;
 #endif