【问题标题】:Calculate time difference between two datetime in double digit hour,minutes and seconds format [duplicate]以两位数的小时、分钟和秒格式计算两个日期时间之间的时间差[重复]
【发布时间】:2016-11-07 08:18:15
【问题描述】:

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

时:分:秒

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

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();

【问题讨论】:

  • 从另一个中减去一个 DateTime 返回一个 TimeSpan。只需在客户端做减法和格式化
  • @PanagiotisKanavos:这是你说的吗:t.EndDateTime.Value.Subtract(t.StartDateTime.Value)???
  • (datetime-datetime).tostring()
  • 另请注意,EF 是一个 ORM,即对象到关系映射器,而不是 SQL 的替代品。在这种情况下,不涉及任何对象或映射。每当您看到诸如连接或 DateDiff 之类的 SQL 概念泄漏到 ORM 查询中时,这强烈表明存在问题
  • 您也可以在 DateTime 值之间使用-。当然,计算差异的 get-only 属性会更好并减少混乱

标签: c# .net entity-framework linq


【解决方案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 {...}
       }
}

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

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

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

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

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

【讨论】:

  • 这是我使用 Database first(.edmx) 生成的数据模型,其中写道,如果重新生成代码,将覆盖对此文件的手动更改。
  • 不,它不会,这是 Visual Studio 中所有生成的类的基本功能。这些类是部分的,因此您可以定义其他文件,其中包含不会被覆盖的额外属性、方法等。事实上,你会注意到你的类定义已经包含了partial关键字
  • 好的,我明白这一点,所以我应该格式化这个时间跨度对象,即我的查询中的 Duration 使用 string.format??
  • 这个 .Tostring 函数如何在这个 linq 查询中工作??
  • 不,您应该在要使用该值的窗体、窗口或视图上执行此操作。最好使用大多数桌面或 Web 控件的格式字符串属性。否则,您至少会发现一种情况,您必须将字符串解析回 TimeSpan 以进行处理、比较、排序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-29
  • 2014-05-20
  • 2018-11-18
  • 1970-01-01
  • 2012-10-26
  • 1970-01-01
相关资源
最近更新 更多