[PATCH] jscript: Date.parse: make "UTC"/"GMT" optional before the timezone offset

Markus Heidelberg markus.heidelberg at web.de
Sat May 21 05:41:40 CDT 2016


Tested on Windows 7 and Arch Linux.

Signed-off-by: Markus Heidelberg <markus.heidelberg at web.de>
---
 dlls/jscript/date.c       | 38 ++++++++++++++++++++++----------------
 dlls/jscript/tests/api.js |  4 ++++
 2 files changed, 26 insertions(+), 16 deletions(-)

diff --git a/dlls/jscript/date.c b/dlls/jscript/date.c
index 6d98fcd..a80690c 100644
--- a/dlls/jscript/date.c
+++ b/dlls/jscript/date.c
@@ -2174,6 +2174,28 @@ static inline HRESULT date_parse(jsstr_t *input_str, double *ret) {
                 year = tmp;
             }
         }
+        else if(parse[i]=='+' || parse[i]=='-') {
+            /* Timezone offset */
+            BOOL positive = TRUE;
+
+            if(set_offset && set_hour_adjust) break;
+            set_offset = TRUE;
+            set_hour_adjust = FALSE;
+
+            if(parse[i] == '-')  positive = FALSE;
+
+            i++;
+            while(isspaceW(parse[i])) i++;
+            if(parse[i]<'0' || parse[i]>'9') break;
+            offset = atoiW(&parse[i]);
+            while(parse[i]>='0' && parse[i]<='9') i++;
+
+            if(offset<24) offset *= 60;
+            else offset = (offset/100)*60 + offset%100;
+
+            if(positive) offset = -offset;
+
+        }
         else {
             if(parse[i]<'A' || parse[i]>'Z') break;
             else if(parse[i]=='B' && (parse[i+1]=='C' ||
@@ -2230,27 +2252,11 @@ static inline HRESULT date_parse(jsstr_t *input_str, double *ret) {
             else if((parse[i]=='U' && parse[i+1]=='T' && parse[i+2]=='C')
                     || (parse[i]=='G' && parse[i+1]=='M' && parse[i+2]=='T')) {
                 /* Timezone */
-                BOOL positive = TRUE;
-
                 if(set_offset) break;
                 set_offset = TRUE;
                 set_hour_adjust = FALSE;
 
                 i += 3;
-                while(isspaceW(parse[i])) i++;
-                if(parse[i] == '-')  positive = FALSE;
-                else if(parse[i] != '+') continue;
-
-                i++;
-                while(isspaceW(parse[i])) i++;
-                if(parse[i]<'0' || parse[i]>'9') break;
-                offset = atoiW(&parse[i]);
-                while(parse[i]>='0' && parse[i]<='9') i++;
-
-                if(offset<24) offset *= 60;
-                else offset = (offset/100)*60 + offset%100;
-
-                if(positive) offset = -offset;
             }
             else {
                 /* Month or garbage */
diff --git a/dlls/jscript/tests/api.js b/dlls/jscript/tests/api.js
index dacacc4..e5e6350 100644
--- a/dlls/jscript/tests/api.js
+++ b/dlls/jscript/tests/api.js
@@ -2108,6 +2108,10 @@ ok(Date.parse("71 11:32AM Dec 12 UTC BC ") === -64346358480000, "Date.parse(\"71
 ok(Date.parse("23/71/2000 11::32::UTC") === 1010662320000, "Date.parse(\"23/71/2000 11::32::UTC\") = " + Date.parse("23/71/2000 11::32::UTC"));
 ok(Date.parse("1970/01/01") === Date.parse("01/01/1970"), "Date.parse(\"1970/01/01\") = " + Date.parse("1970/01/01"));
 ok(Date.parse("71/12/14") === Date.parse("12/14/1971"), "Date.parse(\"71/12/14\") = " + Date.parse("71/12/14"));
+ok(Date.parse("Tue, 22 Mar 2016 09:57:55 -0300") === Date.parse("Tue, 22 Mar 2016 09:57:55 GMT-0300"),
+        "Date.parse(\"Tue, 22 Mar 2016 09:57:55 -0300\") = " + Date.parse("Tue, 22 Mar 2016 09:57:55 -0300"));
+ok(Date.parse("Tue, 22 Mar 2016 09:57:55 +0400") === Date.parse("Tue, 22 Mar 2016 09:57:55 UTC+0400"),
+        "Date.parse(\"Tue, 22 Mar 2016 09:57:55 +0400\") = " + Date.parse("Tue, 22 Mar 2016 09:57:55 +0400"));
 
 ok(typeof(Math.PI) === "number", "typeof(Math.PI) = " + typeof(Math.PI));
 ok(Math.floor(Math.PI*100) === 314, "Math.PI = " + Math.PI);
-- 
2.8.2




More information about the wine-patches mailing list