系统日期时间?与 System.DateTime

Posted

技术标签:

【中文标题】系统日期时间?与 System.DateTime【英文标题】:System.DateTime? vs System.DateTime 【发布时间】:2010-12-16 07:38:48 【问题描述】:

我正在编写一些代码,我需要从页面中的日历控件中读取日期值(Ajax 工具包:日历扩展器)。

以下代码:

DateTime newSelectedDate = myCalendarExtender.SelectedDate;

给出以下错误:

Cannot implicitly convert type 'System.DateTime?' to 'System.DateTime'. An explicit conversion exists (are you missing a cast?)

但是,通过插入演员表,我可以让代码工作:

DateTime newSelectedDate = (DateTime)myCalendarExtender.SelectedDate; // works fine!

日历控件(Ajax 工具包)的“SelectedDate”属性将数据类型描述为“System.DateTime?” ......显然是'?与所有这些有关。

当数据类型包含此符号 (?) 时究竟会发生什么...我假设我可以将“SelectedDate”属性直接应用到“DateTime”类型的变量中而无需强制转换。

谢谢

【问题讨论】:

【参考方案1】:

DateTime?Nullable<DateTime> 相同 也就是说:DateTime? 的实例可以包含“NULL”,而DateTime 的实例则不能。 (对于自 .NET 2.0 以来的所有值类型都是如此。值类型不能包含 NULL ,但从 .NET 2.0 开始,可以通过 Nullable<T> 构造(或 ? 简写)支持可空值类型。

你能得到DateTime的值吗?并通过这样做将其放入 DateTime:

DateTime? someNullableDate;
DateTime myDate;

if( someNullableDate.HasValue )
   myDate = someNullableDate.Value;

获取 Nullable 值的另一种更简洁的方法是使用 null-coalescing 运算符:

DateTime myDate = someNullableDate?? default(DateTime);

【讨论】:

这是一个比答案更好的解决方案。【参考方案2】:
var Endtime = DateTime.Now();
DateTime startTime = item.REPORT_TIME.HasValue ? item.REPORT_TIME.Value : Endtime;

意思是:item.item.REPORT_TIME的类型是system.DateTime? 但是 startTime 的类型是 system.DateTime; 所以代码可以像

一样改变它

`var Endtime=DateTime.Now; var startTime=item.REPORT_TIME.HasValue?Convert.ToDateTime(item.REPORT_TIME.HasValue):Endtime

`

【讨论】:

您能否格式化您的代码并详细解释一下? 这是第一次给出答案,我会改变它。谢谢你的建议。【参考方案3】:

Calendar 控件在其 SelectedDate 属性中返回 Nullable(C# 中的简写是 DateTime?),因为 DateTime 是一个结构。空值允许控件具有“未选择日期”状态。因此,您需要先检查 nullable 是否具有值,然后才能使用它。

var nullable = myCalendarExtender.SelectedDate; var newSelectedDate = (nullable.HasValue) ? nullable.Value : SomeDefaultValue;

编辑:更加简洁,感谢 Josh 的评论:

var newSelectedDate = myCalendarExtender.SelectedDate ??一些默认值;

我喜欢!

【讨论】:

你可以用下面的代码来简化它: var newDate = nullable ??一些默认值; 或者您可以根据我的回答跳过所有存在检查自己。 @Chris - 我同意;但是,有时我不想使用像 DateTime 这样的值类型的默认值...也许我希望 DateTime.Today 作为评估中的默认值。【参考方案4】:

?表示该类型可以为空。有关详细信息,请参见例如MSDN

Nullable 是一个编译器支持的值类型包装器,它允许值类型变为 null。

要访问 DateTime 值,您需要执行以下操作:

DateTime? dateOrNull = myCalendarExtender.SelectedDate;
if (dateOrNull != null)

    DateTime newSelectedDate = dateOrNull.Value;

【讨论】:

@Marek - 你更喜欢原始网址?我为编辑道歉。 @Jeff:他也在他的编辑中添加了代码块,所以这很可能不是故意的改变......只是他在你编辑之前已经打开了编辑屏幕。 @Jeff:抱歉,这是无意的。我不知道你编辑了网址,我的编辑覆盖了你的。 唷,我不确定这种事情是否有问题。 :D 感谢所有回复的人,现在更有意义了! :)【参考方案5】:

你可以使用 ??运算符在 C# 中以非常简洁的方式处理可空值。请参阅我对 Travis 的回答的评论,以更短的方式表达“如果不为空,则使用它,否则使用一些默认值”概念。他们都做同样的事情。

【讨论】:

【参考方案6】:

一个更好的解决方案,IMO 是所有可空类的最佳功能

DateTime newSelectedDate = myCalendarExtender.SelectedDate.GetValueOrDefault();

【讨论】:

我会说这是非常巧妙的解决方案。

以上是关于系统日期时间?与 System.DateTime的主要内容,如果未能解决你的问题,请参考以下文章

antdesign 怎么当前日期

string.Format 格式化输出日期

在Powershell中如何将日期'2017年6月6日,08:09:05.000'转换为[DateTime]?

NHibernate 无法将 MySQL 日期/时间值转换为 System.DateTime

System.DateTime.Now.ToString()的一些用法

无法将 MySQL 日期/时间值转换为 System.DateTime