国产av一二三区|日本不卡动作网站|黄色天天久久影片|99草成人免费在线视频|AV三级片成人电影在线|成年人aV不卡免费播放|日韩无码成人一级片视频|人人看人人玩开心色AV|人妻系列在线观看|亚洲av无码一区二区三区在线播放

網(wǎng)易首頁 > 網(wǎng)易號 > 正文 申請入駐

Date 類已被廢棄了,強烈建議不要再使用 java.util.Date 了!

0
分享至

釣友寶 (微信小程序):一款專門為 釣友 開發(fā)的 免費的 分享釣點地圖與實時天氣的軟件,地圖中標(biāo)記了所有野釣、釣場、公共水域等的精確位置,支持導(dǎo)航、 預(yù)測釣魚位置的魚情 等功能。

一、有什么問題嗎java.util.Date?

java.util.Date(Date從現(xiàn)在開始)是一個糟糕的類型,這解釋了為什么它的大部分內(nèi)容在 Java 1.1 中被棄用(但不幸的是仍在使用)。

設(shè)計缺陷包括:

  • 它的名稱具有誤導(dǎo)性: 它并不代表一個日期,而是代表時間的一個瞬間。所以它應(yīng)該被稱為Instant——正如它的java.time等價物一樣。

  • 它是非最終的: 這鼓勵了對繼承的不良使用,例如java.sql.Date(這意味著代表一個日期,并且由于具有相同的短名稱而也令人困惑)

  • 它是可變的: 日期/時間類型是自然值,可以通過不可變類型有效地建模??勺兊氖聦岲ate(例如通過setTime方法)意味著勤奮的開發(fā)人員最終會在各處創(chuàng)建防御性副本。

  • 它在許多地方(包括)隱式使用系統(tǒng)本地時區(qū),toString()這讓許多開發(fā)人員感到困惑。有關(guān)此內(nèi)容的更多信息,請參閱“什么是即時”部分

  • 它的月份編號是從 0 開始的,是從 C 語言復(fù)制的。這導(dǎo)致了很多很多相差一的錯誤。

  • 它的年份編號是基于 1900 年的,也是從 C 語言復(fù)制的。當(dāng)然,當(dāng) Java 出現(xiàn)時,我們已經(jīng)意識到這不利于可讀性?

  • 它的方法命名不明確: getDate()返回月份中的某一天,并getDay()返回星期幾。給這些更具描述性的名字有多難?

  • 對于是否支持閏秒含糊其辭: “秒由 0 到 61 之間的整數(shù)表示;值 60 和 61 僅在閏秒時出現(xiàn),即使如此,也僅在實際正確跟蹤閏秒的 Java 實現(xiàn)中出現(xiàn)?!?我強烈懷疑大多數(shù)開發(fā)人員(包括我自己)都做了很多假設(shè),認(rèn)為 for 的范圍getSeconds()實際上在 0-59 范圍內(nèi)(含)。

  • 它的寬容沒有明顯的理由: “在所有情況下,為這些目的而對方法給出的論據(jù)不必落在指定的范圍內(nèi); 例如,日期可以指定為 1 月 32 日,并被解釋為 2 月 1 日?!?多久有用一次?

關(guān)鍵原因如下:

原文如下:為什么要避免使用Date類?

“https://codeblog.jonskeet.uk/2017/04/23/all-about-java-util-date/

二、為啥要改?

我們要改的原因很簡單,我們的代碼缺陷掃描規(guī)則認(rèn)為這是一個必須修改的缺陷,否則不給發(fā)布,不改不行,服了。

解決思路:避免使用java.util.Date與java.sql.Date類和其提供的API,考慮使用java.time.Instant類或java.time.LocalDateTime類及其提供的API替代。

三、怎么改?

只能說這種基礎(chǔ)的類改起來牽一發(fā)動全身,需要從DO實體類看起,然后就是各種Converter,最后是DTO。

