public void CanRoundTrip() { // Date Assert.AreEqual("2001-02-03", ExtendedDateTime.Parse("2001-02-03").ToString()); Assert.AreEqual("2008-12", ExtendedDateTime.Parse("2008-12").ToString()); Assert.AreEqual("2008", ExtendedDateTime.Parse("2008").ToString()); Assert.AreEqual("-0999", ExtendedDateTime.Parse("-0999").ToString()); Assert.AreEqual("0000", ExtendedDateTime.Parse("0000").ToString()); // Date and Time Assert.AreEqual("2001-02-03T09:30:01-08", ExtendedDateTime.Parse("2001-02-03T09:30:01-08").ToString()); Assert.AreEqual("2004-01-01T10:10:10Z", ExtendedDateTime.Parse("2004-01-01T10:10:10Z").ToString()); Assert.AreEqual("2004-01-01T10:10:10+05", ExtendedDateTime.Parse("2004-01-01T10:10:10+05").ToString()); // Uncertain and Approximate Assert.AreEqual("1984?", ExtendedDateTime.Parse("1984?").ToString()); Assert.AreEqual("2004-06?", ExtendedDateTime.Parse("2004-06?").ToString()); Assert.AreEqual("2004-06-11?", ExtendedDateTime.Parse("2004-06-11?").ToString()); Assert.AreEqual("1984~", ExtendedDateTime.Parse("1984~").ToString()); Assert.AreEqual("1984?~", ExtendedDateTime.Parse("1984?~").ToString()); // Years Exceeding Four Digits Assert.AreEqual("y170000002", ExtendedDateTime.Parse("y170000002").ToString()); Assert.AreEqual("y-170000002", ExtendedDateTime.Parse("y-170000002").ToString()); // Season Assert.AreEqual("2001-21", ExtendedDateTime.Parse("2001-21").ToString()); Assert.AreEqual("2001-22", ExtendedDateTime.Parse("2001-22").ToString()); Assert.AreEqual("2001-23", ExtendedDateTime.Parse("2001-23").ToString()); Assert.AreEqual("2001-24", ExtendedDateTime.Parse("2001-24").ToString()); // Partial Uncertain or Approximate Assert.AreEqual("2004?-06-11", ExtendedDateTime.Parse("2004?-06-11").ToString()); Assert.AreEqual("2004-06~-11", ExtendedDateTime.Parse("2004-06~-11").ToString()); Assert.AreEqual("2004-(06)?-11", ExtendedDateTime.Parse("2004-(06)?-11").ToString()); Assert.AreEqual("2004-06-(11)~", ExtendedDateTime.Parse("2004-06-(11)~").ToString()); Assert.AreEqual("2004-(06)?~", ExtendedDateTime.Parse("2004-(06)?~").ToString()); Assert.AreEqual("2004?-06-(11)~", ExtendedDateTime.Parse("2004?-06-(11)~").ToString()); Assert.AreEqual("2004?-(06)?~", ExtendedDateTime.Parse("2004?-(06)?~").ToString()); Assert.AreEqual("(2004)?-06-04~", ExtendedDateTime.Parse("(2004)?-06-04~").ToString()); Assert.AreEqual("(2011)-06-04~", ExtendedDateTime.Parse("(2011)-06-04~").ToString()); Assert.AreEqual("2011-23~", ExtendedDateTime.Parse("2011-23~").ToString()); // Exponential Form of Years Exceeding Four Digits Assert.AreEqual("y17e7", ExtendedDateTime.Parse("y17e7").ToString()); Assert.AreEqual("y-17e7", ExtendedDateTime.Parse("y-17e7").ToString()); Assert.AreEqual("y17101e4p3", ExtendedDateTime.Parse("y17101e4p3").ToString()); }
public override object ConvertFrom(ITypeDescriptorContext context, Globalization.CultureInfo culture, object value) { if (value == null) { throw GetConvertFromException(value); } var source = value as string; if (source != null) { return(ExtendedDateTime.Parse(source)); } return(base.ConvertFrom(context, culture, value)); }
public void CalculatesCorrectDifference() { Assert.AreEqual(TimeSpan.Zero, (ExtendedDateTime.Parse("2012") - ExtendedDateTime.Parse("2012"))); Assert.AreEqual(TimeSpan.FromDays(1096), (ExtendedDateTime.Parse("2015") - ExtendedDateTime.Parse("2012"))); // 366 for 2012 (leap year) + 365 for 2013 + 365 for 2014 = 1096 days Assert.AreEqual(TimeSpan.Zero, (ExtendedDateTime.Parse("2012-01") - ExtendedDateTime.Parse("2012-01"))); Assert.AreEqual(TimeSpan.FromDays(31), (ExtendedDateTime.Parse("2012-02") - ExtendedDateTime.Parse("2012-01"))); Assert.AreEqual(TimeSpan.FromDays(365), (ExtendedDateTime.Parse("2013-03") - ExtendedDateTime.Parse("2012-03"))); // 31 days for 3/2012 + 30 days for 4/2012 + 31 days for 5/2012 + 30 days for 6/2012 + 31 days for 7/2012 + 31 days for 8/2012 + 30 days for 9/2012 + 31 days for 10/2012 + 30 days for 11/2012 + 31 days for 12/2012 + 31 days for 1/2013 + 28 days for 2/2013 = 365 days Assert.AreEqual(TimeSpan.Zero, (ExtendedDateTime.Parse("2012-02-02") - ExtendedDateTime.Parse("2012-02-02"))); Assert.AreEqual(TimeSpan.FromDays(292), (ExtendedDateTime.Parse("2012-11-20") - ExtendedDateTime.Parse("2012-02-02"))); // 28 days remaining in of February + 31 days in March + 30 days in April + 31 days in May + 30 days in June + 31 days in July + 31 days in August + 30 days in September + 31 days in October + 19 days passed into November = 292 days Assert.AreEqual(TimeSpan.Zero, (ExtendedDateTime.Parse("2012-03-03T03Z") - ExtendedDateTime.Parse("2012-03-03T03Z"))); Assert.AreEqual(new TimeSpan(292, 18, 0, 0), (ExtendedDateTime.Parse("2012-11-20T20Z") - ExtendedDateTime.Parse("2012-02-02T02Z"))); // 20 additional hours passed after the end day - 2 hours in to the beginning day = 18 additional hours Assert.AreEqual(TimeSpan.Zero, (ExtendedDateTime.Parse("2012-03-03T03:03Z") - ExtendedDateTime.Parse("2012-03-03T03:03Z"))); Assert.AreEqual(new TimeSpan(292, 18, 18, 0), (ExtendedDateTime.Parse("2012-11-20T20:20Z") - ExtendedDateTime.Parse("2012-02-02T02:02Z"))); // 20 additional minutes passed after the end hour - 2 minutes in to the beginning hour = 18 additional minutes Assert.AreEqual(TimeSpan.Zero, (ExtendedDateTime.Parse("2012-03-03T03:03:03Z") - ExtendedDateTime.Parse("2012-03-03T03:03:03Z"))); Assert.AreEqual(new TimeSpan(292, 18, 18, 18), (ExtendedDateTime.Parse("2012-11-20T20:20:20Z") - ExtendedDateTime.Parse("2012-02-02T02:02:02Z"))); // 20 additional seconds passed after the end minute - 2 seconds in to the beginning minute = 18 additional seconds Assert.AreEqual(new TimeSpan(291, 16, 0, 0), (ExtendedDateTime.Parse("2012-11-20T00:00:00-08:00") - ExtendedDateTime.Parse("2012-02-02T00:00:00Z"))); // 28 days remaining in of February + 31 days in March + 30 days in April + 31 days in May + 30 days in June + 31 days in July + 31 days in August + 30 days in September + 31 days in October + 19 days passed into November - 8 hours behind = 291.16 days }