我有一个问题,我尝试了所有方法(包括在线 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 。Date
Instant
ZonedDateTime
Instant instant = zdt.toInstant() ; java.util.Date date = java.util.Date.from ( instant ) ;
如果您需要 aCalendar
而不是Date
,则转换更直接。
Calendar cal = GregorianCalendar.from( zdt ) ;
添加回答
举报
0/150
提交
取消