由于我們還是微服務(wù)架構(gòu),業(yè)務(wù)服務(wù)依賴于基礎(chǔ)服務(wù)的API,所以必須要一起改否則就會報錯。這里就不細(xì)說修改流程了,主要說一下我們在改造的時候遇到的一些問題。

1. 耐心比對數(shù)據(jù)庫日期字段和DO的映射

1)確定字段類型

首先你需要確定數(shù)據(jù)對象中的 Date 字段代表的是日期、時間還是時間戳。

如果字段代表日期和時間,則可能需要使用 LocalDateTime。

如果字段僅代表日期,則可能需要使用 LocalDate。

如果字段僅代表時間,則可能需要使用 LocalTime。

如果字段需要保存時間戳(帶時區(qū)的),則可能需要使用 Instant 或 ZonedDateTime。

2)更新數(shù)據(jù)對象類

更新數(shù)據(jù)對象類中的字段,把 Date 類型改為適當(dāng)?shù)?java.time 類型。

2. 將DateUtil中的方法改造

1)替換原來的new Date()和Calendar.getInstance().getTime()

原來的方式:

Date nowDate = new Date(); Date nowCalendarDate = Calendar.getInstance().getTime();

使用 java.time 改造后:

// 使用Instant代表一個時間點,這與Date類似 Instant nowInstant = Instant.now(); // 如果需要用到具體的日期和時間(例如年、月、日、時、分、秒) LocalDateTime nowLocalDateTime = LocalDateTime.now(); // 如果你需要和特定的時區(qū)交互,可以使用ZonedDateTime ZonedDateTime nowZonedDateTime = ZonedDateTime.now(); // 如果你需要轉(zhuǎn)換回java.util.Date,你可以這樣做(假設(shè)你的代碼其他部分還需要使用Date) Date nowFromDateInstant = Date.from(nowInstant); // 如果需要與java.sql.Timestamp交互 java.sql.Timestamp nowFromInstant = java.sql.Timestamp.from(nowInstant);

一些注意點:

Instant 表示的是一個時間點,它是時區(qū)無關(guān)的,相當(dāng)于舊的 Date 類。它通常用于表示時間戳。

LocalDateTime 表示沒有時區(qū)信息的日期和時間,它不能直接轉(zhuǎn)換為時間戳,除非你將其與時區(qū)結(jié)合使用(例如通過 ZonedDateTime)。

ZonedDateTime 包含時區(qū)信息的日期和時間,它更類似于 Calendar,因為 Calendar 也包含時區(qū)信息。

當(dāng)你需要將 java.time 對象轉(zhuǎn)換回 java.util.Date 對象時,可以使用 Date.from(Instant) 方法。這在你的代碼需要與舊的API或庫交互時非常有用。

2)一些基礎(chǔ)的方法改造

a. dateFormat

原來的方式

public static String dateFormat(Date date, String dateFormat) {     SimpleDateFormat formatter = new SimpleDateFormat(dateFormat);     return formatter.format(date); }

使用java.time改造后

public static String dateFormat(LocalDateTime date, String dateFormat) {     DateTimeFormatter formatter = DateTimeFormatter.ofPattern(dateFormat);     return date.format(formatter); }

b. addSecond、addMinute、addHour、addDay、addMonth、addYear

原來的方式

public static Date addSecond(Date date, int second) {     Calendar calendar = Calendar.getInstance();     calendar.setTime(date);     calendar.add(13, second);     return calendar.getTime(); } public static Date addMinute(Date date, int minute) {     Calendar calendar = Calendar.getInstance();     calendar.setTime(date);     calendar.add(12, minute);     return calendar.getTime(); } public static Date addHour(Date date, int hour) {     Calendar calendar = Calendar.getInstance();     calendar.setTime(date);     calendar.add(10, hour);     return calendar.getTime(); } public static Date addDay(Date date, int day) {     Calendar calendar = Calendar.getInstance();     calendar.setTime(date);     calendar.add(5, day);     return calendar.getTime(); } public static Date addMonth(Date date, int month) {     Calendar calendar = Calendar.getInstance();     calendar.setTime(date);     calendar.add(2, month);     return calendar.getTime(); } public static Date addYear(Date date, int year) {     Calendar calendar = Calendar.getInstance();     calendar.setTime(date);     calendar.add(1, year);     return calendar.getTime(); }

