2005-09-06 Atsushi Enomoto <atsushi@ximian.com>
authorAtsushi Eno <atsushieno@gmail.com>
Tue, 6 Sep 2005 17:31:04 +0000 (17:31 -0000)
committerAtsushi Eno <atsushieno@gmail.com>
Tue, 6 Sep 2005 17:31:04 +0000 (17:31 -0000)
* TimeZone.cs, DateTime.cs :
  - ToLocalTime() and ToUniversalTime() are moved to TimeZone.
  - Added more COM patterns. Patch by Ankit Jain. Fixed bug #72132.

* DateTimeTest.cs : test for #72132.

svn path=/trunk/mcs/; revision=49554

mcs/class/corlib/System/ChangeLog
mcs/class/corlib/System/DateTime.cs
mcs/class/corlib/System/TimeZone.cs
mcs/class/corlib/Test/System/ChangeLog
mcs/class/corlib/Test/System/DateTimeTest.cs

index 2317a09b3441648e77d3953ecca292f0c81f9bbf..3371284418f1315767b1d376900ab07812e0729a 100644 (file)
@@ -1,3 +1,9 @@
+2005-09-06  Atsushi Enomoto  <atsushi@ximian.com>
+
+       * TimeZone.cs, DateTime.cs :
+         - ToLocalTime() and ToUniversalTime() are moved to TimeZone.
+         - Added more COM patterns. Patch by Ankit Jain. Fixed bug #72132.
+
 2005-09-06  Atsushi Enomoto  <atsushi@ximian.com>
 
        * DateTime.cs : (DoParse) DateTimeStyles.AdjustToUniversal was not
index 5b4a8e9b0509fa49a50495d75f710bb2d2d53a9a..03969af3a5328716e2f27a7f527216cedf9538a9 100644 (file)
@@ -118,8 +118,12 @@ namespace System
                        "dd-MMM-yy",
 
                        // DayOfTheWeek, dd full_month_name yyyy
-                       // FIXME: 1054(th-TH) rejects it
+                       // FIXME: 1054(th-TH) rejects them
                        "dddd, dd MMMM yyyy",
+                       "dddd, dd MMMM yyyy HH:mm",
+                       "dddd, dd MMMM yyyy HH:mm:ss",
+
+                       "yyyy MMMM",
                        // DayOfTheWeek, dd yyyy. This works for every locales.
                        "MMMM dd, yyyy",
 #if NET_1_1
@@ -228,20 +232,8 @@ namespace System
                /// </summary>
                /// 
                public DateTime (long newticks)
-                       // `local' must default to false here to avoid
-                       // a recursion loop.
-                       : this (false, newticks) {}
-
-               internal DateTime (bool local, long newticks)
                {
                        ticks = new TimeSpan (newticks);
-                       if (local) {
-                               TimeZone tz = TimeZone.CurrentTimeZone;
-
-                               TimeSpan utcoffset = tz.GetUtcOffset (this);
-
-                               ticks = ticks + utcoffset;
-                       }
                        if (ticks.Ticks < MinValue.Ticks || ticks.Ticks > MaxValue.Ticks)
                            throw new ArgumentOutOfRangeException ();
                }
@@ -381,7 +373,7 @@ namespace System
                {
                        get     
                        {
-                               return new DateTime (true, GetNow ());
+                               return new DateTime (GetNow ()).ToLocalTime ();
                        }
                }
 
@@ -569,7 +561,7 @@ namespace System
                        if (fileTime < 0)
                                throw new ArgumentOutOfRangeException ("fileTime", "< 0");
 
-                       return new DateTime (true, w32file_epoch + fileTime);
+                       return new DateTime (w32file_epoch + fileTime).ToLocalTime ();
                }
 
 #if NET_1_1
@@ -578,7 +570,7 @@ namespace System
                        if (fileTime < 0)
                                throw new ArgumentOutOfRangeException ("fileTime", "< 0");
 
-                       return new DateTime (false, w32file_epoch + fileTime);
+                       return new DateTime (w32file_epoch + fileTime);
                }
 #endif
 
@@ -1315,7 +1307,9 @@ namespace System
 
                        long newticks = (result.ticks - utcoffset).Ticks;
 
-                       result = new DateTime (use_localtime, newticks);
+                       result = new DateTime (newticks);
+                       if (use_localtime)
+                               result = result.ToLocalTime ();
 
                        return true;
                }
@@ -1799,47 +1793,14 @@ namespace System
                        return this._ToString (format, dfi);
                }
 
