Browse Source

Merge pull request #238 from sebastienros/localeDateFormat

Using local timezone and formats for `toLocale` functions
Sébastien Ros 9 years ago
parent
commit
9f13e7146f

File diff suppressed because it is too large
+ 1159 - 1156
Jint.Tests/Runtime/EngineTests.cs


+ 12 - 3
Jint/Native/Date/DateConstructor.cs

@@ -56,6 +56,12 @@ namespace Jint.Native.Date
             {
                 if (!DateTime.TryParseExact(date, new[]
                 {
+                    // Formats used in DatePrototype toString methods
+                    "ddd MMM dd yyyy HH:mm:ss 'GMT'K",
+                    "ddd MMM dd yyyy",
+                    "HH:mm:ss 'GMT'K",
+
+                    // standard formats
                     "yyyy-M-dTH:m:s.FFFK",
                     "yyyy/M/dTH:m:s.FFFK",
                     "yyyy-M-dTH:m:sK",
@@ -79,10 +85,13 @@ namespace Jint.Native.Date
                     "THHK"
                 }, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal, out result))
                 {
-                    if (!DateTime.TryParse(date, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal,out result))
+                    if (!DateTime.TryParse(date, Engine.Options.GetCulture(), DateTimeStyles.AdjustToUniversal, out result))
                     {
-                        // unrecognized dates should return NaN (15.9.4.2)
-                        return double.NaN;
+                        if (!DateTime.TryParse(date, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal, out result))
+                        {
+                            // unrecognized dates should return NaN (15.9.4.2)
+                            return double.NaN;
+                        }
                     }
                 }
             }

+ 9 - 8
Jint/Native/Date/DatePrototype.cs

@@ -102,27 +102,27 @@ namespace Jint.Native.Date
 
         private JsValue ToDateString(JsValue thisObj, JsValue[] arguments)
         {
-            return EnsureDateInstance(thisObj).ToDateTime().ToString("D", CultureInfo.InvariantCulture);
+            return ToLocalTime(EnsureDateInstance(thisObj).ToDateTime()).ToString("ddd MMM dd yyyy", CultureInfo.InvariantCulture);
         }
 
         private JsValue ToTimeString(JsValue thisObj, JsValue[] arguments)
         {
-            return thisObj.TryCast<DateInstance>().ToDateTime().ToString("T", CultureInfo.InvariantCulture);
+            return ToLocalTime(EnsureDateInstance(thisObj).ToDateTime()).ToString("HH:mm:ss 'GMT'K", CultureInfo.InvariantCulture);
         }
 
         private JsValue ToLocaleString(JsValue thisObj, JsValue[] arguments)
         {
-            return EnsureDateInstance(thisObj).ToDateTime().ToString("F");
+            return ToLocalTime(EnsureDateInstance(thisObj).ToDateTime()).ToString("F", Engine.Options.GetCulture());
         }
 
         private JsValue ToLocaleDateString(JsValue thisObj, JsValue[] arguments)
         {
-            return thisObj.TryCast<DateInstance>().ToDateTime().ToString("D");
+            return ToLocalTime(EnsureDateInstance(thisObj).ToDateTime()).ToString("D", Engine.Options.GetCulture());
         }
 
         private JsValue ToLocaleTimeString(JsValue thisObj, JsValue[] arguments)
         {
-            return EnsureDateInstance(thisObj).ToDateTime().ToString("T");
+            return ToLocalTime(EnsureDateInstance(thisObj).ToDateTime()).ToString("T", Engine.Options.GetCulture());
         }
 
         private JsValue GetTime(JsValue thisObj, JsValue[] arguments)
@@ -525,7 +525,7 @@ namespace Jint.Native.Date
             {
                 throw new JavaScriptException(Engine.TypeError);
             } )
-            .ToDateTime().ToUniversalTime().ToString("r");
+            .ToDateTime().ToUniversalTime().ToString("ddd MMM dd yyyy HH:mm:ss 'GMT'", CultureInfo.InvariantCulture);
         }
 
         private JsValue ToISOString(JsValue thisObj, JsValue[] arguments)
@@ -876,14 +876,15 @@ namespace Jint.Native.Date
             return Engine.Options.GetLocalTimeZone().IsDaylightSavingTime(dateTime) ? MsPerHour : 0;
         }
 
-        public DateTime ToLocalTime(DateTime t)
+        public DateTimeOffset ToLocalTime(DateTime t)
         {
             if (t.Kind == DateTimeKind.Unspecified)
             {
                 return t;
             }
 
-            return TimeZoneInfo.ConvertTime(t, Engine.Options.GetLocalTimeZone());
+            var offset = Engine.Options.GetLocalTimeZone().BaseUtcOffset;
+            return new DateTimeOffset(t.Ticks + offset.Ticks, offset);
         }
 
         public double LocalTime(double t)

+ 1 - 5
Jint/Native/Number/NumberConstructor.cs

@@ -1,8 +1,6 @@
-using Jint.Native.Array;
-using Jint.Native.Function;
+using Jint.Native.Function;
 using Jint.Native.Object;
 using Jint.Runtime;
-using Jint.Runtime.Descriptors;
 
 namespace Jint.Native.Number
 {
@@ -71,7 +69,5 @@ namespace Jint.Native.Number
 
             return instance;
         }
-
-
     }
 }

+ 1 - 1
Jint/Native/Number/NumberPrototype.cs

@@ -60,7 +60,7 @@ namespace Jint.Native.Number
 
             if (m < 0)
             {
-                return "-" + ToNumberString(-m);
+                return "-" + ToLocaleString(-m, arguments);
             }
 
             if (double.IsPositiveInfinity(m) || m >= double.MaxValue)

Some files were not shown because too many files changed in this diff