如何按分钟增加时间

时间:2016-09-12 13:20:43

标签: c# datetime

我需要制作一个算法,以便在几分钟内增加时间。我手动完成,它工作正常。但是,如果开始日期是大约1年,2年前,并且我必须每10分钟增加一次,则需要花费太多时间。 这是我做的代码,正如我所说,它工作正常,但如果开始和结束日期很远,则需要花费太多时间。

int inc = 40;
DateTime startTime = DateTime.Today.AddHours(8).AddMinutes(50);//new DateTime(2013,9,6,18,40,0,DateTimeKind.Local);//DateTime.Today.AddHours(10).AddMinutes(50);
DateTime endTime = DateTime.Today.AddHours(18).AddMinutes(35);//DateTime.Now;
List<DateTime> timeList = new List<DateTime>();
//while (startTime < DateTime.Now.AddMinutes(inc))
while (startTime < endTime.AddMinutes(inc))
{
    timeList.Add(startTime);
    startTime = startTime.AddMinutes(inc);
}

StartDate:12/9/2019 8:50 EndDate:12/9/2019 18:35

每40分钟增加一次。

所以,结果是:

12/09/2016 8:50:00
12/09/2016 9:30:00
12/09/2016 10:10:00
12/09/2016 10:50:00
12/09/2016 11:30:00
12/09/2016 12:10:00
12/09/2016 12:50:00
12/09/2016 13:30:00
12/09/2016 14:10:00
12/09/2016 14:50:00
12/09/2016 15:30:00
12/09/2016 16:10:00
12/09/2016 16:50:00
12/09/2016 17:30:00
12/09/2016 18:10:00
12/09/2016 18:50:00

我只需要最后两行:

12/09/2016 18:10:00
12/09/2016 18:50:00

由于

3 个答案:

答案 0 :(得分:1)

public static IEnumerable<DateTime> CreateIntervals(this DateTime start, TimeSpan interval)
{
    while(true)
    {
        yield return start;
        start = start + interval;
    }
}

var timeList = startTime.CreateInterval(interval).Take(40).ToList();

答案 1 :(得分:1)

只需计算最后两个间隔的分钟数以避免循环:

var timeSpan = endTime - startTime;
var intervals = (int)timeSpan.TotalMinutes / inc;

// In case the endTime is aligned with the interval:
if ((int)timeSpan.TotalMinutes % inc == 0)
    intervals--;

startTime = startTime.AddMinutes(intervals * inc);
timeList.Add(startTime);
startTime = startTime.AddMinutes(inc);
timeList.Add(startTime);

这是一个稍微优雅的版本:

var intervals = Math.Ceiling(timeSpan.TotalMinutes / inc);  

startTime = startTime.AddMinutes((intervals - 1) * inc);
timeList.Add(startTime);
startTime = startTime.AddMinutes(inc);
timeList.Add(startTime);

以下是一个工作示例:https://dotnetfiddle.net/M1Z7Bn

35处为50尝试不同的值(例如55AddMinutes()var end = DateTime.Today.AddHours(18).AddMinutes(35); ):

h1 {
  border-bottom: 10px black solid;
}

答案 2 :(得分:0)

由于你的分钟是固定的循环迭代,你没有对输出做任何想象。您是否尝试通过为此循环转换为时间戳来比较性能与本机长度,并且仅在需要使用日期的情况下即时转换。在使用日期来使用Joda库时,我还建议作为替代方案并提高性能。

这是我的2美分:

    long endTime = System.currentTimeMillis();

    // Two years ago
    long startTime = Math.subtractExact(System.currentTimeMillis(), 31536000000L);

    long instanceTime = startTime;

    ArrayList<Long> dateList = new ArrayList<>();

    while(instanceTime < endTime){
        instanceTime += 60000L; // Ten minute increment
        dateList.add(instanceTime);
    }