-               public DateTime ToLocalTime()
+               public DateTime ToLocalTime ()
                {
-                       TimeZone tz = TimeZone.CurrentTimeZone;
-
-                       TimeSpan offset = tz.GetUtcOffset (this);
-
-                       if (offset.Ticks > 0) {
-                               if (DateTime.MaxValue - offset < this)
-                                       return DateTime.MaxValue;
-                       } else if (offset.Ticks < 0) {
-                               // MS.NET fails to check validity here 
-                               // - it may throw ArgumentOutOfRangeException
-                               /*
-                               if (DateTime.MinValue - offset > this)
-                                       return DateTime.MinValue;
-                               */
-                       }
-                       
-                       DateTime lt = new DateTime(true, ticks+offset);
-                       TimeSpan ltoffset = tz.GetUtcOffset(lt);
-                       if(ltoffset != offset)
-                               lt = lt.Add(ltoffset.Subtract(offset));
-
-                       return lt;
+                       return TimeZone.CurrentTimeZone.ToLocalTime (this);
                }
 
                public DateTime ToUniversalTime()
                {
-                       TimeZone tz = TimeZone.CurrentTimeZone;
-
-                       TimeSpan offset = tz.GetUtcOffset (this);
-
-                       if (offset.Ticks < 0) {
-                               if (DateTime.MaxValue + offset < this)
-                                       return DateTime.MaxValue;
-                       } else if (offset.Ticks > 0) {
-                               if (DateTime.MinValue + offset > this)
-                                       return DateTime.MinValue;
-                       }
-
-                       return new DateTime (false, ticks - offset);
+                       return TimeZone.CurrentTimeZone.ToUniversalTime (this);
                }
 
                /*  OPERATORS */
index cdbd724df51f891077723dc1719ebc82d475f983..e14e20076ffd0ea3a3c24389ae0d9ee2d55367ed 100644 (file)
@@ -59,6 +59,11 @@ namespace System
                        }
                }
 
+               internal static void ClearCurrentTimeZone ()
+               {
+                       currentTimeZone = null;
+               }
+
                public abstract string DaylightName {
                        get;
                }
@@ -103,12 +108,42 @@ namespace System
 
                public virtual DateTime ToLocalTime (DateTime time)
                {
-                       return time + GetUtcOffset (time);
+//                     return time + GetUtcOffset (time);
+                       TimeSpan offset = GetUtcOffset (time);
+
+                       if (offset.Ticks > 0) {
+                               if (DateTime.MaxValue - offset < time)
+                                       return DateTime.MaxValue;
+                       } else if (offset.Ticks < 0) {
+                               // MS.NET fails to check validity here 
+                               // - it may throw ArgumentOutOfRangeException
+                               /*
+                               if (DateTime.MinValue - offset > this)
+                                       return DateTime.MinValue;
+                               */
+                       }
+                       
+                       DateTime lt = new DateTime (time.Ticks + offset.Ticks);
+                       TimeSpan ltoffset = GetUtcOffset (lt);
+                       if (ltoffset != offset)
+                               lt = lt.Add (ltoffset.Subtract (offset));
+
+                       return lt;
                }
 
                public virtual DateTime ToUniversalTime (DateTime time)
                {
-                       return time - GetUtcOffset (time);
+                       TimeSpan offset = GetUtcOffset (time);
+
+                       if (offset.Ticks < 0) {
+                               if (DateTime.MaxValue + offset < time)
+                                       return DateTime.MaxValue;
+                       } else if (offset.Ticks > 0) {
+                               if (DateTime.MinValue + offset > time)
+                                       return DateTime.MinValue;
+                       }
+
+                       return new DateTime (time.Ticks - offset.Ticks);
                }
        }
 
index 8450da76f8396691350f1f251e919f5a4557ef67..d44de4fefc73dd976ee90d8f8720bb6a9498c01b 100644 (file)
@@ -1,3 +1,7 @@
+2005-09-06  Atsushi Enomoto  <atsushi@ximian.com>
+
+       * DateTimeTest.cs : test for #72132.
+
 2005-09-06  Atsushi Enomoto  <atsushi@ximian.com>
 
        * DateTimeTest.cs : test for #75995.
index 7126fd1ef8d7c2984b32dddff4fc8f390e8a856a..ee2e763bd202518f0c0f76ad090757d8c2fbf297 100644 (file)
@@ -680,12 +680,22 @@ public class DateTimeTest : Assertion
                AssertEquals ("H14", t2.Ticks, t1.Ticks);
 
                t2 = new DateTime (2002, 2, 1);
-               t1 = DateTime.Parse ("2002 February");
+               t1 = DateTime.Parse ("2002 February", new CultureInfo ("ja-JP"));
                AssertEquals ("H15", t2.Ticks, t1.Ticks);
 
                t2 = new DateTime (DateTime.Today.Year, 2, 8);
                t1 = DateTime.Parse ("February 8");
                AssertEquals ("H16", t2.Ticks, t1.Ticks);
+
+               // bug #72132
+               t2 = new DateTime (2002, 2, 25, 5, 25, 22);
+               t1 = DateTime.Parse ("Monday, 25 February 2002 05:25:22",
+                       new CultureInfo ("hi-IN"));
+               AssertEquals ("H17", t2.Ticks, t1.Ticks);
+               t2 = new DateTime (2002, 2, 25, 5, 25, 0);
+               t1 = DateTime.Parse ("Monday, 25 February 2002 05:25",
+                       new CultureInfo ("hi-IN"));
+               AssertEquals ("H18", t2.Ticks, t1.Ticks);
        }
 
        public void TestParse3 ()