使用java.time改造后

public static LocalDateTime addSecond(LocalDateTime date, int second) {     return date.plusSeconds(second); } public static LocalDateTime addMinute(LocalDateTime date, int minute) {     return date.plusMinutes(minute); } public static LocalDateTime addHour(LocalDateTime date, int hour) {     return date.plusHours(hour); } public static LocalDateTime addDay(LocalDateTime date, int day) {     return date.plusDays(day); } public static LocalDateTime addMonth(LocalDateTime date, int month) {     return date.plusMonths(month); } public static LocalDateTime addYear(LocalDateTime date, int year) {     return date.plusYears(year); }

c. dateToWeek

原來的方式

public static final String[] WEEK_DAY_OF_CHINESE = new String[]{"周日", "周一", "周二", "周三", "周四", "周五", "周六"}; public static String dateToWeek(Date date) {     Calendar cal = Calendar.getInstance();     cal.setTime(date);     return WEEK_DAY_OF_CHINESE[cal.get(7) - 1]; }

使用java.time改造后

public static final String[] WEEK_DAY_OF_CHINESE = new String[]{"周日", "周一", "周二", "周三", "周四", "周五", "周六"}; public static String dateToWeek(LocalDate date) {     DayOfWeek dayOfWeek = date.getDayOfWeek();     return WEEK_DAY_OF_CHINESE[dayOfWeek.getValue() % 7]; }

原來的方式

public static Date getStartTimeOfDay(Date date) {     if (date == null) {         returnnull;     } else {         LocalDateTime localDateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(date.getTime()), ZoneId.systemDefault());         LocalDateTime startOfDay = localDateTime.with(LocalTime.MIN);         return Date.from(startOfDay.atZone(ZoneId.systemDefault()).toInstant());     } } public static Date getEndTimeOfDay(Date date) {     if (date == null) {         returnnull;     } else {         LocalDateTime localDateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(date.getTime()), ZoneId.systemDefault());         LocalDateTime endOfDay = localDateTime.with(LocalTime.MAX);         return Date.from(endOfDay.atZone(ZoneId.systemDefault()).toInstant());     } }

使用java.time改造后

public static LocalDateTime getStartTimeOfDay(LocalDateTime date) {     if (date == null) {         returnnull;     } else {         // 獲取一天的開始時間,即00:00         return date.toLocalDate().atStartOfDay();     } } public static LocalDateTime getEndTimeOfDay(LocalDateTime date) {     if (date == null) {         returnnull;     } else {         // 獲取一天的結(jié)束時間,即23:59:59.999999999         return date.toLocalDate().atTime(LocalTime.MAX);     } }

e. betweenStartAndEnd

原來的方式

public static Boolean betweenStartAndEnd(Date nowTime, Date beginTime, Date endTime) {     Calendar date = Calendar.getInstance();     date.setTime(nowTime);     Calendar begin = Calendar.getInstance();     begin.setTime(beginTime);     Calendar end = Calendar.getInstance();     end.setTime(endTime);     return date.after(begin) && date.before(end); }

使用java.time改造后

public static Boolean betweenStartAndEnd(Instant nowTime, Instant beginTime, Instant endTime) {     return nowTime.isAfter(beginTime) && nowTime.isBefore(endTime); }

我這里就只列了一些,如果有缺失的可以自己補充,不會寫的話直接問問ChatGPT,它最會干這事了。最后把這些修改后的方法替換一下就行了。

四、小結(jié)一下

這個改造難度不高,但是復(fù)雜度非常高,一個地方?jīng)]改好,輕則接口報錯,重則啟動失敗,非常耗費精力,真不想改。

JDK8以上版本建議直接使用LocalDate和LocalDateTime。


