C# 将开始时间和结束时间之间的差值转换为小时。分秒

C# 将开始时间和结束时间之间的差值转换为小时。分秒,c#,datetime,C#,Datetime,我试图找出时间范围之间的持续时间,并将其转换为小时、分钟和秒。应添加的小时数不应转换为24小时。如果有50小时30分钟30秒,则应显示为50:30:30,如果分钟持续时间超过59,则应加上与秒相同的小时数 请查看完整的代码。两种方法都没有给出正确的答案。方法GetSumOfDuration将0.30视为0.3,因此无法给出正确答案。当差异超过24小时时,GetSumOfDurationFromSecond方法失败 using System; using System.Collections.Ge

我试图找出时间范围之间的持续时间,并将其转换为小时、分钟和秒。应添加的小时数不应转换为24小时。如果有50小时30分钟30秒,则应显示为50:30:30,如果分钟持续时间超过59,则应加上与秒相同的小时数

请查看完整的代码。两种方法都没有给出正确的答案。方法GetSumOfDuration将0.30视为0.3,因此无法给出正确答案。当差异超过24小时时,GetSumOfDurationFromSecond方法失败

using System;
using System.Collections.Generic;
using System.Linq;

namespace TimeCalculationApp
{
public class ProcessDetail
{
    public DateTime? StartTime { get; set; }
    public DateTime? EndTime { get; set; }

    public double? DurationInSeconds
    {
        get
        {
            if (StartTime != null && EndTime != null)
                return (EndTime.Value - StartTime.Value).TotalSeconds;
            return null;
        }
    }

    public double? Duration
    {
        get
        {
            if (StartTime != null && EndTime != null)
                return double.Parse(DateTimeHelper.GetTimeDuration(StartTime, EndTime));
            return null;
        }
    }
}

class DateTimeHelper
{
    public static string GetTimeDuration(DateTime? sDateTime, DateTime? eDateTime)
    {
        if (sDateTime != null && eDateTime != null)
        {
            if (sDateTime.Value <= eDateTime.Value)
            {
                var tsdiff = eDateTime.Value - sDateTime.Value;
                var ts = TimeSpan.FromSeconds(tsdiff.TotalSeconds);

                return string.Format("{0}.{1}", ts.Hours.ToString("0"), ts.Minutes.ToString("D2"));
            }
            return "0.00";
        }
        return "0.00";
    }

    public static string GetSumOfDuration(List<ProcessDetail> processDetails)
    {
        TimeSpan? sumDuration = null;

        var totalhours = 0;
        var totalminutes = 0;

        foreach (var processDetail in processDetails)
        {
            if (processDetail.Duration != null)
            {
                var splitString = processDetail.Duration.ToString().Split('.');

                var hour = splitString.Length > 0 ? splitString[0] : "0";
                var minutes = splitString.Length > 1 ? splitString[1] : "0";

                totalhours += int.Parse(hour);
                totalminutes += int.Parse(minutes);

                sumDuration = new TimeSpan(totalhours, totalminutes, 0);
            }
        }
        return sumDuration == null
            ? null
            : Math.Floor(sumDuration.Value.TotalHours).ToString("0") + ":" +
              sumDuration.Value.Minutes.ToString("D2");
    }

    public static string GetSumOfDurationFromSecond(List<ProcessDetail> processDetails, bool includeSeconds = false)
    {
        var seconds = processDetails.Where(x => x.DurationInSeconds != null).Sum(x => x.DurationInSeconds);
        if (seconds == null) return null;

        var ts = TimeSpan.FromSeconds(seconds.Value);

        return includeSeconds ? string.Format("{0}:{1}:{2}", ts.Hours.ToString("0"), ts.Minutes.ToString("D2"), ts.Seconds.ToString("D2")) :
            string.Format("{0}:{1}", ts.Hours.ToString("0"), ts.Minutes.ToString("D2"));
    }
}
class Program
{
    static void Main(string[] args)
    {
        var processDetails = GetProcessDetails();

        var duration = DateTimeHelper.GetSumOfDuration(processDetails);
        var durationFromSeconds = DateTimeHelper.GetSumOfDurationFromSecond(processDetails);

        Console.WriteLine(duration);
        Console.WriteLine(durationFromSeconds);

        processDetails = GetProcessDetailsTestData();

        duration = DateTimeHelper.GetSumOfDuration(processDetails);
        durationFromSeconds = DateTimeHelper.GetSumOfDurationFromSecond(processDetails);

        Console.WriteLine(duration);
        Console.WriteLine(durationFromSeconds);

        Console.ReadKey();

    }

