这个问题更多的是数学问题(对不起,我的数学不好)。
我有时间表示为整数
例如
700 (means 7:00)
1330 (means 13:30)
2359 (means 23:59)
我有一个开始时间和结束时间,并希望在它们之间创建15分钟的间隔。例如
int start = 700;
int end = 1300;
我想循环开始时间增加15分钟并跳过60到下一百。例如700,715,730,745,800,815,830 ......等等。
我可以通过创建Calendar
对象并将整数解析为SimpleDateFormat
来创建它,将时间添加到日历,增加分钟,然后将小时和分钟解析回整数。但是它的方式太长了,应该有一种简单的数学方法来更有效地执行它。
答案 0 :(得分:4)
使用LocalTime课程。这有一个plusMinutes方法,您可以使用它将基本时间增加15分钟。
也许像
LocalTime baseTime = LocalTime.of(((int)myNumber/100),myNumber%100);
while(...){
LocalTime myTime=baseTime.plusMinutes(15);
}
答案 1 :(得分:3)
转换"整数编码"时间到分钟:
int encoded = 2359;
int minutes = (encoded / 100) * 60 + encoded % 100;
分钟后,您可以添加分钟或毫秒:
long milliseconds = minutes * 3_600_000L;
答案 2 :(得分:2)
如果你必须使用整数,或者决定使用整数,你可以创建一个方法“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);
答案 3 :(得分:2)
这个神奇的公式是((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
答案 4 :(得分:0)
已经有一些很好的答案。
从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)...但也许有人想要解决这个问题:)