diff --git a/src/Umbraco.Core/ObjectExtensions.cs b/src/Umbraco.Core/ObjectExtensions.cs index 603c508e0f..026a9fcef5 100644 --- a/src/Umbraco.Core/ObjectExtensions.cs +++ b/src/Umbraco.Core/ObjectExtensions.cs @@ -292,7 +292,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)) { @@ -526,7 +539,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 420a2eb856..4e78b2da1f 100644 --- a/src/Umbraco.Tests/ObjectExtensionsTests.cs +++ b/src/Umbraco.Tests/ObjectExtensionsTests.cs @@ -104,30 +104,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]