我试图减去2个日期时间,并以分钟和秒的格式获得时差,但是如何将差异以字符串格式舍入到最接近的秒数。
我的日期如下:
1)
StartDate= 2016-10-11 04:31:06.513 EndDate= 2016-10-11 04:31:09.457
Differrence : 2.94
Output I am getting is : 00 : 02
Expected Output : 00 : 03 (round up time to the nearest)
2)
StartDate = 2016-10-14 16:43:18.530 EndDate= 2016-10-14 16:43:50.457
Difference : 31.93
Output I am getting is : 00 : 31
Expected Output : 00 : 32 (round up time to the nearest)
以下是linq查询,我正在尝试计算时差:
var output = Attendance.Select
(
t => new
{
TimeDifference = string.Format("{0:00}:{1:00}", (int)t.EndDateTime.Value.Subtract(t.StartDateTime.Value).Minutes, (int)t.EndDateTime.Value.Subtract(t.StartDateTime.Value).Seconds),
}
).ToList()
答案 0 :(得分:4)
正如Dawnkeeper在回答中所说,你必须使用Math.Ceiling,而是获得Seconds
财产,你必须使用TimeSpan.TotalSeconds,如下所示:
var TimeDifference = string.Format("{0:00}:{1:00}", (int)EndDateTime.Subtract(StartDateTime).Minutes, (int)Math.Ceiling(EndDateTime.Subtract(StartDateTime).TotalSeconds));
修改强> Henrik是对的,上面的代码不起作用。让我们做对:
var diff=EndDateTime.Subtract(StartDateTime);
double seconds= Math.Ceiling(diff.Seconds+diff.Milliseconds*0.001);
var TimeDifference = string.Format("{0:00}:{1:00}",diff.Minutes,seconds);
我现在正在打电话,所以我无法尝试,但我认为它应该可行
答案 1 :(得分:2)
您可以使用Math.Ceiling()
功能。
(int)Math.Ceiling(t.EndDateTime.Value.Subtract(t.StartDateTime.Value).Seconds)
但还有另一个问题。 Seconds
属性以整数形式获得整秒。您还需要部分秒,所以正确的答案是:
(int)Math.Ceiling(t.EndDateTime.Value.Subtract(t.StartDateTime.Value).TotalSeconds)
答案 2 :(得分:2)
你也可以这样做:
DateTime start = new DateTime(2016, 10, 11, 04, 31, 06, 513);
DateTime end = new DateTime(2016, 10, 11, 04, 31, 09, 457);
var diff = end - start;
Console.WriteLine($"{diff.Hours:00}:{diff.Minutes:00}:{diff.Seconds + diff.Milliseconds / 1000.0:00}");
答案 3 :(得分:1)
要向上舍入秒,请使用TotalSeconds而不是Seconds,并使用Math.Ceiling将其包围:
DateTime startDate = DateTime.Parse("2016-10-14 16:43:18.530");
DateTime endDate = DateTime.Parse("2016-10-14 16:43:50.457 ");
Console.WriteLine( Math.Ceiling(endDate.Subtract(startDate).TotalSeconds));
输出:32
答案 4 :(得分:1)
你说"围绕"你可以通过Ceiling得到它 有人说。但是,如果时间紧迫,你会怎么做?:
2016-10-10 00:00:00.000 2016-10-10 00:00:00.001
是否应该被视为1秒?您的收藏品名称是出勤率,对于考勤系统而言我认为不是这样。如果舍入应该是向上或向下或基于中点,则使用Math.Round()。即:
var output = Attendance.Select
(
t => new
{
TimeDifference =
TimeSpan.FromSeconds(Math.Round(
t.EndDateTime.Value.Subtract(t.StartDateTime.Value).TotalSeconds, 0))
.ToString(@"mm\:ss")
}
).ToList();