瀏覽代碼

fixes #5502 date parse to accept time zone offset

Duong Nguyen-Huu 7 年之前
父節點
當前提交
73b17dd067
共有 2 個文件被更改,包括 18 次插入5 次删除
  1. 12 1
      lib/Runtime/Library/DateImplementation.cpp
  2. 6 4
      test/Date/parseInvalidISO.baseline

+ 12 - 1
lib/Runtime/Library/DateImplementation.cpp

@@ -1266,13 +1266,23 @@ Error:
                 goto LError;
                 goto LError;
             }
             }
 
 
-            for (lwT = ch - '0'; !FBig(*pch) && isdigit(*pch); pch++)
+            for (lwT = ch - '0'; ; pch++)
             {
             {
+                // for time zone offset HH:mm, we already got HH so skip ':' and grab mm
+                if (((ss == ssAddOffset) || (ss == ssSubOffset)) && (*pch == ':')) 
+                {
+                    continue;
+                }
+                if (FBig(*pch) || !isdigit(*pch))
+                {
+                    break;
+                }
                 // to avoid overflow
                 // to avoid overflow
                 if (pch - pchBase > 6)
                 if (pch - pchBase > 6)
                 {
                 {
                     goto LError;
                     goto LError;
                 }
                 }
+                // convert string to number, e.g. 07:30 -> 730
                 lwT = lwT * 10 + *pch - '0';
                 lwT = lwT * 10 + *pch - '0';
             }
             }
 
 
@@ -1292,6 +1302,7 @@ Error:
 
 
                     if (lwNil != lwOffset)
                     if (lwNil != lwOffset)
                         goto LError;
                         goto LError;
+                    // convert into minutes, e.g. 730 -> 7*60+30
                     lwOffset = lwT < 24 ? lwT * 60 :
                     lwOffset = lwT < 24 ? lwT * 60 :
                         (lwT % 100) + (lwT / 100) * 60;
                         (lwT % 100) + (lwT / 100) * 60;
                     if (ssSubOffset == ss)
                     if (ssSubOffset == ss)

+ 6 - 4
test/Date/parseInvalidISO.baseline

@@ -19,13 +19,15 @@ Invalid Date
 Invalid Date
 Invalid Date
 
 
 0001-01-01T01:01:01.001+25:00
 0001-01-01T01:01:01.001+25:00
-Invalid Date
+0000-12-31T00:01:01.001Z
+-62135683138999 === -62135683138999
 
 
 0001-01-01T01:60:01.001Z
 0001-01-01T01:60:01.001Z
 Invalid Date
 Invalid Date
 
 
 0001-01-01T01:01:01.001+00:60
 0001-01-01T01:01:01.001+00:60
-Invalid Date
+0001-01-01T00:01:01.001Z
+-62135596738999 === -62135596738999
 
 
 0001-01-01T01:01:60.001Z
 0001-01-01T01:01:60.001Z
 Invalid Date
 Invalid Date
@@ -39,8 +41,8 @@ Invalid Date
 Invalid Date
 Invalid Date
 
 
 Total: 11
 Total: 11
-Accepted: 0
-Rejected: 11
+Accepted: 2
+Rejected: 9
 Failed: 0
 Failed: 0
 
 
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////