获取特定时间段之间的总小时数

时间:2015-10-01 07:22:24

标签: c# .net visual-studio

条件是超时和超时(例如02/01/2015 02:55直到02/02/2015 05:55)超过一天。我已经计算了时间和超时的总小时数,我想知道总时数是否在23:00(晚上11:00)到06:00之间已经过去并获得总时数

6 个答案:

答案 0 :(得分:2)

var hours = (datevalue1 - datevalue2).TotalHours;

Timespace ts= (datevalue1 - datevalue2);
var hours = ts.Value.TotalHours;

答案 1 :(得分:1)

试试这种方式.. DateTime.Parse().Subtract()

例如:

string startTime = "11:00 PM";
string endTime = "6:00 AM";

TimeSpan duration = DateTime.Parse(endTime).Subtract(DateTime.Parse(startTime));

Console.WriteLine(duration);
Console.ReadKey();

OR

TimeSpan是您需要的对象:

TimeSpan span = (DateTime.Now - DateTime.Now);

String.Format("{0} days, {1} hours, {2} minutes, {3} seconds", 
    span.Days, span.Hours, span.Minutes, span.Seconds);

答案 2 :(得分:1)

您可以通过一段时间来计算它。当它的夜晚时间将其添加到TimeSpan

DateTime timeIn = new DateTime(2015, 09, 29, 10, 11, 3); // 29-09-2015 at 10:11:03
DateTime timeOut = new DateTime(2015, 10, 1, 2, 19, 18); // 01-10-2015 at 02:19:38
TimeSpan nightTime = new TimeSpan(); //total amount of night time
TimeSpan passLength = new TimeSpan(0, 0, 0, 1); // length of time to pass at each iteration (1s)

while (timeIn < timeOut) // do it until timeIn reaches timeOut
{
    timeIn = timeIn.Add(passLength); // add 1 second to timeIn
    if (timeIn.Hour < 6 || timeIn.Hour == 23) // if we are in range of night time
    {
        nightTime = nightTime.Add(passLength); // add 1 second to night time
    }
}

Console.WriteLine(nightTime);

您可以进行大量优化。很长一段时间,每次加1秒都不是个好主意。您可以在每次迭代时为TimeIn添加1天,然后仅添加6小时到夜晚。在你接近Timeout减少长度时间

之后

这是一种更好的方法。先快点天。然后休息一下。

DateTime timeIn = new DateTime(2015, 09, 29, 10, 11, 3); // 29-09-2015 at 10:11:03
DateTime timeOut = new DateTime(2015, 10, 1, 2, 19, 18); // 01-10-2015 at 02:19:38

// Get days
TimeSpan passLength = new TimeSpan(1, 0, 0, 0); // one day per iterate
while (timeIn + passLength < timeOut)
{
    timeIn = timeIn.Add(passLength);
    nightTime = nightTime.Add(new TimeSpan(0, 7, 0, 0)); // 7 hours of a day passed is considered night time
}

// Get rest of the time
passLength = new TimeSpan(0, 0, 0, 1); // one second per iterate
while (timeIn < timeOut) // do it until timeIn reaches timeOut
{
     timeIn = timeIn.Add(passLength); // add 1 second to timeIn
     if (timeIn.Hour < 6 || timeIn.Hour == 23) // if we are in range of night time
     {
         nightTime = nightTime.Add(passLength); // add 1 second to night time
     }
}

Console.WriteLine(nightTime);

你不应该担心其余的时间计算表现。因为剩下的时间现在不到1天,只有86400秒。

对于今天的处理器速度来说,少于86400次迭代应该没问题。你怎么能继续优化它,但你不能获得更多的性能。

答案 3 :(得分:1)

有点不同且更快的方法:

    static void Main(string[] args)
    {
        TimeSpan result = new TimeSpan();
        DateTime dt1 = new DateTime(2015, 09, 29, 10, 11, 03);
        DateTime dt2 = new DateTime(2015, 10, 01, 02, 19, 38);
        DateTime d1 = new DateTime(dt1.Year, dt1.Month, dt1.Day, 0, 0, 0); //Date only
        DateTime d2 = new DateTime(dt2.Year, dt2.Month, dt2.Day, 0, 0, 0); //Date only

        //Count night time in first day
        result += DateTime.Compare(dt1, d1.AddHours(6)) > 0 ? new TimeSpan(6, 0, 0) : new TimeSpan(dt1.Hour, dt1.Minute, dt1.Second);
        if (DateTime.Compare(dt1, d1.AddHours(23)) > 0) result += new TimeSpan(dt1.Hour - 23, dt1.Minute, dt1.Second);

        //Count night time in last day
        result += DateTime.Compare(dt2, d2.AddHours(6)) > 0 ? new TimeSpan(6, 0, 0) : new TimeSpan(dt2.Hour, dt2.Minute, dt2.Second);
        if (DateTime.Compare(dt2, d2.AddHours(23)) > 0) result += new TimeSpan(dt1.Hour - 23, dt2.Minute, dt2.Second);

        //Count night time in middle days
        int daysBetween = (int)(d2 - d1).TotalDays - 1;
        result += new TimeSpan(daysBetween * 7, 0, 0);

        Console.WriteLine("Night time: " + result);
        Console.ReadKey();
    }

答案 4 :(得分:0)

EndTime与您的范围(23:00-06:00)进行比较

在您的案例中,请检查EndTime 05:55&lt; 06:00EndTime 05:55&gt; 23:00

答案 5 :(得分:0)

您可以减去DateTime值以获得TimeSpan。然后你可以获得TotalHours

var hours = timeOut.Subtract(timeIn).TotalHours;

例如

timeIn = 29-09-2015 10:11:03;
timeOut = 01-10-2015 02:19:38;
hours = 52.14303137125;