DateTimeConverter从UTC字符串转换而来

我有一个日期序列化为字符串“2012-06-20T13:19:59.1091122Z”

使用DateTimeConverter,将其转换为Kind属性设置为“Local”的DateTime对象{22:49:59.1091122}。

例如。 以下测试失败:

    private static readonly DateTime UtcDate = new DateTime(634757951991091122, DateTimeKind.Utc);
    private const string UtcSerialisedDate = "2012-06-20T13:19:59.1091122Z";

    [Test]
    public void DateTimeConverter_Convert_From_Utc_String()
    {
        // Arrange
        var converter = TypeDescriptor.GetConverter(typeof(DateTime));

        // Act
        var result = converter.ConvertFrom(UtcSerialisedDate);

        // Assert
        Assert.AreEqual(UtcDate, result);
        Assert.AreEqual(DateTimeKind.Utc, ((DateTime)result).Kind);
    }

我对此有点惊讶...我会预料到由转换器返回的DateTime对象将是UTC。

该文档确实说DateTimeConverter使用DateTime.Parse,但我猜它不能使用DateTimeStyles.RoundtripKind选项。

有没有办法解决?


这里真正的错误是没有任何DateTimeStyles传递的DateTime.Parse()仍应该看到“Z”并认识到它应该被解析为UTC。 但运气好让MS来承认或解决这个问题。

代码示例说明的特定问题是DateTimeConverter必须覆盖TypeConverter中的方法,因此无法传递其他参数(如DateTimeStyles)。 这太糟糕了,它没有为此实现某种静态或线程静态属性。 它的确利用了线程的Culture.CurrentCulture,但DateTimeStyles与文化是分开的,所以唉 - 这是另一个死路一条。

我假设你被锁定在使用转换器,而不是直接调用解析? 这是一个很难的要求吗? 如果不是,您可以执行以下操作:

public static object ConvertFrom<T>(string value)
{
  if (typeof(T) == typeof(DateTime))
    return DateTime.Parse(value, null, DateTimeStyles.RoundtripKind);

  var converter = TypeDescriptor.GetConverter(typeof(T));
  return converter.ConvertFrom(value);
}

另一种方法是使用DateTimeOffsetConverter它能正确理解Z时区。 然后,您可以使用结果的.UtcDateTime属性以UTC类型返回DateTime。

链接地址: http://www.djcxy.com/p/8135.html

上一篇: DateTimeConverter converting from UTC string

下一篇: Databinding issue with stopwatched elapsed