在 C# 中划分 TimeSpan

Divide TimeSpan in c#

我有一个时隙class:

public class TimeSlot
{
private TimeSpan start;
private TimeSpan end;
}

我需要实现这个功能:

Public List<TimeSlot> GetDividedTimeSlot(TimeSlot timeslot, int durationInMinutes)

函数获取一个时间段和time-duration(单位为分钟),将时间段划分为最大数量的时间段,这些时间段在其开始和结束时间范围内,每个时间段具有相同的时间-给定的持续时间。时间段之间也应相差一刻钟。

例如:

假设时间跨度为17:00 – 19:00,时长为90分钟。

预期的列表是: 17:00 – 18:30 , 17:15 – 18:45, 17:30 – 19:00

我尝试了什么:

              List<TimeSlot> dividedTimeSlots=new List<TimeSlot>();
              TimeSpan start = timeSlot.start;
              TimeSpan end = timeSlot.end;
              TimeSpan currentEnd = new TimeSpan();
              TimeSlot newTimeSlot;

              while (end.Subtract(start).TotalMinutes >= durationInMinutes)
                {
                    //currentEnd should be equals to the start time + timeDuration
                    currentEnd = ((DateTime.Now + start).AddMinutes(durationInMinutes)).TimeOfDay;
                    newTimeSlot = new TimeSlot();
                    newTimeSlot.start = start;
                    newTimeSlot.end = currentEnd;
                    dividedTimeSlots.Add(newTimeSlot);
                    start = (DateTime.Now.AddMinutes(15) + start).TimeOfDay;
                }
            return dividedTimeSlots;

但是给出的结果很奇怪,跟原来的时间没有联系

代码有什么问题?

非常感谢。

使用 DateTime.Now 是问题的原因。由于 DateTime.Now 指的是这个瞬间,因此结果时间现在基于当前时间和您正在使用的跨度。

您有 2 个添加时间的选项。两者本质上是一样的,都返回一个新的 TimeSpan 对象。

使用 + 运算符

Adds two specified TimeSpan instances.

Languages that do not support custom operators can call the Add method instead. The equivalent method for this operator is TimeSpan.Add(TimeSpan)

var originalTime = new TimeSpan(1, 10, 30);
var additionalTime = new TimeSpan(0, 10, 30);

var resultingTimespan = originalTime + additionalTime;

使用Add函数

Returns a new TimeSpan object whose value is the sum of the specified TimeSpan object and this instance.

var originalTime = new TimeSpan(1, 10, 30);
var additionalTime = new TimeSpan(0, 10, 30);

var resultingTimespan = originalTime.Add(additionalTime);