如何以分钟为单位增加时间
本文关键字:增加 时间 为单位 分钟 | 更新日期: 2023-09-27 18:06:50
我需要做一个以分钟为单位增加时间的算法。我手工做的,效果很好。但是,如果开始日期是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结束日期: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
谢谢
仅计算最后两个间隔的分钟数,以避免循环:
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
为AddMinutes()
尝试不同的值(例如35
, 50
和55
):
var end = DateTime.Today.AddHours(18).AddMinutes(35);
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();
由于循环迭代的分钟数是固定的,并且您没有对输出做任何花哨的操作。为了这个循环,您是否尝试过通过转换为时间戳来将性能与本机long进行比较,并且仅在需要使用日期时才动态转换为日期。我还建议在处理日期时使用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);
}