From ccaf82d797f8695e257dd69eb95fadd628f8196e Mon Sep 17 00:00:00 2001 From: Shannon Date: Wed, 29 Jan 2014 11:21:35 +1100 Subject: [PATCH] Fixes object extensions for dates with a 'kind' specified. --- src/Umbraco.Core/ObjectExtensions.cs | 17 +++++++++-- src/Umbraco.Tests/ObjectExtensionsTests.cs | 34 +++++++++------------- 2 files changed, 29 insertions(+), 22 deletions(-) diff --git a/src/Umbraco.Core/ObjectExtensions.cs b/src/Umbraco.Core/ObjectExtensions.cs index 5e285d341d..d3b1184940 100644 --- a/src/Umbraco.Core/ObjectExtensions.cs +++ b/src/Umbraco.Core/ObjectExtensions.cs @@ -283,7 +283,20 @@ namespace Umbraco.Core else if (destinationType == typeof(DateTime)) { DateTime value; - return DateTime.TryParse(input, out value) ? Attempt.Succeed(value) : Attempt.Fail(); + if (DateTime.TryParse(input, out value)) + { + switch (value.Kind) + { + case DateTimeKind.Unspecified: + case DateTimeKind.Utc: + return Attempt.Succeed(value); + case DateTimeKind.Local: + return Attempt.Succeed(value.ToUniversalTime()); + default: + throw new ArgumentOutOfRangeException(); + } + } + return Attempt.Fail(); } else if (destinationType == typeof(DateTimeOffset)) { @@ -516,7 +529,7 @@ namespace Umbraco.Core if (type == typeof(bool)) return XmlConvert.ToString((bool)value); if (type == typeof(byte)) return XmlConvert.ToString((byte)value); if (type == typeof(char)) return XmlConvert.ToString((char)value); - if (type == typeof(DateTime)) return XmlConvert.ToString((DateTime)value, XmlDateTimeSerializationMode.RoundtripKind); + if (type == typeof(DateTime)) return XmlConvert.ToString((DateTime)value, XmlDateTimeSerializationMode.Unspecified); if (type == typeof(DateTimeOffset)) return XmlConvert.ToString((DateTimeOffset)value); if (type == typeof(decimal)) return XmlConvert.ToString((decimal)value); if (type == typeof(double)) return XmlConvert.ToString((double)value); diff --git a/src/Umbraco.Tests/ObjectExtensionsTests.cs b/src/Umbraco.Tests/ObjectExtensionsTests.cs index 8645a4fd23..53727d847e 100644 --- a/src/Umbraco.Tests/ObjectExtensionsTests.cs +++ b/src/Umbraco.Tests/ObjectExtensionsTests.cs @@ -105,30 +105,24 @@ namespace Umbraco.Tests } } - [Test] - public virtual void CanConvertStringToDateTime() + [TestCase("2012-11-10", true)] + [TestCase("2012/11/10", true)] + [TestCase("10/11/2012", true)]// assuming your culture uses DD/MM/YYYY + [TestCase("11/10/2012", false)]// assuming your culture uses DD/MM/YYYY + [TestCase("Sat 10, Nov 2012", true)] + [TestCase("Saturday 10, Nov 2012", true)] + [TestCase("Sat 10, November 2012", true)] + [TestCase("Saturday 10, November 2012", true)] + [TestCase("2012-11-10 13:14:15", true)] + [TestCase("2012-11-10T13:14:15Z", true)] + public virtual void CanConvertStringToDateTime(string date, bool outcome) { var dateTime = new DateTime(2012, 11, 10, 13, 14, 15); - var testCases = new Dictionary - { - {"2012-11-10", true}, - {"2012/11/10", true}, - {"10/11/2012", true}, // assuming your culture uses DD/MM/YYYY - {"11/10/2012", false}, // assuming your culture uses DD/MM/YYYY - {"Sat 10, Nov 2012", true}, - {"Saturday 10, Nov 2012", true}, - {"Sat 10, November 2012", true}, - {"Saturday 10, November 2012", true}, - {"2012-11-10 13:14:15", true} - }; - foreach (var testCase in testCases) - { - var result = testCase.Key.TryConvertTo(); + var result = date.TryConvertTo(); - Assert.IsTrue(result.Success, testCase.Key); - Assert.AreEqual(DateTime.Equals(dateTime.Date, result.Result.Date), testCase.Value, testCase.Key); - } + Assert.IsTrue(result.Success, date); + Assert.AreEqual(DateTime.Equals(dateTime.Date, result.Result.Date), outcome, date); } [Test]