考虑以下示例:
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/