整数时间间隔

时间:2016-05-09 08:28:13

标签: java math time

这个问题更多的是数学问题(对不起,我的数学不好)。

我有时间表示为整数

例如

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来创建它,将时间添加到日历,增加分钟,然后将小时和分钟解析回整数。但是它的方式太长了,应该有一种简单的数学方法来更有效地执行它。

5 个答案:

答案 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))会给你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)...但也许有人想要解决这个问题:)