internal static TzdbZone1970Location Read(IDateTimeZoneReader reader) { int latitudeSeconds = reader.ReadSignedCount(); int longitudeSeconds = reader.ReadSignedCount(); int countryCount = reader.ReadCount(); var countries = new List <Country>(); for (int i = 0; i < countryCount; i++) { string countryName = reader.ReadString(); string countryCode = reader.ReadString(); countries.Add(new Country(code: countryCode, name: countryName)); } string zoneId = reader.ReadString(); string comment = reader.ReadString(); // We could duplicate the validation, but there's no good reason to. It's odd // to catch ArgumentException, but we're in pretty tight control of what's going on here. try { return(new TzdbZone1970Location(latitudeSeconds, longitudeSeconds, countries, zoneId, comment)); } catch (ArgumentException e) { throw new InvalidNodaDataException("Invalid zone location data in stream", e); } }
/// <summary> /// Reads a fixed time zone from the specified reader. /// </summary> /// <param name="reader">The reader.</param> /// <param name="id">The id.</param> /// <returns>The fixed time zone.</returns> public static DateTimeZone Read(IDateTimeZoneReader reader, string id) { Preconditions.CheckNotNull(reader, "reader"); Preconditions.CheckNotNull(reader, "id"); var offset = reader.ReadOffset(); return(new FixedDateTimeZone(id, offset)); }
/// <summary> /// Reads a fixed time zone from the specified reader. /// </summary> /// <param name="reader">The reader.</param> /// <param name="id">The id.</param> /// <returns>The fixed time zone.</returns> public static DateTimeZone Read([NotNull] IDateTimeZoneReader reader, [NotNull] string id) { Preconditions.CheckNotNull(reader, nameof(reader)); Preconditions.CheckNotNull(id, nameof(id)); var offset = reader.ReadOffset(); var name = reader.HasMoreData ? reader.ReadString() : id; return(new FixedDateTimeZone(id, offset, name)); }
/// <summary> /// Reads a mapping from a reader. /// </summary> internal static MapZone Read(IDateTimeZoneReader reader) { string windowsId = reader.ReadString(); string territory = reader.ReadString(); int count = reader.ReadCount(); string[] tzdbIds = new string[count]; for (int i = 0; i < count; i++) { tzdbIds[i] = reader.ReadString(); } return(new MapZone(windowsId, territory, new ReadOnlyCollection <string>(tzdbIds))); }
internal static StandardDaylightAlternatingMap Read(IDateTimeZoneReader reader) { Preconditions.CheckNotNull(reader, nameof(reader)); Offset standardOffset = reader.ReadOffset(); string standardName = reader.ReadString(); ZoneYearOffset standardYearOffset = ZoneYearOffset.Read(reader); string daylightName = reader.ReadString(); ZoneYearOffset daylightYearOffset = ZoneYearOffset.Read(reader); Offset savings = reader.ReadOffset(); ZoneRecurrence standardRecurrence = new ZoneRecurrence(standardName, Offset.Zero, standardYearOffset, int.MinValue, int.MaxValue); ZoneRecurrence dstRecurrence = new ZoneRecurrence(daylightName, savings, daylightYearOffset, int.MinValue, int.MaxValue); return(new StandardDaylightAlternatingMap(standardOffset, standardRecurrence, dstRecurrence)); }
public static ZoneYearOffset Read([NotNull] IDateTimeZoneReader reader) { Preconditions.CheckNotNull(reader, nameof(reader)); int flags = reader.ReadByte(); var mode = (TransitionMode)(flags >> 5); var dayOfWeek = (flags >> 2) & 7; var advance = (flags & 2) != 0; var addDay = (flags & 1) != 0; int monthOfYear = reader.ReadCount(); int dayOfMonth = reader.ReadSignedCount(); // The time of day is written as a number of milliseconds for historical reasons. var timeOfDay = LocalTime.FromMillisecondsSinceMidnight(reader.ReadMilliseconds()); return(new ZoneYearOffset(mode, monthOfYear, dayOfMonth, dayOfWeek, advance, timeOfDay, addDay)); }
internal static WindowsZones Read(IDateTimeZoneReader reader) { string version = reader.ReadString(); string tzdbVersion = reader.ReadString(); string windowsVersion = reader.ReadString(); int count = reader.ReadCount(); var mapZones = new MapZone[count]; for (int i = 0; i < count; i++) { mapZones[i] = MapZone.Read(reader); } return(new WindowsZones(version, tzdbVersion, windowsVersion, new ReadOnlyCollection <MapZone>(mapZones))); }
/// <summary> /// Reads a recurrence from the specified reader. /// </summary> /// <param name="reader">The reader.</param> /// <returns>The recurrence read from the reader.</returns> public static ZoneRecurrence Read(IDateTimeZoneReader reader) { Preconditions.CheckNotNull(reader, "reader"); string name = reader.ReadString(); Offset savings = reader.ReadOffset(); ZoneYearOffset yearOffset = ZoneYearOffset.Read(reader); int fromYear = reader.ReadCount(); if (fromYear == 0) { fromYear = int.MinValue; } int toYear = reader.ReadCount(); return(new ZoneRecurrence(name, savings, yearOffset, fromYear, toYear)); }
public static ZoneYearOffset Read(IDateTimeZoneReader reader) { Preconditions.CheckNotNull(reader, "reader"); int flags = reader.ReadByte(); var mode = (TransitionMode)(flags >> 5); var dayOfWeek = (flags >> 2) & 7; var advance = (flags & 2) != 0; var addDay = (flags & 1) != 0; int monthOfYear = reader.ReadCount(); int dayOfMonth = reader.ReadSignedCount(); // The time of day is written as an offset for historical reasons. var ticksOfDay = reader.ReadOffset(); return(new ZoneYearOffset(mode, monthOfYear, dayOfMonth, dayOfWeek, advance, new LocalTime(ticksOfDay.Ticks), addDay)); }
/// <summary> /// Reads a time zone from the specified reader. /// </summary> /// <param name="reader">The reader.</param> /// <param name="id">The id.</param> /// <returns>The time zone.</returns> public static DateTimeZone Read(IDateTimeZoneReader reader, string id) { int size = reader.ReadCount(); var periods = new ZoneInterval[size]; var start = reader.ReadZoneIntervalTransition(null); for (int i = 0; i < size; i++) { var name = reader.ReadString(); var offset = reader.ReadOffset(); var savings = reader.ReadOffset(); var nextStart = reader.ReadZoneIntervalTransition(start); periods[i] = new ZoneInterval(name, start, nextStart, offset, savings); start = nextStart; } var tailZone = reader.ReadByte() == 1 ? DaylightSavingsDateTimeZone.Read(reader, id + "-tail") : null; return(new PrecalculatedDateTimeZone(id, periods, tailZone)); }
internal static TzdbZoneLocation Read(IDateTimeZoneReader reader) { int latitudeSeconds = reader.ReadSignedCount(); int longitudeSeconds = reader.ReadSignedCount(); string countryName = reader.ReadString(); string countryCode = reader.ReadString(); string zoneId = reader.ReadString(); string comment = reader.ReadString(); // We could duplicate the validation, but there's no good reason to. It's odd // to catch ArgumentException, but we're in pretty tight control of what's going on here. try { return(new TzdbZoneLocation(latitudeSeconds, longitudeSeconds, countryName, countryCode, zoneId, comment)); } catch (ArgumentException e) { throw new InvalidNodaDataException("Invalid zone location data in stream", e); } }
/// <summary> /// Reads a time zone from the specified reader. /// </summary> /// <param name="reader">The reader.</param> /// <param name="id">The id.</param> /// <returns>The time zone.</returns> internal static DateTimeZone Read([Trusted][NotNull] IDateTimeZoneReader reader, [Trusted][NotNull] string id) { Preconditions.DebugCheckNotNull(reader, nameof(reader)); Preconditions.DebugCheckNotNull(id, nameof(id)); int size = reader.ReadCount(); var periods = new ZoneInterval[size]; // It's not entirely clear why we don't just assume that the first zone interval always starts at Instant.BeforeMinValue // (given that we check that later) but we don't... and changing that now could cause compatibility issues. var start = reader.ReadZoneIntervalTransition(null); for (int i = 0; i < size; i++) { var name = reader.ReadString(); var offset = reader.ReadOffset(); var savings = reader.ReadOffset(); var nextStart = reader.ReadZoneIntervalTransition(start); periods[i] = new ZoneInterval(name, start, nextStart, offset, savings); start = nextStart; } var tailZone = reader.ReadByte() == 1 ? DaylightSavingsDateTimeZone.Read(reader, id + "-tail") : null; return(new PrecalculatedDateTimeZone(id, periods, tailZone)); }
/// <summary> /// Reads a mapping from a reader. /// </summary> internal static MapZone Read(IDateTimeZoneReader reader) { string windowsId = reader.ReadString(); string territory = reader.ReadString(); int count = reader.ReadCount(); string[] tzdbIds = new string[count]; for (int i = 0; i < count; i++) { tzdbIds[i] = reader.ReadString(); } return new MapZone(windowsId, territory, new ReadOnlyCollection<string>(tzdbIds)); }
internal static WindowsZones Read(IDateTimeZoneReader reader) { string version = reader.ReadString(); string tzdbVersion = reader.ReadString(); string windowsVersion = reader.ReadString(); int count = reader.ReadCount(); var mapZones = new MapZone[count]; for (int i = 0; i < count; i++) { mapZones[i] = MapZone.Read(reader); } return new WindowsZones(version, tzdbVersion, windowsVersion, new ReadOnlyCollection<MapZone>(mapZones)); }
internal static TzdbZoneLocation Read(IDateTimeZoneReader reader) { int latitudeSeconds = reader.ReadSignedCount(); int longitudeSeconds = reader.ReadSignedCount(); string countryName = reader.ReadString(); string countryCode = reader.ReadString(); string zoneId = reader.ReadString(); string comment = reader.ReadString(); // We could duplicate the validation, but there's no good reason to. It's odd // to catch ArgumentException, but we're in pretty tight control of what's going on here. try { return new TzdbZoneLocation(latitudeSeconds, longitudeSeconds, countryName, countryCode, zoneId, comment); } catch (ArgumentException e) { throw new InvalidNodaDataException("Invalid zone location data in stream", e); } }