JSON.stringify(Date) loses the milliseconds information
authoroliver@apple.com <oliver@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 9 Sep 2009 07:02:24 +0000 (07:02 +0000)
committeroliver@apple.com <oliver@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 9 Sep 2009 07:02:24 +0000 (07:02 +0000)
https://bugs.webkit.org/show_bug.cgi?id=29063

Reviewed by Maciej Stachowiak.

Make sure we include milliseconds in the output of toISOString.

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

JavaScriptCore/ChangeLog
JavaScriptCore/runtime/DatePrototype.cpp
LayoutTests/ChangeLog
LayoutTests/fast/js/date-toisostring-expected.txt
LayoutTests/fast/js/resources/date-toisostring.js

index 0ace87c..2020b8c 100644 (file)
@@ -1,3 +1,15 @@
+2009-09-08  Oliver Hunt  <oliver@apple.com>
+
+        Reviewed by Maciej Stachowiak.
+
+        JSON.stringify(Date) loses the milliseconds information
+        https://bugs.webkit.org/show_bug.cgi?id=29063
+
+        Make sure we include milliseconds in the output of toISOString.
+
+        * runtime/DatePrototype.cpp:
+        (JSC::dateProtoFuncToISOString):
+
 2009-09-08  Kevin Ollivier  <kevino@theolliviers.com>
 
         wx build fix, generate derived sources earlier in order to make sure
 2009-09-08  Kevin Ollivier  <kevino@theolliviers.com>
 
         wx build fix, generate derived sources earlier in order to make sure
index 1708d44..40ff62c 100644 (file)
@@ -463,10 +463,10 @@ JSValue JSC_HOST_CALL dateProtoFuncToISOString(ExecState* exec, JSObject*, JSVal
     
     GregorianDateTime t;
     thisDateObj->msToGregorianDateTime(milli, utc, t);
     
     GregorianDateTime t;
     thisDateObj->msToGregorianDateTime(milli, utc, t);
-    // Maximum amount of space we need in buffer: 6 (max. digits in year) + 2 * 5 (2 characters each for month, day, hour, minute, second)
-    // 6 for formatting and one for null termination = 23.  We add one extra character to allow us to force null termination.
-    char buffer[24];
-    snprintf(buffer, sizeof(buffer) - 1, "%04d-%02d-%02dT%02d:%02d:%02dZ", 1900 + t.year, t.month + 1, t.monthDay, t.hour, t.minute, t.second);
+    // Maximum amount of space we need in buffer: 6 (max. digits in year) + 2 * 5 (2 characters each for month, day, hour, minute, second) + 4 (. + 3 digits for milliseconds)
+    // 6 for formatting and one for null termination = 27.  We add one extra character to allow us to force null termination.
+    char buffer[28];
+    snprintf(buffer, sizeof(buffer) - 1, "%04d-%02d-%02dT%02d:%02d:%02d.%03dZ", 1900 + t.year, t.month + 1, t.monthDay, t.hour, t.minute, t.second, static_cast<int>(fmod(milli, 1000)));
     buffer[sizeof(buffer) - 1] = 0;
     return jsNontrivialString(exec, buffer);
 }
     buffer[sizeof(buffer) - 1] = 0;
     return jsNontrivialString(exec, buffer);
 }
index a620a79..bb7b1b3 100644 (file)
@@ -1,3 +1,15 @@
+2009-09-08  Oliver Hunt  <oliver@apple.com>
+
+        Reviewed by Maciej Stachowiak.
+
+        JSON.stringify(Date) loses the milliseconds information
+        https://bugs.webkit.org/show_bug.cgi?id=29063
+
+        Update test results for Date.toISOString.
+
+        * fast/js/date-toisostring-expected.txt:
+        * fast/js/resources/date-toisostring.js:
+
 2009-09-08  Drew Wilson  <atwilson@google.com>
 
         Reviewed by Maciej Stachowiak.
 2009-09-08  Drew Wilson  <atwilson@google.com>
 
         Reviewed by Maciej Stachowiak.
