无法隐式转换';System.TimeSpan';到';System.TimeSpan';

本文关键字:System TimeSpan 转换 | 更新日期: 2023-09-27 17:58:23

以下代码运行良好:

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的两个日期时间之间的天数差?

无法隐式转换';System.TimeSpan';到';System.TimeSpan';

是的,但您需要使用Value属性来"取消null"它:

int d3 = (int)(d1 - d2).Value.TotalDays;

然而,您应该考虑d1d2为空的可能性——这在您的情况下不会发生,但在其他情况下可能发生。您可能想要:

int? d3 = (int?) (d1 - d2)?.TotalDays;

如果d1d2null,则这将给出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);