javascript - 计算重叠时间段的持续时间

标签 javascript c# algorithm datetime time

考虑以下示例:

Daytime starts (night ends): 07:00
Daytime ends (night starts): 20:00

------------------------------

Task A start time: 06:00
Task A end time: 08:00

Task B start time: 10:00
Task B end time: 12:00

Task C start time: 19:00
Task C end time: 21:00

Task D start time: 23:00
Task D end time: 01:00

Task E start time: 06:00
Task E end time: 21:00

如何计算一项任务在白天花费的时间量,以及在夜间花费的时间量?上述问题的答案是:

A (day): 1 hr
A (night): 1 hr

B (day): 2 hrs
B (night): 0 hrs

C (day): 1 hr
C (night): 1 hr

D (day): 0 hrs
D (night): 2 hrs

E (day): 13 hrs
E (night): 2 hrs

最佳答案

根据标签猜测您需要使用 javascript 或 C# 的解决方案。这是 C# 的代码:

namespace DurationOfOverlappingTimePeriods
{
    class Program
    {
        static void Main(string[] args)
        {
            TimeSpan taskAStart = new TimeSpan(6, 0, 0);
            TimeSpan taskAEnd = new TimeSpan(8, 0, 0);
            Tuple<TimeSpan, TimeSpan> taskATimes = GetTaskDurations(taskAStart, taskAEnd);
            Console.WriteLine("A (day): {0}", taskATimes.Item1);
            Console.WriteLine("A (night): {0}", taskATimes.Item2);
            Console.WriteLine();

            TimeSpan taskBStart = new TimeSpan(10, 0, 0);
            TimeSpan taskBEnd = new TimeSpan(12, 0, 0);
            Tuple<TimeSpan, TimeSpan> taskBTimes = GetTaskDurations(taskBStart, taskBEnd);
            Console.WriteLine("B (day): {0}", taskBTimes.Item1);
            Console.WriteLine("B (night): {0}", taskBTimes.Item2);
            Console.WriteLine();

            TimeSpan taskCStart = new TimeSpan(19, 0, 0);
            TimeSpan taskCEnd = new TimeSpan(21, 0, 0);
            Tuple<TimeSpan, TimeSpan> taskCTimes = GetTaskDurations(taskCStart, taskCEnd);
            Console.WriteLine("C (day): {0}", taskCTimes.Item1);
            Console.WriteLine("C (night): {0}", taskCTimes.Item2);
            Console.WriteLine();

            TimeSpan taskDStart = new TimeSpan(23, 0, 0);
            TimeSpan taskDEnd = new TimeSpan(1, 0, 0);
            Tuple<TimeSpan, TimeSpan> taskDTimes = GetTaskDurations(taskDStart, taskDEnd);
            Console.WriteLine("D (day): {0}", taskDTimes.Item1);
            Console.WriteLine("D (night): {0}", taskDTimes.Item2);
            Console.WriteLine();

            TimeSpan taskEStart = new TimeSpan(6, 0, 0);
            TimeSpan taskEEnd = new TimeSpan(21, 0, 0);
            Tuple<TimeSpan, TimeSpan> taskETimes = GetTaskDurations(taskEStart, taskEEnd);
            Console.WriteLine("E (day): {0}", taskETimes.Item1);
            Console.WriteLine("E (night): {0}", taskETimes.Item2);
            Console.WriteLine();

        }

        static Tuple<TimeSpan, TimeSpan> GetTaskDurations(
            TimeSpan taskStartTime,
            TimeSpan taskEndTime)
        {
            DateTime daytimeStart = DateTime.Today.Add(new TimeSpan(7, 0, 0));
            DateTime daytimeEnd = DateTime.Today.Add(new TimeSpan(20, 0, 0));
            Range daytimeRange = new Range(daytimeStart, daytimeEnd);

            if (taskEndTime < taskStartTime)
                taskEndTime = taskEndTime + TimeSpan.FromDays(1);

            DateTime taskStart = DateTime.Today.Add(taskStartTime);
            DateTime taskEnd = DateTime.Today.Add(taskEndTime);
            Range taskRange = new Range(taskStart, taskEnd);

            TimeSpan daytimeTaskDuration = daytimeRange.IntersectionDuration(taskRange);
            TimeSpan nighttimeTaskDuration = taskRange.Duration() - daytimeTaskDuration;

            return new Tuple<TimeSpan, TimeSpan>(daytimeTaskDuration, nighttimeTaskDuration);
        }
    }

    class Range
    {
        public Range()
        {
        }

        public Range(DateTime start, DateTime End)
        {
            this.Start = start;
            this.End = End;
        }

        DateTime Start { get; set; }
        DateTime End { get; set; }

        public TimeSpan IntersectionDuration(Range otherRange)
        {
            Range intersection = new Range();
            intersection.Start = this.Start < otherRange.Start ? otherRange.Start : this.Start;
            intersection.End = this.End < otherRange.End ? this.End : otherRange.End;
            if (intersection.Start >= intersection.End)
                return new TimeSpan(0);
            else
                return intersection.End - intersection.Start;
        }

        public TimeSpan Duration()
        {
            return this.End - this.Start;
        }
    }
}

这是输出:
A(日):01:00:00
A(晚上):01:00:00
B(白天):02:00:00
B(晚上):00:00:00
C(白天):01:00:00
C(晚上):01:00:00
D(日):00:00:00
D(晚上):02:00:00
E(日):13:00:00
E(晚上):02:00:00

关于javascript - 计算重叠时间段的持续时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26814343/

相关文章:

javascript - 在 localStorage 中存储 HTTP Basic 授权 header 是否存在任何安全问题?

javascript - 将数据加载到 HTML 中的可变高度表

c# - 空合并运算符怎么可能导致错误?

c# - Powershell 命令不会在 C# 中运行

c# - 自定义操作 - 错误 1001 : Could not find file myApp. InstallState

string - 获取不带字符的字符串的所有子串的时间复杂度是多少?

python - 排列:返回第k个排列

javascript - 无限滚动显示重复结果

javascript - 如何将 JQuery 添加到从 ajax 调用加载的 html 中?

algorithm - 微软面试 : transforming a matrix