tl;博士
解析您的输入字符串。
LocalDateTime startLdt = LocalDateTime.parse( "2016-04-30T12:21" ) ;
LocalDateTime stopLdt = LocalDateTime.parse( "2016-05-01T12:21") ;
指定时区或与 UTC 的偏移量,但在输入中省略。我假设您打算使用 UTC 本身(偏移量为零)。
OffsetDateTime start = startLdt.atOffset( ZoneOffset.UTC );
OffsetDateTime stop = stopLdt.atOffset( ZoneOffset.UTC ) ;
以天(24 小时的时间块)、小时、分钟、秒和纳秒为单位计算经过的时间。
Duration d = Duration.between( start , stop ) ;
d.toString(): PT24H
您的第一个示例结果为 24 小时,如 code runs live at IdeOne.com 所见。
您的第二个示例也是 24 小时,如 seen in IdeOne.com。
详情
问题和其他答案都使用麻烦的旧日期时间类或Joda-Time 库。两者都被 java.time 类所取代。
使用 java.time
将您的 Date 对象转换为 Instant 对象,在 java.time 中等效。 Instant 类代表UTC 时间线上的时刻,分辨率为nanoseconds(最多九 (9) 位小数)。
Instant start = d1.toInstant();
Instant stop = d2.toInstant();
使用Duration(或Period)作为两者之间的时间跨度。
Duration d = Duration.between( start , stop );
提取整个时间跨度的总分钟数。
long minutes = d.toMinutes() ;
时区
您没有提及用于例如日期时间值的时区。他们的上下文是UTC 吗?或者您是否打算使用某个特定的时区。在不同的时区,夏令时 (DST) 等异常意味着日子并不总是 24 小时长。所以时区很关键。
让我们看看 UTC。
// of(int year, int month, int dayOfMonth, int hour, int minute, int second, int nanoOfSecond, ZoneOffset offset)
OffsetDateTime odtStart1 = OffsetDateTime.of ( 2016 , 2 , 29 , 12 , 21 , 0 , 0 , ZoneOffset.UTC );
OffsetDateTime odtStop1 = OffsetDateTime.of ( 2016 , 3 , 1 , 12 , 21 , 0 , 0 , ZoneOffset.UTC );
Duration d1 = Duration.between ( odtStart1 , odtStop1 );
OffsetDateTime odtStart2 = OffsetDateTime.of ( 2016 , 4 , 30 , 12 , 21 , 0 , 0 , ZoneOffset.UTC );
OffsetDateTime odtStop2 = OffsetDateTime.of ( 2016 , 5 , 1 , 12 , 21 , 0 , 0 , ZoneOffset.UTC );
Duration d2 = Duration.between ( odtStart2 , odtStop2 );
System.out.println ( odtStart1 + "/" + odtStop1 + " = " + d1 );
System.out.println ( odtStart2 + "/" + odtStop2 + " = " + d2 );
2016-02-29T12:21Z/2016-03-01T12:21Z = PT24H
2016-04-30T12:21Z/2016-05-01T12:21Z = PT24H
toString 生成的字符串是标准的ISO 8601 format for durations。 P 标志着开始,T 将任何年-月-日部分与任何小时-分钟-秒部分分开。
在这两种情况下,结果都是二十四小时。这是正确的,因为在每种情况下,您都选择从一个月的最后一天到下个月的第一天。 UTC 没有异常,因此我们预计正好经过 24 小时。
您可以通过调用compareTo 来比较Duration 对象。你可以做数学来区分它们。在这种情况下,我们期望一个不同的零。
Duration difference = d1.minus( d2 );
difference.toString(): PT0S
看到这个code run live at IdeOne.com。
关于java.time
java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.Date、Calendar 和 SimpleDateFormat。
Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。
要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310。
您可以直接与您的数据库交换 java.time 对象。使用符合JDBC 4.2 或更高版本的JDBC driver。不需要字符串,不需要java.sql.* 类。
从哪里获得 java.time 类?
ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如Interval、YearWeek、YearQuarter 和more。