我正在用格式计算两个日期之间的时差:
小时:分钟:秒
现在我通过以下输入获得这样的输出:
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();
答案 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以进行进一步处理
可以使用standard或custom格式字符串格式化TimeSpan值,例如:
var label=attendee.Duration.ToString("c");
将生成[-][d'.']hh':'mm':'ss['.'fffffff]
形式的字符串。如果持续时间不包含日期或毫秒组件,则这将匹配您想要的格式。
将此类序列化为Json根本不需要任何格式化,因为Json.NET可以将TimeSpan序列化为HH:mm:ss
格式,如this example