3

そのため、コードで特定の番号を取得しようとしています。今私は持っています:

Instant Today = 2018-07-17T13:45:00Z
Instant Expiration1 = 2018-07-18T11:00:00Z
long daysTilExp = Today.until(Expiration, Chronounit.DAYS)

問題は、これが正確に 24 時間離れていないため、最終的に返されることですが、2 つのインスタントの実際の日数を取得daysTilExp = 0しよdaysTilExp = 1うとしている場合でも、Expiration の値を次のように変更した場合:

Instant Expiration1 = 2018-07-18T06:00:00Z

そして今daysTilExp = 2。私は StackOverflow で他のいくつかの回答を見ましたが、人々が使用Instantしているようには見えず、同じように違いを望んでいません

4

4 に答える 4

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[アメリカ/シカゴ] から 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 を取得しているためです。

そのため、カウントするタイムゾーンを選択する必要があります。

于 2018-07-18T14:44:28.087 に答える