即使我提供了时区,也会发生这种情况。
var dateString = "2008-09-22T14:01:54.9571247Z";
var dateTime = Convert.ChangeType(dateString, typeof(DateTime)); // works
var dateTimeOffset = Convert.ChangeType(dateString, typeof(DateTimeOffset)); // throws InvalidCast exception
为什么会这样?
而我正在尝试做的是使用 Convert.ChangeType
即时实现一个包罗万象的类型转换器。它适用于其他类型的(例如 float
<-> int
, string
-> DateTime
( 除DateTimeOffset
.
如果您查看 Convert.ChangeType
方法的文档,您将看到以下注释:
异常
无效投射异常
不支持此转换。
-或-
value
是null
,conversionType
是值类型。
-或-
value
不实现 IConvertible 接口。
既然我们知道value
不是空的,并且string
实现了IConvertible
接口,那么剩下的唯一原因是第一个:
不支持此转换。
我们可以做的是先将其转换为 DateTime
,然后将其转换为 DateTimeOffset
.这里有一些文档描述了实现此目的的各种方法,其中之一是:
"您还可以通过为其分配日期时间值来创建新的日期时间偏移量值">
因此,我们可以执行以下操作:
DateTimeOffset dateTimeOffset = (DateTime) Convert.ChangeType(dateString, typeof(DateTime));