【问题标题】:Why doesn't Convert.ChangeType(string) work with DateTimeOffset, when it works with DateTime?为什么 Convert.ChangeType(string) 不能与 DateTimeOffset 一起使用,而它与 DateTime 一起使用?
【发布时间】:2019-10-31 13:22:38
【问题描述】:

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

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 intstring -> DateTime)。

【问题讨论】:

  • 因为 DateTimeOffset 没有实现 IConvertible
  • 您不能将 DateTime 转换为 DateTimeOffset。偏移量是两个对象之间的差异。
  • @jdweng An offset is the difference between two objects. 你在想TimeSpan 吗?或者可能被名字弄糊涂了?更好的类型名称可能是DateTimeWithIncludedOffset
  • 评论区有很多错误信息...

标签: c# datetime type-conversion datetimeoffset


【解决方案1】:

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

例外情况
InvalidCastException
不支持此转换。
- 或 -
valuenullconversionType 是值类型。
-或者-
value 没有实现IConvertible 接口。


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

不支持此转换。


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

“您还可以通过为它分配一个 DateTime 值来创建一个新的 DateTimeOffset 值”

所以我们可以这样做:

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

【讨论】:

  • 感谢您的回答,并解释了我的问题的原因和解决方案。您的解决方案将起作用,但如果可能,我想实现一个包罗万象的类型转换器。所以看起来使用Convert.ChangeType 不是首选解决方案,因为我必须根据类型使用该方法两次。我自己也在做一些研究,但这可能是不可能的。
猜你喜欢
  • 1970-01-01
  • 2019-04-08
  • 1970-01-01
  • 2012-12-05
  • 2013-09-01
  • 2016-03-27
  • 2022-06-12
相关资源
最近更新 更多