index 6e8abd7..a8e82c6 100644 (file)
@@ -5,12 +5,12 @@ On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE
 
 PASS Date.toISOString.call({}) threw exception TypeError: Result of expression 'Date.toISOString' [undefined] is not an object..
 PASS Date.toISOString.call(0) threw exception TypeError: Result of expression 'Date.toISOString' [undefined] is not an object..
 
 PASS Date.toISOString.call({}) threw exception TypeError: Result of expression 'Date.toISOString' [undefined] is not an object..
 PASS Date.toISOString.call(0) threw exception TypeError: Result of expression 'Date.toISOString' [undefined] is not an object..
-PASS new Date(0).toISOString() is '1970-01-01T00:00:00Z'
-PASS new Date('1 January 1500 UTC').toISOString() is '1500-01-01T00:00:00Z'
-PASS new Date('1 January 2000 UTC').toISOString() is '2000-01-01T00:00:00Z'
-PASS new Date('1 January 4000 UTC').toISOString() is '4000-01-01T00:00:00Z'
-PASS new Date('1 January 100000 UTC').toISOString() is '100000-01-01T00:00:00Z'
-PASS new Date('10 March 2000 UTC').toISOString() is '2000-03-10T00:00:00Z'
+PASS new Date(0).toISOString() is '1970-01-01T00:00:00.000Z'
+PASS new Date('1 January 1500 UTC').toISOString() is '1500-01-01T00:00:00.000Z'
+PASS new Date('1 January 2000 UTC').toISOString() is '2000-01-01T00:00:00.000Z'
+PASS new Date('1 January 4000 UTC').toISOString() is '4000-01-01T00:00:00.000Z'
+PASS new Date('1 January 100000 UTC').toISOString() is '100000-01-01T00:00:00.000Z'
+PASS new Date('10 March 2000 UTC').toISOString() is '2000-03-10T00:00:00.000Z'
 PASS new Date(NaN).toISOString() is 'Invalid Date'
 PASS successfullyParsed is true
 
 PASS new Date(NaN).toISOString() is 'Invalid Date'
 PASS successfullyParsed is true
 
index 6166f25..12dcaf4 100644 (file)
@@ -3,12 +3,12 @@ description("Tests for Date.toISOString");
 shouldThrow("Date.toISOString.call({})");
 shouldThrow("Date.toISOString.call(0)");
 
 shouldThrow("Date.toISOString.call({})");
 shouldThrow("Date.toISOString.call(0)");
 
-shouldBe("new Date(0).toISOString()", "'1970-01-01T00:00:00Z'");
-shouldBe("new Date('1 January 1500 UTC').toISOString()", "'1500-01-01T00:00:00Z'");
-shouldBe("new Date('1 January 2000 UTC').toISOString()", "'2000-01-01T00:00:00Z'");
-shouldBe("new Date('1 January 4000 UTC').toISOString()", "'4000-01-01T00:00:00Z'");
-shouldBe("new Date('1 January 100000 UTC').toISOString()", "'100000-01-01T00:00:00Z'");
-shouldBe("new Date('10 March 2000 UTC').toISOString()", "'2000-03-10T00:00:00Z'");
+shouldBe("new Date(0).toISOString()", "'1970-01-01T00:00:00.000Z'");
+shouldBe("new Date('1 January 1500 UTC').toISOString()", "'1500-01-01T00:00:00.000Z'");
+shouldBe("new Date('1 January 2000 UTC').toISOString()", "'2000-01-01T00:00:00.000Z'");
+shouldBe("new Date('1 January 4000 UTC').toISOString()", "'4000-01-01T00:00:00.000Z'");
+shouldBe("new Date('1 January 100000 UTC').toISOString()", "'100000-01-01T00:00:00.000Z'");
+shouldBe("new Date('10 March 2000 UTC').toISOString()", "'2000-03-10T00:00:00.000Z'");
 shouldBe("new Date(NaN).toISOString()", "'Invalid Date'");
 
 successfullyParsed = true;
 shouldBe("new Date(NaN).toISOString()", "'Invalid Date'");
 
 successfullyParsed = true;