如何用字符串格式将时差四舍五入到最接近的秒数?

时间:2016-10-14 12:03:45

标签: c# .net linq string.format

我试图减去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()

enter image description here

5 个答案:

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