整数时间间隔



这道题更像是一道数学题(对不起,我数学不好)。

我的时间表示为整数

例如

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))将为您提供01
  • * 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)。。。但也许有人想解决这个问题:)

最新更新