计算平均时间跨度

时间:2016-08-25 14:08:39

标签: c# datetime

我要计算一组时间跨度的平均值,其中每个时间跨度是两个日期之间的减法。

DateTime a = GetStartDateTime();
DateTime b = GetEndDateTime();

var delta = b.Subtract(a).TotalDays;

日期格式类似于22.08.2016 21:00:00

有没有办法更合理地做到这一点?

另外,我很好奇为什么我的delta总是像0.26914351851851853,换句话说为什么它不是整数?

更新: 以下是示例时间跨度:

23.08.2016 10:31:38 - 22.08.2016 21:00:00
24.08.2016 14:32:26 - 24.08.2016 21:00:00
17.08.2016 8:36:51 - 01.01.2016 21:00:00
17.08.2016 8:34:27 - 15.03.2016 21:00:00

1 个答案:

答案 0 :(得分:1)

对所有TimeSpans的Ticks值执行简单的平均计算,并从结果中创建新的TimeSpan。这将代表平均或平均TimeSpan。 e.g。

        var timeSpanList = new List<TimeSpan>();
        var provider = CultureInfo.InvariantCulture;
        timeSpanList.Add(
            new TimeSpan(
                DateTime.ParseExact("23.08.2016 10:31:38", "dd.MM.yyyy H:mm:ss", provider).Ticks - 
                DateTime.ParseExact("22.08.2016 21:00:00", "dd.MM.yyyy H:mm:ss", provider).Ticks));
        timeSpanList.Add(
            new TimeSpan(
                DateTime.ParseExact("24.08.2016 14:32:26", "dd.MM.yyyy H:mm:ss", provider).Ticks - 
                DateTime.ParseExact("24.08.2016 21:00:00", "dd.MM.yyyy H:mm:ss", provider).Ticks));
        timeSpanList.Add(
            new TimeSpan(
                DateTime.ParseExact("17.08.2016 8:36:51", "dd.MM.yyyy H:mm:ss", provider).Ticks - 
                DateTime.ParseExact("01.01.2016 21:00:00", "dd.MM.yyyy H:mm:ss", provider).Ticks));
        timeSpanList.Add(
            new TimeSpan(
                DateTime.ParseExact("17.08.2016 8:34:27", "dd.MM.yyyy H:mm:ss", provider).Ticks - 
                DateTime.ParseExact("15.03.2016 21:00:00", "dd.MM.yyyy H:mm:ss", provider).Ticks));
        var totalTicks = 0L;
        foreach(var ts in timeSpanList)
        {
            totalTicks += ts.Ticks;
        }
        var avgTicks = totalTicks / timeSpanList.Count;
        var avgTimeSpan = new TimeSpan(avgTicks);