第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

為什么 Date 對(duì)象不代表 JVM 時(shí)區(qū)中的日期?

為什么 Date 對(duì)象不代表 JVM 時(shí)區(qū)中的日期?

白衣染霜花 2023-05-24 15:58:17
我有 UTC 日期,我需要?jiǎng)?chuàng)建與 UTC 具有完全相同值的 Date 對(duì)象(遺留原因)。我設(shè)法做到了:String date = "2012-05-05 12:13:14";TemporalAccessor formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")        .withZone(ZoneId.of("UTC"))        .parse(date);Instant instant = Instant.from(        formatter); //ZonedDateTime zdf = ZonedDateTime.ofInstant(instant,ZoneId.of("UTC"));Calendar calendar = Calendar.getInstance();calendar.set(zdf.getYear(),zdf.getMonthValue(),zdf.getDayOfMonth(),zdf.getHour(),zdf.getMinute(),zdf.getSecond());Date dt = calendar.getTime();Date d2 = Date.from(instant);然而,困擾我的是——當(dāng)我創(chuàng)建日期對(duì)象時(shí),它應(yīng)該以我的 JVM 默認(rèn)時(shí)區(qū)顯示日期。但是這里的dt值與我輸入的 UTC 日期完全相同,但dt2在我的默認(rèn)時(shí)區(qū)中表示的日期相同,為什么會(huì)這樣?為什么一個(gè)沒(méi)有皈依而另一個(gè)被皈依了?感謝您的解釋!
查看完整描述

2 回答

?
慕標(biāo)琳琳

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ū)。不像DateaCalendar 一個(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 也是正確的:雖然日期是ZonedDateTIme5 月(第 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í)刻。Calendardt

在您的問(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。


查看完整回答
反對(duì) 回復(fù) 2023-05-24
?
繁花不似錦

TA貢獻(xiàn)1851條經(jīng)驗(yàn) 獲得超4個(gè)贊

博士

  • 正如其他人所說(shuō),ajava.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ú)需使用DateCalendar再次使用。不要浪費(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)代類的圖表。

http://img2.sycdn.imooc.com/646dc3c80001d73106530375.jpg

查看完整回答
反對(duì) 回復(fù) 2023-05-24
  • 2 回答
  • 0 關(guān)注
  • 152 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)