猿问

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

我有一个问题,我尝试了所有方法(包括在线 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


知道该怎么做吗?


慕雪6442864
浏览 117回答 1
1回答

紫衣仙女

避免java.util.DateAjava.util.Date代表 UTC 中的某个时刻。无需将其作为文本进行操作。注意:该方法Date::toString说谎了,在生成文本时动态应用 JVM 当前的默认时区。相反,使用java.time.Instant首先从那个可怕的遗留类转换为它的现代替代品,java.time.Instant. 注意添加到旧类的新转换方法。Instant instant = myDate.toInstant() ;ZonedDateTimeAnInstant也是 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 。DateInstantZonedDateTimeInstant instant = zdt.toInstant() ; java.util.Date date = java.util.Date.from ( instant ) ;如果您需要 aCalendar而不是Date,则转换更直接。Calendar cal = GregorianCalendar.from( zdt ) ;
随时随地看视频慕课网APP

相关分类

Java
我要回答