以两位数小时,分钟和秒格式计算两个日期时间之间的时差

时间:2016-07-05 13:11:13

标签: c# .net entity-framework linq

我正在用格式计算两个日期之间的时差:

  

小时:分钟:秒

现在我通过以下输入获得这样的输出:

StartDate=2016-06-29 15:52:32.360

EndDate=2016-06-29 15:52:36.970

Output:  0 : 0 : 4

但我希望及时获得两位数输出:

Expected Output: 00 : 00 : 04

输入:

StartDate=2016-06-29 15:52:32.360

EndDate=2016-06-29 15:53:36.970

Expected output: 00 : 01 : 04

这是我的代码:

public class Attendance
{
      public int Id { get; set; }
      public Nullable<System.DateTime> StartDateTime { get; set; }
      public Nullable<System.DateTime> EndDateTime { get; set; }
}


var query = (from t in context.Attendance
             select new 
             {
             TotalTime =SqlFunctions.DateDiff("s",t.StartDateTime,t.EndDateTime) /3600 + " : "
            + SqlFunctions.DateDiff("s", t.StartDateTime, t.EndDateTime) % 3600 / 60
            + ": " + SqlFunctions.DateDiff("s", t.StartDateTime, t.EndDateTime) % 60,
              }).tolist();

注意:我不想这样做:

var query = (from t in context.Attendance.toList().
                  select new 
                  {
                     //code to calculate time difference and format time
                  }).tolist();

1 个答案:

答案 0 :(得分:1)

首先,EF处理对象,它不是SQL查询的替代品。您可以轻松添加一个只读属性来计算两个值之间的差异,如果其中任何一个为空,则返回您想要的任何值,例如:

public partial class Attendance
{
  public int Id { get; set; }
  public Nullable<System.DateTime> StartDateTime { get; set; }
  public Nullable<System.DateTime> EndDateTime { get; set; }

  public TimeSpan Duration 
  { 
       get 
       { 
           if (StartDateTime.HasValue && EndDateTime.HasValue)
           {
               return (EndDateTime.Value - StartDateTime.Value);
           }
           else {...}
       }
}

您可以使用String.Format格式化TimeSpan值,如其他答案所示。实际上,格式化应尽可能晚,最好使用客户端或HTML视图上的格式字符串,以避免混淆客户端/服务器区域设置或必须将字符串解析回Timespan以进行进一步处理

可以使用standardcustom格式字符串格式化TimeSpan值,例如:

  var label=attendee.Duration.ToString("c");

将生成[-][d'.']hh':'mm':'ss['.'fffffff]形式的字符串。如果持续时间不包含日期或毫秒组件,则这将匹配您想要的格式。

将此类序列化为Json根本不需要任何格式化,因为Json.NET可以将TimeSpan序列化为HH:mm:ss格式,如this example

所示