以下代码可以正常使用:
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'
是否可以获得定义为可空的两个日期时间之间的天数差异?
答案 0 :(得分:10)
是的,但你需要使用Value
属性来“取消”它:
int d3 = (int)(d1 - d2).Value.TotalDays;
但是,您应该考虑d1
或d2
为空的可能性 - 在您的情况下不会发生,但在其他情况下可能会发生。你可能想要:
int? d3 = (int?) (d1 - d2)?.TotalDays;
如果null
或d1
为d2
,则结果为null
。这假设您正在使用C#6 - 否则?.
运算符不可用。
(您可以按照user3185569的建议在第一种情况下使用GetValueOrDefault()
,但如果值为TimeSpan
,则会默默使用空null
,这感觉不太可能是您的想。)
答案 1 :(得分:4)
是的,使用GetValueOrDefault()
:
DateTime? d1 = DateTime.Now;
DateTime? d2 = DateTime.Now.AddDays(-1);
int d3 = (int)(d1 - d2).GetValueOrDefault().TotalDays;
d1 - d2
返回Nullable TimeSpan,它不直接包含名为TotalDays
的属性。但是使用GetValueOrDefault()
,您可以返回TimeSpan
个对象,如果值为NULL
,则获得0天总数
如果你确实期望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?();