Java - 以分钟为单位的时差

时间:2016-10-27 13:00:20

标签: java

我有计算时差的分钟问题。 它的工作正常,例如计算之间的差异 2045年和2300年。

但是当我想计算例如之间的差异时 2330(今天)和0245(明天)我得到了错误的答案。 代码如下:

    // This example works
    String dateStart = "2045";
    String dateStop = "2300";

    // This example doesnt work
    //String dateStart = "2330";
    //String dateStop = "0245";

    // Custom date format
    SimpleDateFormat format = new SimpleDateFormat("HHmm");  

    Date d1 = null;
    Date d2 = null;
    try {
        d1 = format.parse(dateStart);
        d2 = format.parse(dateStop);
    } catch (Exception e) {
        e.printStackTrace();
    }    

    long diff = d2.getTime() - d1.getTime();
    long minutes = TimeUnit.MILLISECONDS.toMinutes(diff);                      
    System.out.println("Time in minutes: " + minutes + " minutes.");

提前致谢

4 个答案:

答案 0 :(得分:3)

考虑使用Java 8中引入的java.time.*包中的LocalDateLocalDateTimeLocalTime ZonedDateTime类。它们非常便于使用,因为它们可以解决各种角落情况(例如,在不同时区测量分钟数,或在秋季和春季时间变化时)。

当你计算时差时你需要知道的是:

  • LocalTime 仅包含时间
  • LocalDate 仅包含日期(无时间)
  • LocalDateTime 包含(日期+时间。)
  • ZonedDateTime 包含日期+时间+时区

这意味着与以下项比较时,时间差异会有所不同:

  • LocalTime 你只能分辨时间 20:45 23:30 给出2:45的差异
  • LocalDate 你无法计算任何时间差异(不包含时间)
  • LocalDateTime 您可以指定日期和时间,例如: 20:45 on 1Jan 23:30 on 3Jan 。时差为2:45,差异为2天,或50:45。
  • ZonedDateTime - 与 LocalDateTime 相同,加上您考虑了DayLightSavings,因此如果时钟在一夜之间发生变化 - 它会被反映出来。

以下是 LocalDateTime

的摘要
    LocalDateTime today2045    = LocalDateTime.of(
            LocalDate.now(),
            LocalTime.parse("20:45"));
    LocalDateTime tomorrow0230 = LocalDateTime.of(
            LocalDate.now().plusDays(1),
            LocalTime.parse("02:30"));

    System.out.println("Difference [minutes]: " + 
            Duration.between(today2045, tomorrow0230).toMinutes());

对于 ZonedDateTime 考虑到春/秋时钟的变化:

    ZonedDateTime today2045    = ZonedDateTime.of(
            LocalDate.now(),
            LocalTime.parse("20:45"),
            ZoneId.systemDefault());
    ZonedDateTime tomorrow0230 = ZonedDateTime.of(
            LocalDate.now().plusDays(1),
            LocalTime.parse("02:30"),
            ZoneId.systemDefault());

    System.out.println("Difference [minutes]: " + 
            Duration.between(today2045, tomorrow0230).toMinutes());

有关构造函数的一些信息可以在Oracle's tutorial here中找到。

答案 1 :(得分:2)

这不起作用,因为当你创建一个只有一段时间的新日期时,假设这一天是“今天”。

你能做的是:

// This example works
String dateStart = "2045";
String dateStop = "2300";

// This example doesnt work
//String dateStart = "2330";
//String dateStop = "0245";

// Custom date format
SimpleDateFormat format = new SimpleDateFormat("HHmm");  

Date d1 = null;
Date d2 = null;
try {
    d1 = format.parse(dateStart);
    d2 = format.parse(dateStop);
} catch (Exception e) {
    e.printStackTrace();
}

// MY ADDITION TO YOUR CODE STARTS HERE
if(d2.before(d1)){
    Calendar c = Calendar.getInstance(); 
    c.setTime(d2); 
    c.add(Calendar.DATE, 1);
    d2 = c.getTime();
}
// ENDS HERE

long diff = d2.getTime() - d1.getTime();
long minutes = TimeUnit.MILLISECONDS.toMinutes(diff);                      
System.out.println("Time in minutes: " + minutes + " minutes.");

但是你应该考虑使用Java 8新的日期/时间功能,或者Joda Time。

答案 2 :(得分:1)

您可以添加if语句来检查这是否是今天,如果没有,您可以添加一天,因为您正在比较时间,如果您添加全天不会有问题

    if(d2.before(d1)){
        d2.setTime(d2.getTime()+86400000);
    }

试一试

答案 3 :(得分:-1)

这是一个已解决的问题。如果你看看Joda Time库,你会发现你可能想要的所有时间和日期操作函数:

在你的情况下,有些东西:

DateTime first = new DateTime(larger-time);
DateTime second = new DateTime(smaller-time);
DateTime difference = first.minusMillis(second.getMillis())

Joda将应对所有奇怪的边缘条件,例如天/月/年之间的滚动,月长,闰年,夏令时,时区......