为什么 Convert.ChangeType(string) 与 DateTimeOffset 一起工作时却不能与 DateTime 一起工作?
Why doesn't Convert.ChangeType(string) work with DateTimeOffset, when it works with 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
即时实现一个包罗万象的类型转换器。它适用于除 DateTimeOffset
.
以外的其他类型(例如 float
<-> int
、string
-> DateTime
)
如果您查看 Convert.ChangeType
方法的文档,您会看到以下注释:
Exceptions
InvalidCastException
This conversion is not supported.
-or-
value
is null
and conversionType
is a value type.
-or-
value
does not implement the IConvertible interface.
既然我们知道value
不为null,并且string
实现了IConvertible
接口,那么就只剩下第一个原因了:
This conversion is not supported.
我们可以做的是先将其转换为DateTime
,然后再将其转换为DateTimeOffset
。有一些文档 here 描述了实现此目的的各种方法,其中之一是:
"You can also create a new DateTimeOffset value by assigning it a DateTime value"
所以我们可以这样做:
DateTimeOffset dateTimeOffset = (DateTime) Convert.ChangeType(dateString, typeof(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
即时实现一个包罗万象的类型转换器。它适用于除 DateTimeOffset
.
float
<-> int
、string
-> DateTime
)
如果您查看 Convert.ChangeType
方法的文档,您会看到以下注释:
Exceptions
InvalidCastException
This conversion is not supported.
-or-
value
isnull
andconversionType
is a value type.
-or-
value
does not implement the IConvertible interface.
既然我们知道value
不为null,并且string
实现了IConvertible
接口,那么就只剩下第一个原因了:
This conversion is not supported.
我们可以做的是先将其转换为DateTime
,然后再将其转换为DateTimeOffset
。有一些文档 here 描述了实现此目的的各种方法,其中之一是:
"You can also create a new DateTimeOffset value by assigning it a DateTime value"
所以我们可以这样做:
DateTimeOffset dateTimeOffset = (DateTime) Convert.ChangeType(dateString, typeof(DateTime));