public static bool TryParse(string value, DateTimeZone timeZone, out ZonedDateTime instant) { if (DateTimeOffset.TryParseExact(value, "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK" , CultureInfo.InvariantCulture, DateTimeStyles.None, out var offset) && !DateTime.TryParseExact(value, "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFF" , CultureInfo.InvariantCulture, DateTimeStyles.AssumeLocal, out var buffer)) { instant = new ZonedDateTime(offset.UtcDateTime, timeZone); return(true); } else if (DateTime.TryParse(value, CultureInfo.InvariantCulture, DateTimeStyles.AssumeLocal, out var date)) { if (timeZone == DateTimeZone.Utc) { instant = new ZonedDateTime(DateTime.SpecifyKind(date, DateTimeKind.Utc), timeZone); } else { date = DateTime.SpecifyKind(date, DateTimeKind.Unspecified); date = DateTime.SpecifyKind(DateTimeZone.ConvertTime(date, timeZone, DateTimeZone.Utc), DateTimeKind.Utc); instant = new ZonedDateTime(date, timeZone); } return(true); } instant = new ZonedDateTime(); return(false); }
public void TimeZoneTests() { var zonesToIgnore = new HashSet <string>(); foreach (var zone in TimeZoneInfo.GetSystemTimeZones().Where(t => !zonesToIgnore.Contains(t.Id))) { for (var i = 0; i < 4; i++) { var summer = new DateTime(2017 + i, 7, 1, 12, 0, 0, DateTimeKind.Unspecified); var winter = new DateTime(2017 + i, 1, 1, 12, 0, 0, DateTimeKind.Unspecified); var custZone = DateTimeZone.ById(zone.Id); Assert.AreEqual(TimeZoneInfo.ConvertTime(summer, TimeZoneInfo.Utc, zone) , DateTimeZone.ConvertTime(summer, DateTimeZone.Utc, custZone)); Assert.AreEqual(TimeZoneInfo.ConvertTime(summer, zone, TimeZoneInfo.Utc) , DateTimeZone.ConvertTime(summer, custZone, DateTimeZone.Utc)); Assert.AreEqual(TimeZoneInfo.ConvertTime(winter, TimeZoneInfo.Utc, zone) , DateTimeZone.ConvertTime(winter, DateTimeZone.Utc, custZone)); Assert.AreEqual(TimeZoneInfo.ConvertTime(winter, zone, TimeZoneInfo.Utc) , DateTimeZone.ConvertTime(winter, custZone, DateTimeZone.Utc)); Assert.AreEqual(zone.GetUtcOffset(summer), custZone.GetUtcOffset(summer)); Assert.AreEqual(zone.GetUtcOffset(winter), custZone.GetUtcOffset(winter)); Assert.AreEqual(TimeZoneInfo.ConvertTime(new DateTimeOffset(summer, TimeSpan.FromHours(3)), zone) , DateTimeZone.ConvertTime(new DateTimeOffset(summer, TimeSpan.FromHours(3)), custZone)); Assert.AreEqual(TimeZoneInfo.ConvertTime(new DateTimeOffset(winter, TimeSpan.FromHours(3)), zone) , DateTimeZone.ConvertTime(new DateTimeOffset(winter, TimeSpan.FromHours(3)), custZone)); Assert.AreEqual(TimeZoneInfo.ConvertTime(new DateTimeOffset(summer, TimeSpan.FromHours(-7.5)), zone) , DateTimeZone.ConvertTime(new DateTimeOffset(summer, TimeSpan.FromHours(-7.5)), custZone)); Assert.AreEqual(TimeZoneInfo.ConvertTime(new DateTimeOffset(winter, TimeSpan.FromHours(-7.5)), zone) , DateTimeZone.ConvertTime(new DateTimeOffset(winter, TimeSpan.FromHours(-7.5)), custZone)); } } }
private DateTime ZoneToUtc(DateTime value) { if (Zone == DateTimeZone.Utc) { return(DateTime.SpecifyKind(value, DateTimeKind.Utc)); } value = DateTime.SpecifyKind(value, DateTimeKind.Unspecified); return(DateTime.SpecifyKind(DateTimeZone.ConvertTime(value, Zone, DateTimeZone.Utc), DateTimeKind.Utc)); }
public ZonedDateTime(DateTime value, DateTimeZone timeZone) { if (value.Kind == DateTimeKind.Utc) { UtcDateTime = DateTime.SpecifyKind(value, DateTimeKind.Utc); } else { UtcDateTime = DateTime.SpecifyKind(DateTimeZone.ConvertTime(value, DateTimeZone.Local, DateTimeZone.Utc), DateTimeKind.Utc); } Zone = timeZone; }
private string Render(DateTime value) { var converted = value; if (value.Kind == DateTimeKind.Utc) { if (_timeZone != DateTimeZone.Utc) { converted = DateTimeZone.ConvertTime(value, DateTimeZone.Utc, _timeZone); } } else if (_timeZone != DateTimeZone.Local) // Assume local { converted = DateTimeZone.ConvertTime(value, DateTimeZone.Local, _timeZone); } return(converted.ToString("s")); }
public static bool TryParseExact(string value, string format, IFormatProvider provider, DateTimeStyles styles, DateTimeZone timeZone, out ZonedDateTime instant) { if ((format.IndexOf('K') >= 0 || format.IndexOf('K') >= 0) && DateTimeOffset.TryParseExact(value, format, provider, styles, out var offset)) { instant = new ZonedDateTime(offset.UtcDateTime, timeZone); return(true); } else if (DateTime.TryParseExact(value, format, provider, styles, out var date)) { date = DateTime.SpecifyKind(date, DateTimeKind.Unspecified); date = DateTime.SpecifyKind(DateTimeZone.ConvertTime(date, timeZone, DateTimeZone.Utc), DateTimeKind.Utc); instant = new ZonedDateTime(date, timeZone); return(true); } instant = new ZonedDateTime(); return(false); }
public int CompareTo(object obj) { if (obj is ZonedDateTime zonded) { return(CompareTo(zonded)); } if (obj is DateTimeOffset offset) { return(UtcDateTime.CompareTo(offset.UtcDateTime)); } if (!(obj is DateTime date)) { throw new NotSupportedException(); } if (date.Kind == DateTimeKind.Utc) { return(UtcDateTime.CompareTo(date)); } return(UtcDateTime.CompareTo(DateTimeZone.ConvertTime(date, DateTimeZone.Local, DateTimeZone.Utc))); }