java - 如何使用夏令时结束日期计算日期之间的剩余时间

标签 java android

我有以下日期:

开始:2017-09-11T00:00:00+01:00 结束:2017-11-13T00:00:00+01:00

由于夏令时,用开始数据减去结束数据的毫秒数对于我的时区(欧洲/布鲁塞尔)来说不是正确的结果。 10 月 29 日晚上,时钟将拨慢 1 小时。

我们应该如何在 Java/Android 中处理这个问题?

我试过使用 Joda Time 但无济于事。休息一小时。

最佳答案

Java8 中,您将使用 ZonedDateTime。这是 official api docs .

还有一个适用于您的案例的示例:

DateTimeFormatter formatter = DateTimeFormatter.ISO_ZONED_DATE_TIME;

// Start: 2017-09-11T00:00:00+02:00
LocalDateTime localDateTimeStart = LocalDateTime.of(2017, Month.SEPTEMBER, 11, 0, 0, 0);
// End: 2017-11-13T00:00:00+01:00 (instead of +02:00)
LocalDateTime localDateTimeEnd = LocalDateTime.of(2017, Month.NOVEMBER, 13, 0, 0, 0);

ZonedDateTime zonedDateTimeStart = localDateTimeStart.atZone(ZoneId.of("Europe/Brussels"));
System.out.println("ZonedDateTimeStart: " + formatter.format(zonedDateTimeStart));

ZonedDateTime zonedDateTimeEnd = localDateTimeEnd.atZone(ZoneId.of("Europe/Brussels"));
System.out.println("ZonedDateTimeEnd: " + formatter.format(zonedDateTimeEnd));

System.out.println("Remaining time in hours: " + ChronoUnit.HOURS.between(zonedDateTimeStart, zonedDateTimeEnd));

产生:

ZonedDateTimeStart: 2017-09-11T00:00:00+02:00[Europe/Brussels]
ZonedDateTimeEnd: 2017-11-13T00:00:00+01:00[Europe/Brussels]
Remaining time in hours: 1513

更新:

对于 java8 之前的解决方案,基于 Joda time,使用这个:

org.joda.time.DateTimeZone yourTimeZone = org.joda.time.DateTimeZone.forID("Europe/Brussels");
org.joda.time.DateTime start = new org.joda.time.DateTime(2017, 9, 11, 0, 0, 0, yourTimeZone);
org.joda.time.DateTime end = new org.joda.time.DateTime(2017, 11, 13, 0, 0, 0, yourTimeZone);
org.joda.time.Duration durationInHours = new org.joda.time.Duration(start, end);
System.out.println("ZonedDateTimeStart: " + start);
System.out.println("ZonedDateTimeEnd: " + end);
System.out.println("Remaining time in hours: " + durationInHours.toStandardHours().getHours());

产生:

ZonedDateTimeStart: 2017-09-11T00:00:00.000+02:00
ZonedDateTimeEnd: 2017-11-13T00:00:00.000+01:00
Remaining time in hours: 1513

关于java - 如何使用夏令时结束日期计算日期之间的剩余时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46302604/

相关文章:

java - sql语法如何在java中写下来

android - 如何使用 android/busybox shell 命令删除指定文件的所有符号链接(symbolic link)?

android - 从内容提供者读取/写入文件

android - Android 中 View 导航的设计模式?

android - 用渐变画线

android - 如何将 Android 上的视频录制到 Stream 中

java - 如何在 j00q 中引用 Postgres 约束?

java - JPA 映射错误

java - Swing:鼠标事件和工具提示

java - TestNG 中每个测试有多个数据提供者