Java精選面試題 (微信小程序):5000+道面試題和選擇題,包含Java基礎(chǔ)、MQ、Redis、SpringBoot、Elasticsearch、Docker、K8s、Flink、Spark、架構(gòu)設(shè)計、大廠真題等,在線隨時刷題!
來源:https://www.cnblogs.com/wlovet/p/18058514

公眾號“Java精選”所發(fā)表內(nèi)容注明來源的,版權(quán)歸原出處所有(無法查證版權(quán)的或者未注明出處的均來自網(wǎng)絡(luò),系轉(zhuǎn)載,轉(zhuǎn)載的目的在于傳遞更多信息,版權(quán)屬于原作者。如有侵權(quán),請聯(lián)系,筆者會第一時間刪除處理!

最近有很多人問,有沒有讀者或者摸魚交流群!加入方式很簡單,公眾號Java精選,回復(fù)“加群”,即可入群!

文章有幫助的話,點在看,轉(zhuǎn)發(fā)吧!

特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺“網(wǎng)易號”用戶上傳并發(fā)布,本平臺僅提供信息存儲服務(wù)。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相關(guān)推薦
熱點推薦
被曝生下畸形兒傳聞僅1月,闞清子官宣喜訊,連發(fā)三文表明態(tài)度

被曝生下畸形兒傳聞僅1月,闞清子官宣喜訊,連發(fā)三文表明態(tài)度

一口娛樂
2026-01-29 09:31:09
已確認(rèn),浙江有大到暴雪!今晚變天

已確認(rèn),浙江有大到暴雪!今晚變天

魯中晨報
2026-01-29 13:39:09
不敢置信!女子十二樂坊成員直播養(yǎng)不活自己,一晚上打賞不到3000

不敢置信!女子十二樂坊成員直播養(yǎng)不活自己,一晚上打賞不到3000

云中浮生
2026-01-24 21:37:46
奇葩!35歲女子4年不回家,母親來探望卻被懟,女子:就當(dāng)我死了

奇葩!35歲女子4年不回家,母親來探望卻被懟,女子:就當(dāng)我死了

娛樂帝皇丸
2026-01-28 15:18:51
16歲武漢男生凌晨離家,失聯(lián)超70小時, 父親:未帶手機現(xiàn)金,最后出現(xiàn)在橋上不見蹤跡

16歲武漢男生凌晨離家,失聯(lián)超70小時, 父親:未帶手機現(xiàn)金,最后出現(xiàn)在橋上不見蹤跡

大風(fēng)新聞
2026-01-29 13:53:22
人民日報怒批!炫富、偷稅749萬、跑國外,現(xiàn)又來“割內(nèi)地韭菜”

人民日報怒批!炫富、偷稅749萬、跑國外,現(xiàn)又來“割內(nèi)地韭菜”

小熊侃史
2026-01-18 07:20:09
港股地產(chǎn)股大漲,融創(chuàng)中國漲超30%

港股地產(chǎn)股大漲,融創(chuàng)中國漲超30%

每日經(jīng)濟新聞
2026-01-29 11:39:06
外交部:繼續(xù)深化國際執(zhí)法合作 加大力度打擊網(wǎng)賭電詐

外交部:繼續(xù)深化國際執(zhí)法合作 加大力度打擊網(wǎng)賭電詐

財聯(lián)社
2026-01-29 15:26:24
尼帕病毒來勢洶洶,建議:每家最好備6樣?xùn)|西,關(guān)鍵時刻能救命呢

尼帕病毒來勢洶洶,建議:每家最好備6樣?xùn)|西,關(guān)鍵時刻能救命呢

現(xiàn)代小青青慕慕
2026-01-28 08:59:53
阿富汗的鍋,拜登不背!

阿富汗的鍋,拜登不背!

山河路口
2026-01-28 23:12:39
心理學(xué)上有一個詞叫:梅拉賓法則(搞好人際關(guān)系最好的辦法)

心理學(xué)上有一個詞叫:梅拉賓法則(搞好人際關(guān)系最好的辦法)

