以下代码运行良好:
DateTime d1 = DateTime.Now;
DateTime d2 = DateTime.Now.AddDays(-1);
int d3 = (int)(d1 - d2).TotalDays;
但是如果我把DateTime
定义为DateTime?
:呢
DateTime? d1 = DateTime.Now;
DateTime? d2 = DateTime.Now.AddDays(-1);
int d3 = (int)(d1 - d2).TotalDays;
带下划线的红色错误
无法隐式转换"System.TimeSpan?"到"System.TimeSpan"
是否可以获得定义为可为null的两个日期时间之间的天数差?
是的,但您需要使用Value
属性来"取消null"它:
int d3 = (int)(d1 - d2).Value.TotalDays;
然而,您应该考虑d1
或d2
为空的可能性——这在您的情况下不会发生,但在其他情况下可能发生。您可能想要:
int? d3 = (int?) (d1 - d2)?.TotalDays;
如果d1
或d2
是null
,则这将给出null
的结果。当然,这是假设您使用的是C#,否则?.
运算符不可用。
(根据用户3185569的建议,您可以在第一种情况下使用GetValueOrDefault()
,但如果其中一个值是null
,则会静默地使用空的TimeSpan
,这感觉不太可能是您想要的。)
是,使用GetValueOrDefault()
:
DateTime? d1 = DateTime.Now;
DateTime? d2 = DateTime.Now.AddDays(-1);
int d3 = (int)(d1 - d2).GetValueOrDefault().TotalDays;
d1 - d2
返回Nullable TimeSpan,它不直接包含名为TotalDays
的属性。但是使用GetValueOrDefault()
,如果值为NULL
,则可以返回TimeSpan
对象并获得0 Total Days
如果您确实期望Null
值,那么最好区分0天(上面方法返回的内容)和无效操作(date-null)、(null-date)和(null-null。然后你可能需要使用另一种方法:
int? d3 = (int) (d1 - d2)?.TotalDays;
或者,如果您使用的是C#6之前的版本:
int? d3 = d1.HasValue && d2.HasValue ? (int)(d1 - d2).Value.TotalDays : new int?();
使用long并转换
long x
System.TimeSpan y= new TimeSpan(x);