猿问

Java ZonedDateTime.toInstant() 行为

我在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)


慕少森
浏览 656回答 2
2回答

POPMUISE

那个“额外的一天”并不是真正的额外一天。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 时间(但这里有一个警告:这会更改日期/时间值)
随时随地看视频慕课网APP

相关分类

Python
我要回答