所以我试图用我的代码获取一个特定的数字。现在我有:
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
试图使两个Instant间隔的实际天数是如此,所以即使如果我这样更改Expiration的值:
Instant Expiration1 = 2018-07-18T06:00:00Z
,现在是daysTilExp = 2
。我在StackOverflow上查看了其他答案,但看起来人们并没有Instant
,他们也不想以相同的方式来寻求差异
答案 0 :(得分:3)
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);
答案 1 :(得分:1)
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);
从2018-07-18T12:15-05:00 [美国/芝加哥]到2018-07-19T00:00-05:00 [美国/芝加哥]为1天/秒。
所以从7月18日到19日是1天。如果您希望两者都包含在内,则只需添加1。
由于地球上的各个地方从来都不是同一日期,因此在不同的时区中,天数的计数是不同的。尝试更改时区并保持相同的时刻:
ZoneId zone = ZoneId.of("Asia/Tokyo");
这会将输出更改为
从2018-07-19T02:15 + 09:00 [亚洲/东京]到2018-07-19T14:00 + 09:00 [亚洲/东京]为0天/秒。
从输出中可以看到,这是因为日本现在已经是7月19日,所以从7月19日到19日计数为0。
因此,您需要选择要在哪个时区计数。
答案 2 :(得分:0)
尝试一下:
long daysTilExp = (long) Math.ceil(now.until(goodTo, ChronoUnit.HOURS) / 24.0);
答案 3 :(得分:0)
最好的方法是使用DAYS.between()
中的java.time.temporal.ChronoUnit
方法。但是这种方式仅适用于Java 8+版本。示例:
Date start = new Date();
Date end = new Date(start.getTime() + 10_000);
long daysCount = DAYS.between(start.toInstant(), end.toInstance());