var displayName = DeserializeString (ref input);
var standardName = DeserializeString (ref input);
var daylightName = DeserializeString (ref input);
- var rules = new List<TimeZoneInfo.AdjustmentRule> ();
+ List<TimeZoneInfo.AdjustmentRule> rules = null;
while (input [0] != ';') {
+ if (rules == null)
+ rules = new List<TimeZoneInfo.AdjustmentRule> ();
rules.Add (DeserializeAdjustmentRule (ref input));
}
var offsetSpan = TimeSpan.FromMinutes (offset);
- return TimeZoneInfo.CreateCustomTimeZone (tzId, offsetSpan, displayName, standardName, daylightName, rules.ToArray ());
+ return TimeZoneInfo.CreateCustomTimeZone (tzId, offsetSpan, displayName, standardName, daylightName, rules?.ToArray ());
}
public string ToSerializedString ()
else
ParseRegTzi(adjustmentRules, 1, 9999, reg_tzi);
- return CreateCustomTimeZone (id, baseUtcOffset, display_name, standard_name, daylight_name, ValidateRules (adjustmentRules).ToArray ());
+ return CreateCustomTimeZone (id, baseUtcOffset, display_name, standard_name, daylight_name, ValidateRules (adjustmentRules));
}
private static void ParseRegTzi (List<AdjustmentRule> adjustmentRules, int start_year, int end_year, byte [] buffer)
return new DateTime (year, transition.Month, day) + transition.TimeOfDay.TimeOfDay;
}
- static List<AdjustmentRule> ValidateRules (List<AdjustmentRule> adjustmentRules)
+ static AdjustmentRule[] ValidateRules (List<AdjustmentRule> adjustmentRules)
{
+ if (adjustmentRules == null || adjustmentRules.Count == 0)
+ return null;
+
AdjustmentRule prev = null;
foreach (AdjustmentRule current in adjustmentRules.ToArray ()) {
if (prev != null && prev.DateEnd > current.DateStart) {
}
prev = current;
}
- return adjustmentRules;
+ return adjustmentRules.ToArray ();
}
#if LIBC || MONOTOUCH
}
tz = CreateCustomTimeZone (id, baseUtcOffset, id, standardDisplayName);
} else {
- tz = CreateCustomTimeZone (id, baseUtcOffset, id, standardDisplayName, daylightDisplayName, ValidateRules (adjustmentRules).ToArray ());
+ tz = CreateCustomTimeZone (id, baseUtcOffset, id, standardDisplayName, daylightDisplayName, ValidateRules (adjustmentRules));
}
if (storeTransition && transitions.Count > 0) {
tz.transitions = transitions;
- tz.supportsDaylightSavingTime = true;
}
+ tz.supportsDaylightSavingTime = adjustmentRules.Count > 0;
return tz;
}
using System;
using System.IO;
+using System.Linq;
using NUnit.Framework;
namespace MonoTests.System
Assert.AreEqual (0, utc.GetAdjustmentRules ().Length);
}
+ [Test] // Bug-44255
+ public void SystemTimeZoneSerializationTests ()
+ {
+ foreach (var tmz in TimeZoneInfo.GetSystemTimeZones ())
+ {
+ var tmzClone = TimeZoneInfo.FromSerializedString (tmz.ToSerializedString ());
+ Assert.AreEqual (tmz, tmzClone);
+ Assert.AreEqual (tmz.DisplayName, tmzClone.DisplayName);
+ Assert.AreEqual (tmz.StandardName, tmzClone.StandardName);
+ Assert.AreEqual (tmz.SupportsDaylightSavingTime, tmzClone.SupportsDaylightSavingTime);
+ Assert.AreEqual (tmz.DaylightName, tmzClone.DaylightName);
+ }
+ }
+
[Test]
public void SerializeCustomUtcZoneWithOddNaming ()
{