这道题更像是一道数学题(对不起,我数学不好)。
我的时间表示为整数
例如
700 (means 7:00)
1330 (means 13:30)
2359 (means 23:59)
我有一个开始时间和结束时间,希望在它们之间创建15分钟的间隔。例如
int start = 700;
int end = 1300;
我想在开始时间上循环,增加15分钟,然后跳过60到下一个100分钟。例如700、715、730、745、800、815、830等
我可以通过创建一个Calendar
对象来创建它,并将整数解析为SimpleDateFormat
,将时间添加到日历中,增加分钟数,并将小时和分钟解析回整数。但它的方法太长了,应该有一个简单的数学方法来更有效地执行它。
使用LocalTime类。这有一个plusMinutes方法,您可以使用它将基本时间增加15分钟。
也许像
LocalTime baseTime = LocalTime.of(((int)myNumber/100),myNumber%100);
while(...){
LocalTime myTime=baseTime.plusMinutes(15);
}
将"整数编码"时间转换为分钟:
int encoded = 2359;
int minutes = (encoded / 100) * 60 + encoded % 100;
一旦你有了分钟,你就可以添加分钟或毫秒:
long milliseconds = minutes * 3_600_000L;
如果必须使用整数,或者决定使用整数,则可以创建一个方法"plusMinutes",如:
public int plusMinutes (int time, int minutes) {
int auxMinutes = time % 60;
auxMinutes += minutes;
time += 100 * (seconds / 60);
time = 100 * (time / 100); // set the last 2 digits to 0
time += auxMinutes % 60;
return time;
}
另一种选择(在我看来更好)是创建一个"toMinutes"和一个"toEncoded"方法,比如:
public int toMinutes (int encoded) {
int minutes = encoded % 100;
minutes += (encoded / 100) * 60;
return minutes;
}
public int toEncoded (int minutes) {
int encoded = minutes % 60;
encoded += (minutes / 60) * 100;
return encoded;
}
注意:不能100%确定代码是否有效,尚未测试,但您应该了解大致情况。
编辑:对于使用最后一个选项时的问题,你只需要做一些类似的事情:
int encoded = 1330;
int plusMinutes = 45;
int minutes = toMinutes(encoded);
minutes += plusMinutes;
encoded = toEncoded(minutes);
这方面的神奇公式是((j=i%100+15)%60)+((i/100+j/60)*100)
for(int i = 700, j; i <= 1300; i=((j=i%100+15)%60)+((i/100+j/60)*100)){
System.out.println(i);
}
输出:
700
715
730
745
800
815
...
1300
已经有了一些不错的答案。
从API的角度来看,您应该使用日期和时间API,正如用户1717259所建议的那样,它提供了用时间"计算"的最佳选项。这将产生最能自我解释和维护的代码。
对于从时间编码的int.计算分钟和小时,也有很好的建议
如果使用int
s是一个约束,并且您只想计算给定起始值和间隔的下一个int,那么下面的函数可能有助于
int inc(int currentTime, int interval) {
return (((currentTime +interval) / 100) + ((currentTime+interval) % 100 / 60)) * 100 + ((currentTime+interval) % 100 % 60);
}
解释的功能:
currentTime+interval
是您的间隔增加,之前也可以用currentTime += interval
的单独调用来代替(currentTime +interval) / 100)
会给你时间- 如果您超过一小时或不超过一小时,
((currentTime+interval) % 100 / 60))
将为您提供0
或1
* 100
将重新计算小时值为hh00格式((currentTime+interval) % 100 % 60)
将计算与小时重叠的分钟数,% 100
将获得分钟数,而% 60
将获得小时之上的分钟数并将其添加到新的小时值中
您可以使用测试功能
for(int i = 700; i <= 1300; i = inc(i, 15)){
System.out.println(i);
}
此解决方案不适用于间隔超过40分钟的情况(因为%100%60)。。。但也许有人想解决这个问题:)