日历天中2个瞬间之间的差异

时间:2018-07-17 18:44:21

标签: java temporal java.time.instant

所以我试图用我的代码获取一个特定的数字。现在我有:

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,他们也不想以相同的方式来寻求差异

4 个答案:

答案 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());