日历日中 2 个 Instant 之间的区别
The difference between 2 Instants in Calendar Days
所以我想用我的代码获取一个特定的数字。现在我有:
Instant Today = 2018-07-17T13:45:00Z
Instant Expiration1 = 2018-07-18T11:00:00Z
long daysTilExp = Today.until(Expiration, Chronounit.DAYS)
问题是,因为这不是完全相隔 24 小时,它最终会返回 daysTilExp = 0
但我想要 daysTilExp = 1
我正在尝试获得两个 Instants 的实际天数然后即使我像这样更改 Expiration 的值:
Instant Expiration1 = 2018-07-18T06:00:00Z
现在 daysTilExp = 2
。我查看了 Whosebug 上的其他一些答案,但看起来人们并没有在使用 Instant
并且他们不希望以同样的方式出现差异
试试这个:
long daysTilExp = (long) Math.ceil(now.until(goodTo, ChronoUnit.HOURS) / 24.0);
LocalDate 将删除时间部分并且 LocalDate 对象比较将产生预期结果:
LocalDateTime today = LocalDateTime.parse("2018-07-17T13:45:00");
LocalDateTime expiration = LocalDateTime.parse("2018-07-18T11:00:00");
LocalDate todayDate = today.toLocalDate();
LocalDate expirationDate = expiration.toLocalDate();
long days = todayDate.until(expirationDate, ChronoUnit.DAYS);
System.out.println(days);
ZoneId zone = ZoneId.of("America/Chicago");
Instant today = Instant.parse("2018-07-18T17:15:00Z");
Instant expiration1 = Instant.parse("2018-07-19T05:00:00Z");
ZonedDateTime todayInZone = today.atZone(zone);
ZonedDateTime expirationInZone = expiration1.atZone(zone);
long daysTilExp = todayInZone.toLocalDate().until(expirationInZone, ChronoUnit.DAYS);
System.out.format("From %s to %s is %d day/s.%n",
todayInZone, expirationInZone, daysTilExp);
From 2018-07-18T12:15-05:00[America/Chicago] to 2018-07-19T00:00-05:00[America/Chicago] is 1 day/s.
所以从 7 月 18 日到 19 日是 1 天。如果您希望两者都包括在内,只需加 1。
由于地球上任何地方的日期都不同,因此不同时区的天数计算方式不同。尝试更改时区并保持相同的时刻:
ZoneId zone = ZoneId.of("Asia/Tokyo");
这会将输出更改为
From 2018-07-19T02:15+09:00[Asia/Tokyo] to 2018-07-19T14:00+09:00[Asia/Tokyo] is 0 day/s.
正如您从输出中看到的那样,这是因为现在日本已经是 7 月 19 日,所以它 os 从 7 月 19 日到 19 日计算并得到 0。
因此您需要选择ose 您希望计数的时区。
最好的方法是使用 java.time.temporal.ChronoUnit
中的 DAYS.between()
方法。但这种方式仅适用于 Java 8+ 版本。示例:
Date start = new Date();
Date end = new Date(start.getTime() + 10_000);
long daysCount = DAYS.between(start.toInstant(), end.toInstance());
所以我想用我的代码获取一个特定的数字。现在我有:
Instant Today = 2018-07-17T13:45:00Z
Instant Expiration1 = 2018-07-18T11:00:00Z
long daysTilExp = Today.until(Expiration, Chronounit.DAYS)
问题是,因为这不是完全相隔 24 小时,它最终会返回 daysTilExp = 0
但我想要 daysTilExp = 1
我正在尝试获得两个 Instants 的实际天数然后即使我像这样更改 Expiration 的值:
Instant Expiration1 = 2018-07-18T06:00:00Z
现在 daysTilExp = 2
。我查看了 Whosebug 上的其他一些答案,但看起来人们并没有在使用 Instant
并且他们不希望以同样的方式出现差异
试试这个:
long daysTilExp = (long) Math.ceil(now.until(goodTo, ChronoUnit.HOURS) / 24.0);
LocalDate 将删除时间部分并且 LocalDate 对象比较将产生预期结果:
LocalDateTime today = LocalDateTime.parse("2018-07-17T13:45:00");
LocalDateTime expiration = LocalDateTime.parse("2018-07-18T11:00:00");
LocalDate todayDate = today.toLocalDate();
LocalDate expirationDate = expiration.toLocalDate();
long days = todayDate.until(expirationDate, ChronoUnit.DAYS);
System.out.println(days);
ZoneId zone = ZoneId.of("America/Chicago");
Instant today = Instant.parse("2018-07-18T17:15:00Z");
Instant expiration1 = Instant.parse("2018-07-19T05:00:00Z");
ZonedDateTime todayInZone = today.atZone(zone);
ZonedDateTime expirationInZone = expiration1.atZone(zone);
long daysTilExp = todayInZone.toLocalDate().until(expirationInZone, ChronoUnit.DAYS);
System.out.format("From %s to %s is %d day/s.%n",
todayInZone, expirationInZone, daysTilExp);
From 2018-07-18T12:15-05:00[America/Chicago] to 2018-07-19T00:00-05:00[America/Chicago] is 1 day/s.
所以从 7 月 18 日到 19 日是 1 天。如果您希望两者都包括在内,只需加 1。
由于地球上任何地方的日期都不同,因此不同时区的天数计算方式不同。尝试更改时区并保持相同的时刻:
ZoneId zone = ZoneId.of("Asia/Tokyo");
这会将输出更改为
From 2018-07-19T02:15+09:00[Asia/Tokyo] to 2018-07-19T14:00+09:00[Asia/Tokyo] is 0 day/s.
正如您从输出中看到的那样,这是因为现在日本已经是 7 月 19 日,所以它 os 从 7 月 19 日到 19 日计算并得到 0。
因此您需要选择ose 您希望计数的时区。
最好的方法是使用 java.time.temporal.ChronoUnit
中的 DAYS.between()
方法。但这种方式仅适用于 Java 8+ 版本。示例:
Date start = new Date();
Date end = new Date(start.getTime() + 10_000);
long daysCount = DAYS.between(start.toInstant(), end.toInstance());