成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

開發 前端
只能說這種基礎的類改起來牽一發動全身,需要從DO實體類看起,然后就是各種Converter,最后是DTO。由于我們還是微服務架構,業務服務依賴于基礎服務的API,所以必須要一起改否則就會報錯。這里就不細說修改流程了,主要說一下我們在改造的時候遇到的一些問題。

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

設計缺陷包括:

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

關鍵原因如下:

圖片圖片

為啥要改?

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

圖片圖片

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

怎么改?

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

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

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

1)確定字段類型

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

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

更新數據對象類中的字段,把 Date 類型改為適當的 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();

// 如果你需要和特定的時區交互,可以使用ZonedDateTime
ZonedDateTime nowZonedDateTime = ZonedDateTime.now();

// 如果你需要轉換回java.util.Date,你可以這樣做(假設你的代碼其他部分還需要使用Date)
Date nowFromDateInstant = Date.from(nowInstant);

// 如果需要與java.sql.Timestamp交互
java.sql.Timestamp nowFromInstant = java.sql.Timestamp.from(nowInstant);

一些注意點:

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

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

d. getStartOfDay和getEndOfDay

原來的方式

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改造后

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. 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,它最會干這事了。最后把這些修改后的方法替換一下就行了。

責任編輯:武曉燕 來源: 一安未來
相關推薦

2025-04-03 09:27:35

JavaScript開發IIFE

2021-11-25 13:12:12

Mobileye英特爾寶馬

2025-04-29 08:05:00

JavaScript錯誤處理開發

2025-04-08 05:55:00

CSS布局Grid

2024-06-25 08:26:51

高效日期計算安全

2013-09-23 09:34:14

iOS 7圖形界面

2021-06-25 15:53:25

Kubernetes程序技巧

2021-12-29 17:24:16

Kubernetes集群事件

2017-06-02 10:25:26

Java異常處理

2015-10-20 09:36:52

蘋果iOS 9字體

2014-03-18 11:10:52

電商轉型零售商

2024-11-21 17:35:10

2025-05-12 08:05:00

Ajaxfetch APIWeb

2016-10-08 18:02:21

SQL Server安裝設置與實踐

2009-11-17 11:14:14

PHP日期函數

2014-05-04 10:53:59

臺階步數算法分析

2025-03-25 09:53:02

2018-01-02 16:39:04

2025-05-16 08:22:57

2011-02-28 14:08:31

網速變慢局域網網速
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲精品久久久久中文字幕欢迎你 | 亚洲视频一区在线观看 | 国产最好的av国产大片 | 亚洲精品黄色 | 国产精品久久一区二区三区 | 中文字幕视频在线 | 高清人人天天夜夜曰狠狠狠狠 | 色婷婷综合久久久中字幕精品久久 | 男人的天堂avav | 久久久精品一区 | 欧美精品一二三 | 国产在线观看一区二区 | 日韩在线 | 日韩一区精品 | 亚洲韩国精品 | 中文字字幕一区二区三区四区五区 | 国产a区| 午夜丰满寂寞少妇精品 | 亚洲电影免费 | 99久久精品免费看国产小宝寻花 | 成人在线观看免费视频 | 精品中文字幕久久 | 在线精品一区二区 | 欧美视频在线播放 | www.婷婷| 亚洲午夜小视频 | 91亚洲国产成人久久精品网站 | 99r在线 | 国内自拍偷拍视频 | 中文字幕一区二区三区不卡 | 久久精品视频免费看 | 成人久久久 | 欧美一级免费片 | 特级做a爱片免费69 精品国产鲁一鲁一区二区张丽 | 国产三级精品视频 | 新疆少妇videos高潮 | 国产精品99久久久久久宅男 | 国产一区二区免费电影 | 国产精品无码专区在线观看 | 中文字幕精品一区二区三区在线 | 亚洲精品一区二区三区在线 |