我在2018年12 月 7 日運行以下表達式。我看到了一個差異:ZonedDateTime.now(ZoneId.of("America/New_York")).minusDays(30)返回(正確):2018-11-07T22:44:11.242576-05:00[America/New_York]而轉換為瞬間:ZonedDateTime.now(ZoneId.of("America/New_York")).minusDays(30).toInstant()似乎通過添加額外的一天來弄亂結果:2018-11-08T03:58:01.724728Z我需要立即轉換以在以下代碼中使用其結果作為日期:... = Date.from(t.toInstant()) 等效的 Python 代碼 (Django) 可以正常工作:datetime.datetime.now('America/New_York')+datetime.timedelta(days=-30)評估為: datetime: 2018-11-07 20:13:55.063888-05:00造成差異的原因是什么?我應該使用什么來使 Java 轉換為 Date 導致返回11 月 7 日,就像在 Python 的情況下一樣?基本上,我正在尋找該 Python 代碼到 Java 或偽代碼的等效翻譯:`datetime.X = datetime.now(deployment_zone) - (N_days)`,where `deployment_zone` is configurable (i.e. `America/New_York`)`N_days` is configurable (i.e. 30)
2 回答

POPMUISE
TA貢獻1765條經驗 獲得超5個贊
那個“額外的一天”并不是真正的額外一天。2018-11-07T22:44:11在紐約相當于2018-11-08T03:58:01在UTC(這是同一時間點)。區別只是5幾個小時,而不是一天(當我用谷歌搜索時,我看到紐約是GMT-5)。
ZonedDateTime#toInstant返回Instant表示同一時間點(UTC)的實例:
將此日期時間轉換為 Instant。這將返回一個 Instant 表示時間線上與此日期時間相同的點。該計算結合了本地日期時間和偏移量。
如果你想不使用轉換為即時當偏移,那么你或許應該使用LocalDateTime:
ZonedDateTime.now(ZoneId.of("America/New_York"))
.toLocalDateTime()
.toInstant(ZoneOffset.UTC)
這告訴它轉換,好像它已經是 UTC 時間(但這里有一個警告:這會更改日期/時間值)
添加回答
舉報
0/150
提交
取消