首页 > 解决方案 > 如何在 C# 中显示两个日期之间的计算值,仅小时和分钟超过 24 小时的差异

问题描述

我有一个名为 Duration 的属性,该属性是对另外两个名为 StartDate 和 EndDate 的属性的计算。

问题是,我需要格式为“hh:mm”的这两个日期之间的差异,我可以用我在互联网上找到的很多代码和解决方案来做到这一点,但最后我总是遇到同样的问题,天数……

今天我有以下代码:

[NotMapped]
public string Duration
{
 get
 {
  if (StartDate != null && EndDate != null)
  {
   return (EndDate - StartDate).Value.ToString().Substring(0, 5);
  }
  return null;
 }
 set
 {
  if (value == null) throw new ArgumentNullException(nameof(value));
 }
}

考虑到我们有以下开始和结束日期值: StartDate = 2019/03/14 - 10:43 AM EndDate = 2019/03/14 - 11:00 AM

它显示如下输出:

持续时间 = 00:16

但是当我有超过 24 小时的差异时,它会计算一天并且我得到一个无效的值。

例如:StartDate = 2019/03/05 - 03:00 AM EndDate = 2019/03/15 - 04:00 AM

它打印:

持续时间 = 1.01:

这是计算这一天,我需要它是小时:分钟格式。

有人可以帮我吗?

标签: c#.netdatedatetime

解决方案


最好不要使用 SubString。

如果你从另一个日期中减去一个日期,你会得到一个TimeSpan

您可以执行ToString()此操作或使用其属性来显示您想要的内容,但是由于您想要显示总小时数而不仅仅是小时数部分,因此您必须使用各个属性:

 var startDate = DateTime.Now;
 var endDate = startDate.AddHours(30).AddMinutes(20);

 var difference = endDate - startDate;

 var hoursComponent = ((int)difference.TotalHours).ToString("D2");
 var minutesComponent = difference.Minutes.ToString("D2");

 Console.WriteLine($"{hoursComponent}:{minutesComponent}");

像这样的事情应该这样做。如果它只有一个数字,我已将 D2 放入强制它显示前导零。我TotalHours选择了一个,int因为 TotalHours 实际上返回了一个带有你不想要的分数分量的双精度数。我没有使用TotalMinutes,因为我认为第二个组件不相关。


推荐阅读