string daylightDisplayName;
public string DaylightName {
get {
- if (disableDaylightSavingTime)
- return String.Empty;
- return daylightDisplayName;
+ return supportsDaylightSavingTime
+ ? daylightDisplayName
+ : string.Empty;
}
}
local = ZoneInfoDB.Default;
#elif MONOTOUCH
using (Stream stream = GetMonoTouchDefault ()) {
- return BuildFromStream ("Local", stream);
+ local = BuildFromStream ("Local", stream);
}
#elif LIBC
try {
get { return standardDisplayName; }
}
- bool disableDaylightSavingTime;
+ bool supportsDaylightSavingTime;
public bool SupportsDaylightSavingTime {
- get { return !disableDaylightSavingTime; }
+ get { return supportsDaylightSavingTime; }
}
static TimeZoneInfo utc;
}
}
#if LIBC
- static string timeZoneDirectory = null;
+ static string timeZoneDirectory;
static string TimeZoneDirectory {
get {
if (timeZoneDirectory == null)
return str.Substring (Istart, Iend-Istart+1);
}
- static RegistryKey timeZoneKey = null;
+ static RegistryKey timeZoneKey;
static RegistryKey TimeZoneKey {
get {
if (timeZoneKey != null)
}
}
- static RegistryKey localZoneKey = null;
+ static RegistryKey localZoneKey;
static RegistryKey LocalZoneKey {
get {
if (localZoneKey != null)
public static DateTime ConvertTime (DateTime dateTime, TimeZoneInfo sourceTimeZone, TimeZoneInfo destinationTimeZone)
{
if (dateTime.Kind == DateTimeKind.Local && sourceTimeZone != TimeZoneInfo.Local)
- throw new ArgumentException ("Kind propery of dateTime is Local but the sourceTimeZone does not equal TimeZoneInfo.Local");
+ throw new ArgumentException ("Kind property of dateTime is Local but the sourceTimeZone does not equal TimeZoneInfo.Local");
if (dateTime.Kind == DateTimeKind.Utc && sourceTimeZone != TimeZoneInfo.Utc)
- throw new ArgumentException ("Kind propery of dateTime is Utc but the sourceTimeZone does not equal TimeZoneInfo.Utc");
+ throw new ArgumentException ("Kind property of dateTime is Utc but the sourceTimeZone does not equal TimeZoneInfo.Utc");
if (sourceTimeZone.IsInvalidTime (dateTime))
throw new ArgumentException ("dateTime parameter is an invalid time");
}
- public static DateTimeOffset ConvertTime (DateTimeOffset dateTimeOffset, TimeZoneInfo destinationTimeZone)
+ public static DateTimeOffset ConvertTime(DateTimeOffset dateTimeOffset, TimeZoneInfo destinationTimeZone)
{
- throw new NotImplementedException ();
+ if (destinationTimeZone == null)
+ throw new ArgumentNullException("destinationTimeZone");
+
+ var utcDateTime = dateTimeOffset.UtcDateTime;
+ AdjustmentRule rule = GetApplicableRule (utcDateTime);
+
+ if (rule != null && destinationTimeZone.IsDaylightSavingTime(utcDateTime)) {
+ var offset = destinationTimeZone.BaseUtcOffset + rule.DaylightDelta;
+ return new DateTimeOffset(DateTime.SpecifyKind(utcDateTime, DateTimeKind.Unspecified) + offset, offset);
+ }
+ else {
+ return new DateTimeOffset(DateTime.SpecifyKind(utcDateTime, DateTimeKind.Unspecified) + destinationTimeZone.BaseUtcOffset, destinationTimeZone.BaseUtcOffset);
+ }
}
public static DateTime ConvertTimeBySystemTimeZoneId (DateTime dateTime, string destinationTimeZoneId)
throw new ArgumentNullException ("sourceTimeZone");
if (dateTime.Kind == DateTimeKind.Utc && sourceTimeZone != TimeZoneInfo.Utc)
- throw new ArgumentException ("Kind propery of dateTime is Utc but the sourceTimeZone does not equal TimeZoneInfo.Utc");
+ throw new ArgumentException ("Kind property of dateTime is Utc but the sourceTimeZone does not equal TimeZoneInfo.Utc");
if (dateTime.Kind == DateTimeKind.Local && sourceTimeZone != TimeZoneInfo.Local)
- throw new ArgumentException ("Kind propery of dateTime is Local but the sourceTimeZone does not equal TimeZoneInfo.Local");
+ throw new ArgumentException ("Kind property of dateTime is Local but the sourceTimeZone does not equal TimeZoneInfo.Local");
if (sourceTimeZone.IsInvalidTime (dateTime))
throw new ArgumentException ("dateTime parameter is an invalid time");
return new TimeZoneInfo (id, baseUtcOffset, displayName, standardDisplayName, daylightDisplayName, adjustmentRules, disableDaylightSavingTime);
}
+#if NET_4_5
+ public override bool Equals (object obj)
+ {
+ return Equals (obj as TimeZoneInfo);
+ }
+#endif
+
public bool Equals (TimeZoneInfo other)
{
if (other == null)
}
#endif
#if MONODROID
- return ZoneInfoDB.GetTimeZone (id);
+ var timeZoneInfo = ZoneInfoDB.GetTimeZone (id);
+ if (timeZoneInfo == null)
+ throw new TimeZoneNotFoundException ();
+ return timeZoneInfo;
#else
// Local requires special logic that already exists in the Local property (bug #326)
if (id == "Local")
public AdjustmentRule [] GetAdjustmentRules ()
{
- if (disableDaylightSavingTime)
+ if (!supportsDaylightSavingTime)
return new AdjustmentRule [0];
else
return (AdjustmentRule []) adjustmentRules.Clone ();
}
//FIXME: change this to a generic Dictionary and allow caching for FindSystemTimeZoneById
- private static List<TimeZoneInfo> systemTimeZones = null;
+ private static List<TimeZoneInfo> systemTimeZones;
public static ReadOnlyCollection<TimeZoneInfo> GetSystemTimeZones ()
{
if (systemTimeZones == null) {
#endif
#if MONODROID
foreach (string id in ZoneInfoDB.GetAvailableIds ()) {
- systemTimeZones.Add (ZoneInfoDB.GetTimeZone (id));
+ var tz = ZoneInfoDB.GetTimeZone (id);
+ if (tz != null)
+ systemTimeZones.Add (tz);
}
#elif MONOTOUCH
if (systemTimeZones.Count == 0) {
throw new ArgumentException ("id parameter shouldn't be longer than 32 characters");
#endif
+ bool supportsDaylightSavingTime = !disableDaylightSavingTime;
+
if (adjustmentRules != null && adjustmentRules.Length != 0) {
AdjustmentRule prev = null;
foreach (AdjustmentRule current in adjustmentRules) {
prev = current;
}
+ } else {
+ supportsDaylightSavingTime = false;
}
this.id = id;
this.displayName = displayName ?? id;
this.standardDisplayName = standardDisplayName ?? id;
this.daylightDisplayName = daylightDisplayName;
- this.disableDaylightSavingTime = disableDaylightSavingTime;
+ this.supportsDaylightSavingTime = supportsDaylightSavingTime;
this.adjustmentRules = adjustmentRules;
}