圆形日期长值

时间:2017-06-06 13:03:25

标签: java datetime rounding epoch

在我的Java项目中,我在long中使用了日期,例如12136219,并创建了Date对象,如下所示:

long time = 12136219;
Date date = new Date(time);

,它将日期表示为Thu Jan 01 04:22:16 CET 1970。如何将日期(长时间表示)舍入到分钟?

例如,如果秒数为Thu Jan 01 04:22:00 CET 1970,则我希望达到<30;如果秒为Thu Jan 01 04:23:00 CET 1970,我希望达到>=30,但我希望围绕此long time = 12136219表示。有什么想法吗?

5 个答案:

答案 0 :(得分:3)

当您从Date创建long时,long表示自1970年1月1日以来的毫秒数。一分钟内有60 * 1000毫秒。这应该足以形成您需要的舍入算法。

答案 1 :(得分:3)

从那时起 “自标准基准时间以来称为”时代“的毫秒,即1970年1月1日00:00:00 GMT” 您可以像这样计算秒数:

secondsInMillis = time % (60 * 1000) //get remainder (modulo): seconds * milliseconds
if (secondsInMillis < 30000) {
  time -= secondsInMillis; //round down
} else {
  time += (60000 - secondsInMillis); // round up
}

答案 2 :(得分:3)

不要重新发明轮子。使用java.time.Instant代表即时时间:

    Instant i = Instant.ofEpochMilli(time);
    i = i.plusSeconds(30).truncatedTo(ChronoUnit.MINUTES);

Instant不提供舍入,只提供截断。但是,添加30秒然后截断可以为您提供所需的内容。如果你需要几毫秒的时间,那很简单:

    time = i.toEpochMilli();
    System.out.println(time);

根据您的问题编号打印

12120000

(这相当于CET中1970-01-01T03:22:00Z,或1970-01-01T04:22 + 01:00 [欧洲/巴黎]的瞬间,或者{{的预期四舍五入1}}。)

PS我非常相信像Time4J这样的库会提供舍入,所以你不需要添加和截断的技巧。很遗憾,我没有经验向您提供详细信息。

答案 3 :(得分:0)

只需使用日历

重置秒和毫秒
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
cal.add(Calendar.MINUTES, calendar.get(Calendar.SECOND) >= 30 ? 1 : 0)
currentDate = cal.getTimeInMillis();

答案 4 :(得分:0)

您应该在Date对象上执行此操作。由于各种困难,包括一个月的长度(28,29,30或31),没有简单的方法可以在时间内计算它。