为什么 Convert.ChangeType(string) 不适用于 DateTimeOffset,当它与 DateTime 一起工作时?



即使我提供了时区,也会发生这种情况。

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 <-> intstring -> DateTime ( 除DateTimeOffset .

如果您查看 Convert.ChangeType 方法的文档,您将看到以下注释:

异常
无效投射异常
不支持此转换。
-或-
valuenullconversionType是值类型。
-或-
value 不实现 IConvertible 接口。


既然我们知道value不是空的,并且string实现了IConvertible接口,那么剩下的唯一原因是第一个:

不支持此转换。


我们可以做的是先将其转换为 DateTime ,然后将其转换为 DateTimeOffset .这里有一些文档描述了实现此目的的各种方法,其中之一是:

"您还可以通过为其分配日期时间值来创建新的日期时间偏移量值">

因此,我们可以执行以下操作:

DateTimeOffset dateTimeOffset = (DateTime) Convert.ChangeType(dateString, typeof(DateTime));

最新更新