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

如何在特定日期设置时区?

如何在特定日期设置时区?

慕雪6442864 2023-06-21 15:03:57
我有一个问题,我尝试了所有方法(包括在线 stackoverflow 线程),但无法在特定日期按预期设置时区。这是我的代码:Date until = DateTimeUtils.getNewBookUntilDate();//which returns : Wed Aug 28 11:00:02 EDT 2019 SimpleDateFormat isoFormat = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy");            isoFormat.setTimeZone(TimeZone.getTimeZone("America/Los_Angeles");try {    until = isoFormat.parse(until.toString());} catch (ParseException e) {     e.printStackTrace();}但我仍然得到: Wed Aug 28 11:00:02 EDT 2019 ,而不是 Wed Aug 28 8:00:02 PDT 2019知道该怎么做吗?
查看完整描述

1 回答

?
紫衣仙女

TA贡献1839条经验 获得超15个赞

避免java.util.Date

Ajava.util.Date代表 UTC 中的某个时刻。无需将其作为文本进行操作。注意:该方法Date::toString说谎了,在生成文本时动态应用 JVM 当前的默认时区。

相反,使用java.time.Instant

首先从那个可怕的遗留类转换为它的现代替代品,java.time.Instant. 注意添加到旧类的新转换方法。

Instant instant = myDate.toInstant() ;

ZonedDateTime

AnInstant也是 UTC 中的时刻。要通过某个地区的人们使用的距 UTC 的偏移量查看同一时刻,请应用 aZoneId来获取ZonedDateTime对象。

ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;

请明确:这个zdt对象和这个instant对象都代表同一时刻,时间轴上的同一点。它们仅在挂钟时间上有所不同。想象一下,冰岛的某人(始终采用 UTC)给魁北克的某人打电话,他们都抬头看着各自墙上的时钟。

从现代到传统

如果您ZonedDateTime手头有一个对象,并且必须获得一个java.util.Date用于与尚未更新到java.time的旧代码进行互操作的对象,则可以进行转换。通过从对象中提取 aInstant来从 an 转到 a 。DateInstantZonedDateTime

Instant instant = zdt.toInstant() ;
java.util.Date date = java.util.Date.from ( instant ) ;

如果您需要 aCalendar而不是Date,则转换更直接。

Calendar cal = GregorianCalendar.from( zdt ) ;


查看完整回答
反对 回复 2023-06-21
  • 1 回答
  • 0 关注
  • 122 浏览

添加回答

举报

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