我在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
提交
取消