經(jīng)濟觀察報
2025-09-01 10:06:25
1971年,劉思齊蒙冤入獄后向毛主席求助,毛澤東作出:娃娃們無罪

1971年,劉思齊蒙冤入獄后向毛主席求助,毛澤東作出:娃娃們無罪

史海孤雁
2026-01-27 18:02:17
瞞不住了!美媒:美軍高官已進(jìn)臺島指揮導(dǎo)彈戰(zhàn),戰(zhàn)時先炸福建沿海

瞞不住了!美媒:美軍高官已進(jìn)臺島指揮導(dǎo)彈戰(zhàn),戰(zhàn)時先炸福建沿海

史智文道
2026-01-29 16:14:14
要打就打痛!中國手段已升級,日本:中方不批準(zhǔn)駐重慶總領(lǐng)事任命

要打就打痛!中國手段已升級,日本:中方不批準(zhǔn)駐重慶總領(lǐng)事任命

通文知史
2026-01-28 14:30:03
太頂了!明明什么都沒露,卻性感得要命!

太頂了!明明什么都沒露,卻性感得要命!

貴圈真亂
2025-12-20 12:02:06
最新傷勢情況曝光,德約科維奇直言:對辛納絕不舉白旗

最新傷勢情況曝光,德約科維奇直言:對辛納絕不舉白旗

體育妞世界
2026-01-29 12:38:11
起風(fēng)了!加拿大已改口,禁止與中國簽協(xié)定,65萬噸油菜籽白買了?

起風(fēng)了!加拿大已改口,禁止與中國簽協(xié)定,65萬噸油菜籽白買了?

墨印齋
2026-01-29 11:47:54
加快男性衰老的因素:喝酒僅第5,排在第1的,很多男性還沒發(fā)現(xiàn)!

加快男性衰老的因素:喝酒僅第5,排在第1的,很多男性還沒發(fā)現(xiàn)!

醫(yī)學(xué)科普匯
2026-01-27 10:41:31
中國人一年少買了10萬輛進(jìn)口寶馬

中國人一年少買了10萬輛進(jìn)口寶馬

第一財經(jīng)資訊
2026-01-29 10:34:13
1973年,毛主席問楊振寧:萬壽無疆科學(xué)嗎?楊振寧的回答,讓主席笑了

1973年,毛主席問楊振寧:萬壽無疆科學(xué)嗎?楊振寧的回答,讓主席笑了

寄史言志
2026-01-24 17:53:13
2026-01-29 17:15:00
Java精選
Java精選
一場永遠(yuǎn)也演不完的戲
1768文章數(shù) 3859關(guān)注度
往期回顧 全部

科技要聞

周亞輝的AI新賭局:國內(nèi)太卷 出海另起爐灶

頭條要聞

女大學(xué)生到東北游玩暈倒雪地凍傷 三根手指或面臨截肢

頭條要聞

女大學(xué)生到東北游玩暈倒雪地凍傷 三根手指或面臨截肢

體育要聞

詹姆斯哭了!騎士視頻致敬41歲超巨

娛樂要聞

張譯不再隱瞞!公開回應(yīng)退圈息影真相

財經(jīng)要聞

崔東樹:中國汽車未來年銷或達(dá)5000萬輛

汽車要聞

車長超5米還帶后輪轉(zhuǎn)向 比亞迪海豹08/海獅08將亮相

態(tài)度原創(chuàng)

時尚
藝術(shù)
房產(chǎn)
公開課
軍事航空

冬天大衣怎么穿才更好看?選好顏色、找對單品,高級簡約又大氣

藝術(shù)要聞

梵高全集(高清350張)震撼……

房產(chǎn)要聞

萬科難眠夜:前董事長郁亮失聯(lián),三筆債券靠深鐵才通過展期

公開課

李玫瑾:為什么性格比能力更重要?

軍事要聞

中國代表:支持伊朗國家穩(wěn)定 武力解決不了問題

無障礙瀏覽 進(jìn)入關(guān)懷版