显示两个日期时间值之间的时差


185

我正在从数据库中检索两个日期时间值。检索到值后,我需要两个值之间的差异。为此,我创建了一个timepan变量来存储两个日期值的差。

TimeSpan? variable = datevalue1 - datevalue2;

现在,我需要显示小时数中存储在Timespan变量中的差异。我指的是TimeSpan.TotalHours,但由于某些原因无法应用相同的内容。我怎么做?我在MVC项目上使用C#。我只需要显示以小时为单位的差值?

编辑:由于时间跨度是可为空的,所以我无法使用总小时数属性。现在,我可以通过执行TimeSpanVal.Value.TotalHours来使用它


3
为什么不能使用TimeSpan.TotalHours
弗雷德里克·莫尔克(FredrikMörk)2011年

它不允许我这样做。我试过了。:(
reggie 2011年

是因为我的时间跨度可为空,所以我无法使用totalhours属性?
reggie 2011年


TimeSpan对象的总工作时间为.Value.TotalHours
smurtagh

Answers:


118

我认为您很困惑,因为您尚未声明a TimeSpan而已声明a TimeSpan?nullable TimeSpan。如果您不需要问号可以为空,请删除它或使用variable.Value.TotalHours


196

您可能还想看看

var hours = (datevalue1 - datevalue2).TotalHours;

但在这种情况下,系统显示“'System.Nullable <System.TimeSpan>”不包含“ TotalHours”的定义,并且没有扩展方法“ TotalHours”接受类型为“ System.Nullable <System.TimeSpan>”的第一个参数被发现 ”。你能告诉我原因吗?
尼哈,2015年

8
Nullable需要一个.Value.TotalHours而不是.TotalHours。这是可为空包装的因素。您也可以将其强制
转换

90

在示例中,我们将创建两个日期时间对象,一个具有当前时间,另一个具有75秒的当前时间。然后,我们将在第二个DateTime对象上调用方法.Subtract()。这将返回一个TimeSpan对象。一旦获得TimeSpan对象,就可以使用TimeSpan的属性来获取实际的小时,分​​钟和秒。

DateTime startTime = DateTime.Now;

 DateTime endTime = DateTime.Now.AddSeconds( 75 );

 TimeSpan span = endTime.Subtract ( startTime );
 Console.WriteLine( "Time Difference (seconds): " + span.Seconds );
 Console.WriteLine( "Time Difference (minutes): " + span.Minutes );
 Console.WriteLine( "Time Difference (hours): " + span.Hours );
 Console.WriteLine( "Time Difference (days): " + span.Days );

结果:

Time Difference (seconds): 15
Time Difference (minutes): 1
Time Difference (hours): 0
Time Difference (days): 0

30
您想使用“ Total”,例如TotalSecondsTotalMinutes等等
Filip Ekberg

38

您使用的原因是Nullable什么?

如果你想使用,Nullable那么你可以写variable.Value.TotalHours

或者,您可以只写:(datevalue1 - datevalue2).TotalHours


可能是因为datevalue1或datevalue2是DateTime?
Filip Ekberg

@Filip,没关系,应该这样DateTime。在.NET中,DateTime - DateTime = TimeSpan
伊利亚·科根

1
@Illya,我的意思是他们可能是Nullable<DateTime>,因此您得到了Nullable<TimeSpan>
Filip Ekberg

您的回答确实有效。我一直在寻找。
gdmanandamohon


3

员工带薪时间或其他精度要求的更精确方法

decimal DeterminePreciseHours(DateTime startTimestamp, DateTime stopTimestamp)
{
    var span = (stopTimestamp - startTimestamp).Value;
    decimal total = (decimal)span.TotalMilliseconds / 60 / 60 / 1000;
    return Math.Round(total, PRECISION_CONSTANT);
}

https://dotnetfiddle.net/tVIoVJ


1
var startTime = new TimeSpan(6, 0, 0); // 6:00 AM
var endTime = new TimeSpan(5, 30, 0); // 5:30 AM 
var hours24 = new TimeSpan(24, 0, 0);
var difference = endTime.Subtract(startTime); // (-00:30:00)
difference = (difference.Duration() != difference) ? hours24.Subtract(difference.Duration()) : difference; // (23:30:00)

如果我们比较两个不同的日期,也可以添加日期之间的差异

new TimeSpan(24 * days, 0, 0)

0

哇,我得说:保持简单:

MessageBox.Show("Result: " + (DateTime.Now.AddDays(10) > DateTime.Now));

Result: True

和:

MessageBox.Show("Result: " + DateTime.Now.AddDays(10).Subtract(DateTime.Now));

Result: 10.00:00:00

DateTime对象具有所有内置逻辑来处理布尔结果。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.