AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當前位置:首頁 > 科技  > 軟件

為何應拋棄Date:探索更優的日期處理方案

來源: 責編: 時間:2024-04-08 09:03:08 189觀看
導讀java.util.Date(Date從現在開始)是一個糟糕的類型,這解釋了為什么它的大部分內容在 Java 1.1 中被棄用(但不幸的是仍在使用)。設計缺陷包括:它的名稱具有誤導性: 它并不代表一個日期,而是代表時間的一個瞬間。所以它應該被稱

java.util.Date(Date從現在開始)是一個糟糕的類型,這解釋了為什么它的大部分內容在 Java 1.1 中被棄用(但不幸的是仍在使用)。ocq28資訊網——每日最新資訊28at.com

設計缺陷包括:ocq28資訊網——每日最新資訊28at.com

  • 它的名稱具有誤導性: 它并不代表一個日期,而是代表時間的一個瞬間。所以它應該被稱為Instant——正如它的java.time等價物一樣。
  • 它是非最終的: 這鼓勵了對繼承的不良使用,例如java.sql.Date(這意味著代表一個日期,并且由于具有相同的短名稱而也令人困惑)
  • 它是可變的: 日期/時間類型是自然值,可以通過不可變類型有效地建模。可變的事實Date(例如通過setTime方法)意味著勤奮的開發人員最終會在各處創建防御性副本。
  • 它在許多地方(包括)隱式使用系統本地時區,toString()這讓許多開發人員感到困惑。
  • 它的月份編號是從 0 開始的,是從 C 語言復制的。這導致了很多很多相差一樣的錯誤。
  • 它的年份編號是基于 1900 年的,也是從 C 語言復制的。當然,當 Java 出現時,我們已經意識到這不利于可讀性?
  • 它的方法命名不明確: getDate()返回月份中的某一天,并getDay()返回星期幾。給這些更具描述性的名字有多難?
  • 對于是否支持閏秒含糊其辭: “秒由 0 到 61 之間的整數表示;值 60 和 61 僅在閏秒時出現,即使如此,也僅在實際正確跟蹤閏秒的 Java 實現中出現” 我強烈懷疑大多數開發人員,認為 for 的范圍getSeconds()實際上在 0-59 范圍內(含)。
  • 它的寬容沒有明顯的理由: “在所有情況下,為這些目的而對方法給出的論據不必落在指定的范圍內; 例如,日期可以指定為 1 月 32 日,并被解釋為 2 月 1 日。” 多久有用一次?

關鍵原因如下:ocq28資訊網——每日最新資訊28at.com

圖片圖片ocq28資訊網——每日最新資訊28at.com

解決思路:避免使用java.util.Date與java.sql.Date類和其提供的API,考慮使用java.time.Instant類或java.time.LocalDateTime類及其提供的API替代。ocq28資訊網——每日最新資訊28at.com

怎么改?

只能說這種基礎的類改起來牽一發動全身,需要從DO實體類看起,然后就是各種Converter,最后是DTO。ocq28資訊網——每日最新資訊28at.com

由于我們還是微服務架構,業務服務依賴于基礎服務的API,所以必須要一起改否則就會報錯。這里就不細說修改流程了,主要說一下我們在改造的時候遇到的一些問題。ocq28資訊網——每日最新資訊28at.com

1. 耐心比對數據庫日期字段和DO的映射

1)確定字段類型

首先你需要確定數據對象中的 Date 字段代表的是日期、時間還是時間戳。ocq28資訊網——每日最新資訊28at.com

  • 如果字段代表日期和時間,則可能需要使用 LocalDateTime。
  • 如果字段僅代表日期,則可能需要使用 LocalDate。
  • 如果字段僅代表時間,則可能需要使用 LocalTime。
  • 如果字段需要保存時間戳(帶時區的),則可能需要使用 Instant 或 ZonedDateTime。
2)更新數據對象類

更新數據對象類中的字段,把 Date 類型改為適當的 java.time 類型。ocq28資訊網——每日最新資訊28at.com

2. 將DateUtil中的方法改造

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

原來的方式:ocq28資訊網——每日最新資訊28at.com

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

使用 java.time 改造后:ocq28資訊網——每日最新資訊28at.com

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

一些注意點:ocq28資訊網——每日最新資訊28at.com

  • Instant 表示的是一個時間點,它與時區無關的,相當于舊的 Date 類。它通常用于表示時間戳。
  • LocalDateTime 表示沒有時區信息的日期和時間,它不能直接轉換為時間戳,除非你將其與時區結合使用(例如通過 ZonedDateTime)。
  • ZonedDateTime 包含時區信息的日期和時間,它更類似于 Calendar,因為 Calendar 也包含時區信息。
  • 當你需要將 java.time 對象轉換回 java.util.Date 對象時,可以使用 Date.from(Instant) 方法。這在你的代碼需要與舊的API或庫交互時非常有用。
