"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
/// </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 ();
}
{
get
{
- return new DateTime (true, GetNow ());
+ return new DateTime (GetNow ()).ToLocalTime ();
}
}
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
if (fileTime < 0)
throw new ArgumentOutOfRangeException ("fileTime", "< 0");
- return new DateTime (false, w32file_epoch + fileTime);
+ return new DateTime (w32file_epoch + fileTime);
}
#endif
long newticks = (result.ticks - utcoffset).Ticks;
- result = new DateTime (use_localtime, newticks);
+ result = new DateTime (newticks);
+ if (use_localtime)
+ result = result.ToLocalTime ();
return true;
}
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 */
}
}
+ internal static void ClearCurrentTimeZone ()
+ {
+ currentTimeZone = null;
+ }
+
public abstract string DaylightName {
get;
}
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);
}
}
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 ()