[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-bugs-dist
Subject:    [Bug 78717] Date.UTC and Date.setUTC* produce incorrect time
From:       Pascal "Létourneau" <pletourn () globetrotter ! net>
Date:       2004-09-30 15:37:03
Message-ID: 20040930153703.15981.qmail () ktown ! kde ! org
[Download RAW message or body]

------- You are receiving this mail because: -------
You are on the CC list for the bug, or are watching someone who is.
        
http://bugs.kde.org/show_bug.cgi?id=78717        
pletourn globetrotter net changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |RESOLVED
         Resolution|                            |FIXED



------- Additional Comments From pletourn globetrotter net  2004-09-30 17:37 -------
CVS commit by pletourn: 

Fix new Date("01 Jan 2004 10:00")
Fix Date.setUTC*()
Fix Date.UTC()
CCMAIL:78717-done bugs kde org


  M +23 -19    date_object.cpp   1.80.2.2
  M +1 -1      date_object.h   1.22.6.1


--- kdelibs/kjs/date_object.h  #1.22:1.22.6.1
 @ -123,5 +123,5  @ namespace KJS {
   double KRFCDate_parseDate(const UString &_date);
   Value timeClip(const Value &t);
-  int local_timeoffset();
+  Number makeTime(struct tm *t, int milli, bool utc);
 
 } // namespace

--- kdelibs/kjs/date_object.cpp  #1.80.2.1:1.80.2.2
 @ -380,6 +380,5  @ Value DateProtoFuncImp::call(ExecState *
       id == SetMinutes || id == SetHours || id == SetDate ||
       id == SetMonth || id == SetFullYear ) {
-    t->tm_isdst = -1; // reset DST
-    result = Number(mktime(t) * 1000.0 + ms);
+    result = makeTime(t, ms, utc);
     thisObj.setInternalValue(result);
   }
 @ -462,5 +461,5  @ Object DateObjectImp::construct(ExecStat
     t.tm_isdst = -1;
     int ms = (numArgs >= 7) ? args[6].toInt32(exec) : 0;
-    value = Number(mktime(&t) * 1000.0 + ms);
+    value = makeTime(&t, ms, false);
   }
 
 @ -522,5 +521,5  @ Value DateObjectFuncImp::call(ExecState 
     t.tm_sec = (n >= 6) ? args[5].toInt32(exec) : 0;
     int ms = (n >= 7) ? args[6].toInt32(exec) : 0;
-    return Number(mktime(&t) * 1000.0 + ms);
+    return makeTime(&t, ms, true);
   }
 }
 @ -594,17 +593,19  @ static const struct {
 };
 
-int KJS::local_timeoffset()
+Number KJS::makeTime(struct tm *t, int ms, bool utc)
 {
-     static int local_offset = -1;
-
-     if ( local_offset != -1 ) return local_offset;
-
-     time_t local = time(0);
-     struct tm* tm_local = gmtime(&local);
-     local_offset = local-mktime(tm_local);
-     if(tm_local->tm_isdst)
-       local_offset += 3600;
+    int utcOffset;
+    if (utc) {
+        time_t zero = 0;
+        struct tm t3;
+        localtime_r(&zero, &t3);
+        utcOffset = t3.tm_gmtoff;
+        t->tm_isdst = t3.tm_isdst;
+    } else {
+        utcOffset = 0;
+        t->tm_isdst = -1;
+    }
 
-     return local_offset;
+    return Number( ( mktime(t) + utcOffset ) * 1000.0 + ms );
 }
 
 @ -863,5 +864,5  @ double KJS::KRFCDate_parseDate(const USt
         return invalidDate;
 
-     if (!have_time && !have_tz) {
+     if (!have_tz) {
        // fall back to midnight, local timezone
        struct tm t;
 @ -871,10 +872,13  @ double KJS::KRFCDate_parseDate(const USt
        t.tm_year = year - 1900;
        t.tm_isdst = -1;
+       if (have_time) {
+         t.tm_sec = second;
+         t.tm_min = minute;
+         t.tm_hour = hour;
+       }
+            
        return mktime(&t);
      }
 
-     if(!have_tz)
-       offset = local_timeoffset();
-     else
        offset *= 60;
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic