我有一個問題,我嘗試了所有方法(包括在線 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
提交
取消