    private static List<ProcessDetail> GetProcessDetails()
    {
        return new List<ProcessDetail>
        {
            new ProcessDetail
            {
                StartTime = new DateTime(2017, 01, 01, 1, 0, 0),
                EndTime =   new DateTime(2017, 01, 01, 7, 59, 0)
            },
            new ProcessDetail
            {
                StartTime = new DateTime(2017, 01, 01, 1, 0, 0),
                EndTime =   new DateTime(2017, 01, 01, 17, 3, 45)
            },
            new ProcessDetail
            {
                StartTime = new DateTime(2017, 01, 01, 1, 0, 0),
                EndTime =   new DateTime(2017, 01, 01, 10, 0, 20)
            },
            new ProcessDetail
            {
                StartTime = new DateTime(2017, 01, 01, 1, 0, 0),
                EndTime =   new DateTime(2017, 01, 01, 15, 1, 12)
            }
        };
    }

    private static List<ProcessDetail> GetProcessDetailsTestData()
    {
        return new List<ProcessDetail>
        {
            new ProcessDetail
            {
                StartTime =  DateTime.Parse("11/01/2017 06:36:28"),
                EndTime =  DateTime.Parse("11/01/2017 06:53:51")
            },
            new ProcessDetail
            {
                StartTime = DateTime.Parse("11/01/2017 09:12:46"),
                EndTime =  DateTime.Parse("11/01/2017 09:43:00")
            },
            new ProcessDetail
            {
                StartTime =DateTime.Parse("11/01/2017 15:29:25"),
                EndTime =   DateTime.Parse("11/01/2017 15:37:26")
            },
            new ProcessDetail
            {
                StartTime = DateTime.Parse("11/01/2017 15:19:19"),
                EndTime =  DateTime.Parse("11/01/2017 15:27:52")
            },
            new ProcessDetail
            {
                StartTime = DateTime.Parse("12/01/2017 01:05:43"),
                EndTime =  DateTime.Parse("12/01/2017 01:08:37")
            }
        };
    }
}
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
命名空间时间计算应用程序
{
公共类ProcessDetail
{
公共日期时间?开始时间{get;set;}
公共日期时间?结束时间{get;set;}
公共双持续时间秒
{
得到
{
if(StartTime!=null&&EndTime!=null)
返回(EndTime.Value-StartTime.Value).TotalSeconds;
返回null;
}
}
公共双倍期限
{
得到
{
if(StartTime!=null&&EndTime!=null)
返回double.Parse(DateTimeHelper.GetTimeDuration(StartTime,EndTime));
返回null;
}
}
}
类DateTimeHelper
{
公共静态字符串GetTimeDuration(DateTime?sDateTime,DateTime?eDateTime)
{
if(sDateTime!=null&&eDateTime!=null)
{
如果(sDateTime.Value 0?拆分字符串[0]:“0”;
var minutes=splitString.Length>1?splitString[1]:“0”;
totalhours+=int.Parse(小时);
totalminutes+=int.Parse(分钟);
sumDuration=新的时间跨度(总小时、总分钟、0);
}
}
返回sumDuration==null
无效的
:Math.Floor(sumDuration.Value.TotalHours)。ToString(“0”)+:“+
sumDuration.Value.Minutes.ToString(“D2”);
}
公共静态字符串GetSumOfDurationFromSecond(列出processDetails,bool includeSeconds=false)
{
var seconds=processDetails.Where(x=>x.DurationInSeconds!=null).Sum(x=>x.DurationInSeconds);
如果(秒==null)返回null;
var ts=TimeSpan.FromSeconds(秒值);
返回includeSeconds?string.Format(“{0}:{1}:{2}”、ts.Hours.ToString(“0”)、ts.Minutes.ToString(“D2”)、ts.Seconds.ToString(“D2”):
string.Format(“{0}:{1}”、ts.Hours.ToString(“0”)、ts.Minutes.ToString(“D2”);
}
}
班级计划
{
静态void Main(字符串[]参数)
{
var processDetails=GetProcessDetails();
var duration=DateTimeHelper.GetSumOfDuration(processDetails);
var durationFromSeconds=DateTimeHelper.GetSumOfDurationFromSecond(processDetails);
控制台写入线(持续时间);
Console.WriteLine(持续时间从秒开始);
processDetails=GetProcessDetailsTestData();
duration=DateTimeHelper.GetSumOfDuration(processDetails);
durationFromSeconds=DateTimeHelper.GetSumOfDurationFromSecond(processDetails);
控制台写入线(持续时间);
Console.WriteLine(持续时间从秒开始);
Console.ReadKey();
}
私有静态列表GetProcessDetails()
{
返回新列表
{
新流程细节
{
StartTime=新的日期时间(2017,01,01,1,0,0),
EndTime=新日期时间(2017,01,01,7,59,0)
},
新流程细节
{
StartTime=新的日期时间(2017,01,01,1,0,0),
EndTime=新日期时间(2017,01,01,17,3,45)
},
新流程细节
{
StartTime=新的日期时间(2017,01,01,1,0,0),
EndTime=新日期时间(2017,01,01,10,0,20)
},
新流程细节
{
StartTime=新的日期时间(2017,01,01,1,0,0),
EndTime=新日期时间(2017,01,01,15,1,12)
}
};
}
私有静态列表GetProcessDetailsTestData()
{
返回新列表
{
新流程细节
{
StartTime=DateTime.Parse(“11/01/2017 06:36:28”),
EndTime=DateTime.Parse(“11/01/2017 06:53:51”)
},
新流程细节
{
StartTime=DateTime.Parse(“11/01/2017 09:12:46”),
EndTime=DateTime.Parse(“11/01/2017 09:43:00”)
},
新流程细节
{
StartTime=DateTime.Parse(“11/01/2017 15:29:25”),
EndTime=DateTime.Parse(“11/01/2017 15:37:26”)
},
新流程细节
{
StartTime=DateTime.Parse(“11/01/2017 15:19:19”),
EndTime=DateTime.Parse(“11/01/2017 15:27:52”)
},
新流程细节
{
StartTime=DateTime.Parse(“12/01/2017 01:05:43”),
EndTime=DateTime.Parse(“12/01/2017 01:08:37”)
}
};
}
}
}

您可以通过减法操作修复差异的时间跨度

TimeSpan time1 = TimeSpan.Parse(date1);
TimeSpan time2 = TimeSpan.Parse(date2);

TimeSpan difference = time1 - time2;

int hours = difference.Hours;
int minutes = difference.Minutes;

您可以通过减法操作来修复差异的时间跨度

TimeSpan time1 = TimeSpan.Parse(date1);
TimeSpan time2 = TimeSpan.Parse(date2);

TimeSpan difference = time1 - time2;

int hours = difference.Hours;
int minutes = difference.Minutes;

您可以将开始时间从结束时间中减去。 结果将是一个Timespan对象

// Set startime example to one hour ten minutes and 30 seconds ago
DateTime startTime = DateTime.Now.AddSeconds(-4230);
DateTime endTime = DateTime.Now;
TimeSpan elapsedTime = endTime-startTime;
// Print out the elapsed time in hour:minutes:seconds to string
string result = elapsedTime.TotalHours + ":" + elapsedTime.Minutes + ":" + elapsedTime.Seconds

请注意,TimeSpan提供了小时和TotalHours等属性。小时的值可以在0-23之间(当该值超过23时,属性天数反而会增加),而TotalHours提供了完整小时的总数。您可以从endtime中减去starttime。 结果将是一个Timespan对象

// Set startime example to one hour ten minutes and 30 seconds ago
DateTime startTime = DateTime.Now.AddSeconds(-4230);
DateTime endTime = DateTime.Now;
TimeSpan elapsedTime = endTime-startTime;
// Print out the elapsed time in hour:minutes:seconds to string
string result = elapsedTime.TotalHours + ":" + elapsedTime.Minutes + ":" + elapsedTime.Seconds
请注意,TimeSpan提供了小时数和总小时数等属性。小时数的值可以在0-23之间(当该值超过23时,属性天数反而会增加),而
elapsedTime.ToString("dd\.hh\:mm\:ss")