2 回答

TA貢獻(xiàn)1830條經(jīng)驗(yàn) 獲得超9個(gè)贊
保留時(shí)間與保留時(shí)刻
我會(huì)一一解釋中心線。
Calendar calendar = Calendar.getInstance();
這將創(chuàng)建一個(gè)Calendar
與 JVM 默認(rèn)時(shí)區(qū)相同的時(shí)區(qū)。不像Date
aCalendar
有一個(gè)時(shí)區(qū)。
calendar.set(zdf.getYear(),zdf.getMonthValue(),zdf.getDayOfMonth(), zdf.getHour(),zdf.getMinute(),zdf.getSecond());
這會(huì)將您設(shè)置Calendar
為與您相同的掛鐘時(shí)間ZonedDateTime
,即 12:13:14。由于 和ZonedDateTime
具有Calendar
不同的時(shí)區(qū)(分別為 UTC 和您當(dāng)?shù)氐臅r(shí)區(qū)),這會(huì)導(dǎo)致不同的時(shí)刻。
@VGR 也是正確的:雖然日期是ZonedDateTIme
5 月(第 5 個(gè)月),但您將月份設(shè)置Calendar
為 6 月,因?yàn)?code>Calendar令人困惑的月份是從 0 開(kāi)始的,從 1 月的 0 到 12 月的 11。
Date d2 = Date.from(instant);
Instant
這是從到的正確轉(zhuǎn)換,Date
并為您提供相同的時(shí)間點(diǎn),與Instant
. 因此與和不在同一個(gè)時(shí)刻。Calendar
dt
在您的問(wèn)題中可能已經(jīng)理解了,但是對(duì)于閱讀的任何人,我想直接聲明:Date
并且Calendar
設(shè)計(jì)不佳且早已過(guò)時(shí)。您不應(yīng)使用它們,除非需要與您現(xiàn)在無(wú)法更改或不想升級(jí)的遺留 API 進(jìn)行交互。對(duì)于所有其他用途,請(qǐng)堅(jiān)持使用現(xiàn)代 Java 日期和時(shí)間 API java.time。

TA貢獻(xiàn)1851條經(jīng)驗(yàn) 獲得超4個(gè)贊
博士
正如其他人所說(shuō),a
java.util.Date
代表 UTC 中的一個(gè)時(shí)刻。它的toString
方法是通過(guò)在生成格式不正確的字符串時(shí)動(dòng)態(tài)應(yīng)用 JVM 當(dāng)前的默認(rèn)時(shí)區(qū)來(lái)欺騙您。從不使用此類的眾多原因之一。不要浪費(fèi)你的時(shí)間去理解那些可怕的類
Date
&?Calendar
。它們現(xiàn)在是legacy,要避免。僅對(duì)所有日期時(shí)間處理使用java.time類。
細(xì)節(jié)
您將糟糕的遺留日期時(shí)間類 (?Date
,?Calendar
) 與其現(xiàn)代替代品 (?Instant
,?ZonedDateTime
) 混合在一起。不要混合這些。隨著JSR 310的采用,遺留類完全被java.time類取代。
無(wú)需使用Date
或Calendar
再次使用。不要浪費(fèi)時(shí)間去理解它們。它們被替換是有原因的——實(shí)際上有很多原因。動(dòng)用您的智慧和時(shí)間來(lái)完成更有成效的工作。
如果您必須使用遺留類與尚未更新到java.time 的舊代碼進(jìn)行互操作,請(qǐng)通過(guò)調(diào)用添加到舊類的新to…
/轉(zhuǎn)換方法來(lái)來(lái)回轉(zhuǎn)換。使用java.timefrom…
類執(zhí)行業(yè)務(wù)邏輯、數(shù)據(jù)交換和數(shù)據(jù)存儲(chǔ)。
該類java.util.Date
被替換為Instant
.
java.util.Date?d?=?Date.from(?instant?)?;?????//?From??modern?to?legacy. Instant?instant?=?d.toInstant()?;?????????????//?From?legacy?to?modern.
該類Calendar
,或者更確切地說(shuō)是其常用的子類GregorianCalendar
,被替換為ZonedDateTime
。假設(shè)你的Calendar
對(duì)象真的是一個(gè)GregorianCalendar
底層,你可以投射,然后轉(zhuǎn)換。
Calendar?c?=?GregorianCalendar.from(?zonedDateTime?)?;????????????????????????//?From??modern?to?legacy. ZonedDateTime?zonedDateTime?=?(?(GregorianCalendar)?c?).toZonedDateTime()?;???//?From?legacy?to?modern.
這是一張將遺留類映射到現(xiàn)代類的圖表。
添加回答
舉報(bào)