Dav*_*ner 6 .net datetime utc typeconverter
我有一个序列化为字符串的日期"2012-06-20T13:19:59.1091122Z"
使用DateTimeConverter,将其转换为DateTime对象{22:49:59.1091122},将Kind属性设置为"Local".
例如.以下测试失败:
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);
}
Run Code Online (Sandbox Code Playgroud)
我对此感到有些惊讶......我原本预计转换器返回的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);
}
Run Code Online (Sandbox Code Playgroud)
另一种方法是使用a DateTimeOffsetConverter- 它正确理解Z时区.然后,您可以使用.UtcDateTime结果的属性返回到具有UTC类型的DateTime.
| 归档时间: |
|
| 查看次数: |
1204 次 |
| 最近记录: |