3

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

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

4 回答 4

4

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);
于 2018-07-17T20:30:41.120 回答
2
    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[America/Chicago] 到 2018-07-19T00:00-05:00[America/Chicago] 为 1 天/秒。

所以从 7 月 18 日到 19 日是 1 天。如果您希望两者都包含在计数中,只需加 1。

由于地球上任何地方的日期都不会相同,因此在不同时区计算天数是不同的。尝试更改时区并保持相同的时刻:

    ZoneId zone = ZoneId.of("Asia/Tokyo");

这将输出更改为

从 2018-07-19T02:15+09:00[Asia/Tokyo] 到 2018-07-19T14:00+09:00[Asia/Tokyo] 为 0 天/秒。

从输出中可以看出,这是因为现在日本已经是 7 月 19 日,所以它从 7 月 19 日到 19 日计数并得到 0。

所以你需要选择你想要计数的时区。

于 2018-07-18T14:44:28.087 回答
2

最好的方法是使用DAYS.between()方法 from 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());
于 2020-12-07T03:31:01.380 回答
0

试试这个:

long daysTilExp = (long) Math.ceil(now.until(goodTo, ChronoUnit.HOURS) / 24.0);
于 2018-07-17T19:41:09.610 回答