toi*_*lle 4 java date date-arithmetic
我想找出两个日期之间的分钟差。如果两个日期在同一个月(和同一年),我的代码运行良好,但似乎差异认为每个月有 31 天长,因此对于日期:
2016-02-29 12:21
2016-03-1 12:21
Run Code Online (Sandbox Code Playgroud)
我有 4320 分钟或 72 小时
为了:
2016-04-30 12:21
2016-05-01 12:21
Run Code Online (Sandbox Code Playgroud)
我有 2880 分钟或 48 小时
我的代码,其中 d1 和 d2 是日期对象:
long getDateDiff(Date d1, Date d2, TimeUnit timeUnit) {
long diff = d2.getTime() - d1.getTime(); //in millisec
long diffMinutes = TimeUnit.MILLISECONDS.toMinutes(diff);
return diffMinutes;
}
Run Code Online (Sandbox Code Playgroud)
解析您的输入字符串。
\n\nLocalDateTime startLdt = LocalDateTime.parse( "2016-04-30T12:21" ) ;\nLocalDateTime stopLdt = LocalDateTime.parse( "2016-05-01T12:21") ;\nRun Code Online (Sandbox Code Playgroud)\n\n分配预期但在输入中省略的时区或相对于 UTC 的偏移量。我假设您想要 UTC 本身(偏移量为零)。
\n\nOffsetDateTime start = startLdt.atOffset( ZoneOffset.UTC );\nOffsetDateTime stop = stopLdt.atOffset( ZoneOffset.UTC ) ;\nRun Code Online (Sandbox Code Playgroud)\n\n以天(24 小时时间块)、小时、分钟、秒和纳秒为单位计算经过的时间。
\n\nDuration d = Duration.between( start , stop ) ;\nRun Code Online (Sandbox Code Playgroud)\n\n\n\n\nd.toString(): PT24H
\n
您的第一个示例在 24 小时内生成,如代码在 IdeOne.com 上实时运行时所见。
\n\n您的第二个示例也导致 24 小时,如IdeOne.com 中所示。
\n\n问题和其他答案都使用麻烦的旧日期时间类或Joda-Time库。两者都被 java.time 类取代。
\n\n将对象转换Date为Instant对象,相当于 java.time 中的对象。该类表示UTCInstant时间线上的时刻,分辨率为纳秒(最多九 (9) 位小数)。
Instant start = d1.toInstant();\nInstant stop = d2.toInstant();\nRun Code Online (Sandbox Code Playgroud)\n\n使用Duration(或Period) 表示之间的时间跨度。
Duration d = Duration.between( start , stop );\nRun Code Online (Sandbox Code Playgroud)\n\n提取整个时间段内的总分钟数。
\n\nlong minutes = d.toMinutes() ;\nRun Code Online (Sandbox Code Playgroud)\n\n您没有提及用于日期时间值的时区。他们的上下文是UTC吗?或者您想要某个特定的时区。在不同的时区,夏令时 (DST) 等异常情况意味着白天并不总是 24 小时。所以时区至关重要。
\n\n让我们看看UTC。
\n\n// of(int year, int month, int dayOfMonth, int hour, int minute, int second, int nanoOfSecond, ZoneOffset offset)\nOffsetDateTime odtStart1 = OffsetDateTime.of ( 2016 , 2 , 29 , 12 , 21 , 0 , 0 , ZoneOffset.UTC );\nOffsetDateTime odtStop1 = OffsetDateTime.of ( 2016 , 3 , 1 , 12 , 21 , 0 , 0 , ZoneOffset.UTC );\nDuration d1 = Duration.between ( odtStart1 , odtStop1 );\n\nOffsetDateTime odtStart2 = OffsetDateTime.of ( 2016 , 4 , 30 , 12 , 21 , 0 , 0 , ZoneOffset.UTC );\nOffsetDateTime odtStop2 = OffsetDateTime.of ( 2016 , 5 , 1 , 12 , 21 , 0 , 0 , ZoneOffset.UTC );\nDuration d2 = Duration.between ( odtStart2 , odtStop2 );\n\nSystem.out.println ( odtStart1 + "/" + odtStop1 + " = " + d1 );\nSystem.out.println ( odtStart2 + "/" + odtStop2 + " = " + d2 );\nRun Code Online (Sandbox Code Playgroud)\n\n\n\n\n2016-02-29T12:21Z/2016-03-01T12:21Z = PT24H
\n\n2016-04-30T12:21Z/2016-05-01T12:21Z = PT24H
\n
生成的字符串的持续时间toString采用标准ISO 8601 格式。标记开始,将任何年-月-日部分与任何小时-分钟-秒部分分开。PT
在这两种情况下,结果都是二十四小时。这是正确的,因为在每种情况下您都选择从一个月的最后一天到下个月的第一天。UTC 没有异常,因此我们预计正好过去 24 小时。
\n\n您可以Duration通过调用来比较对象compareTo。你可以通过数学计算来找出它们之间的差异。在这种情况下,我们期望差异为零。
Duration difference = d1.minus( d2 );\nRun Code Online (Sandbox Code Playgroud)\n\n\n\n\n\n\n差异.toString(): PT0S
\n
java.time框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧遗留日期时间类,例如java.util.Date, Calendar, & SimpleDateFormat。
Joda -Time项目现在处于维护模式,建议迁移到java.time类。
\n\n要了解更多信息,请参阅Oracle 教程。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310。
\n\n您可以直接与数据库交换java.time对象。使用与JDBC 4.2或更高版本兼容的JDBC 驱动程序。不需要字符串,不需要类。java.sql.*
从哪里获取 java.time 类?
\n\nThreeTen -Extra项目通过附加类扩展了 java.time。该项目是 java.time 未来可能添加的内容的试验场。您可能会在这里找到一些有用的类,例如Interval、、、等等。YearWeekYearQuarter
| 归档时间: |
|
| 查看次数: |
2139 次 |
| 最近记录: |