2)一些基礎的方法改造

a. dateFormatocq28資訊網——每日最新資訊28at.com

原來的方式ocq28資訊網——每日最新資訊28at.com

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

使用java.time改造后ocq28資訊網——每日最新資訊28at.com

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

b. addSecond、addMinute、addHour、addDay、addMonth、addYearocq28資訊網——每日最新資訊28at.com

原來的方式ocq28資訊網——每日最新資訊28at.com

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改造后ocq28資訊網——每日最新資訊28at.com

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. dateToWeekocq28資訊網——每日最新資訊28at.com

原來的方式ocq28資訊網——每日最新資訊28at.com

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改造后ocq28資訊網——每日最新資訊28at.com

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];}

d. getStartOfDay和getEndOfDayocq28資訊網——每日最新資訊28at.com

原來的方式ocq28資訊網——每日最新資訊28at.com

public static Date getStartTimeOfDay(Date date) {    if (date == null) {        return null;    } 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) {        return null;    } 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改造后ocq28資訊網——每日最新資訊28at.com

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

e. betweenStartAndEndocq28資訊網——每日最新資訊28at.com

原來的方式ocq28資訊網——每日最新資訊28at.com

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改造后ocq28資訊網——每日最新資訊28at.com

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

我這里就只列了一些,如果有缺失的可以自己補充,不會寫的話直接問問ChatGPT,它最會干這事了。最后把這些修改后的方法替換一下就行了。ocq28資訊網——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-81878-0.html為何應拋棄Date:探索更優的日期處理方案

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 從JDK8到JDK14:阿里巴巴面試題探索Java的演進之路!

下一篇: 從MVC到DDD:探尋軟件架構的本質變遷

標簽:
  • 熱門焦點
  • MIX Fold3包裝盒泄露 新機本月登場

    小米的全新折疊屏旗艦MIX Fold3將于本月發布,近日該機的真機包裝盒在網上泄露。從圖上來看,新的MIX Fold3包裝盒在外觀設計方面延續了之前的方案,變化不大,這也是目前小米旗艦
  • 官方承諾:K60至尊版將會首批升級MIUI 15

    全新的MIUI 15今天也有了消息,在官宣了K60至尊版將會搭載天璣9200+處理器和獨顯芯片X7的同時,Redmi給出了官方承諾,K60至尊重大更新首批升級,會首批推送MIUI 15。也就是說雖然
  • 轎車從天而降電動車主被撞身亡 超速搶道所致:現場視頻讓網友吵翻

    近日,上海青浦區法院判決轎車從天而降電動車主被撞身亡案,轎車車主被判有期徒刑一年。案件顯示當時男子駕駛轎車在上海某路段行駛,前車忽然轉彎提速超車,
  • 讓我們一起聊聊文件的操作

    文件【1】文件是什么?文件是保存數據的地方,是數據源的一種,比如大家經常使用的word文檔、txt文件、excel文件、jpg文件...都是文件。文件最主要的作用就是保存數據,它既可以保
  • 如何通過Python線程池實現異步編程?

    線程池的概念和基本原理線程池是一種并發處理機制,它可以在程序啟動時創建一組線程,并將它們置于等待任務的狀態。當任務到達時,線程池中的某個線程會被喚醒并執行任務,執行完任
  • 大廠卷向扁平化

    來源:新熵作者丨南枝 編輯丨月見大廠職級不香了。俗話說,兵無常勢,水無常形,互聯網企業調整職級體系并不稀奇。7月13日,淘寶天貓集團啟動了近年來最大的人力制度改革,目前已形成一
  • 小米汽車電池信息疑似曝光:容量101kWh,支持800V高壓快充

    7月14日消息,今日一名博主在社交媒體發布了一張疑似小米汽車電池信息的照片,顯示該電池包正是寧德時代麒麟電池,容量為101kWh,電壓為726.7V,可以預測小
  • iQOO Neo8 Pro即將開售:到手價3099元起 安卓性能最強旗艦

    5月23日,iQOO如期舉行了新品發布會,全新的iQOO Neo8系列也正式與大家見面,包含iQOO Neo8和iQOO Neo8 Pro兩個版本,其中標準版搭載高通驍龍8+,而Pro版更
  • 2299元起!iQOO Pad開啟預售:性能最強天璣平板

    5月23日,iQOO如期舉行了新品發布會,除了首發安卓最強旗艦處理器的iQOO Neo8系列新機外,還在發布會上推出了旗下首款平板電腦——iQOO Pad,其搭載了天璣
Top