为了账号安全,请及时绑定邮箱和手机立即绑定

Java ZonedDateTime.toInstant() 行为

Java ZonedDateTime.toInstant() 行为

慕少森 2021-09-11 13:40:42
我在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 时间(但这里有一个警告:这会更改日期/时间值)


查看完整回答
反对 回复 2021-09-11
  • 2 回答
  • 0 关注
  • 543 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信