日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

什么?你项目还在用Date表示时间?!

發布時間:2025/3/16 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 什么?你项目还在用Date表示时间?! 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


?為啥會有這篇文章?

最近接手了一個別人的老項目,拿到代碼,導入IDEA的那一瞬間,我哭出了聲 . . .

我瞥了一眼代碼,就知道這次肯定遇到了屎山!因為我看到了這種代碼:

我擦,這都什么年代了,怎么還在用 Date來處理和表示時間!

完了完了 . . .


?為啥Date遭嫌棄了?

別的先不說,我們先來看幾個關于 Date用法的例子,這玩意真的好用嗎?

一、我想新建一個表示"此刻"的日期,打印出來:

Date rightNow = new Date(); System.out.println( "當前時刻:" + rightNow ); System.out.println( "當前年份:" + rightNow.getYear() ); System.out.println( "當前月份:" + rightNow.getMonth() ); 輸出結果為: // 當前時刻:Fri Dec 13 21:46:34 CST 2019 // 當前年份:119 // 當前月份:11
  • 第一行:這打印結果你第一眼能看明白?可讀性忒差了

  • 第二行:今天是2019年,你給我返回個119,沒法讀

  • 第三行:現在是12月份,你給我返回個11,這也沒法讀

二、假如我再想構造一個指定年、月、日的時間,我嘗試這么去做:

Date beforeDate = new Date(2019,12,12);

你看到啥了,連構造函數都被棄用了!

你可以再仔細瞅瞅,其實 Date里的很多方法現在都已經棄用了!

都這樣了,你項目還敢用這個嗎?你醒醒吧!


?LocalDateTime不香嗎??

自 Java8開始, JDK中其實就增加了一系列表示日期和時間的新類,最典型的就是 LocalDateTime。直言不諱,這玩意的出現就是為了干掉之前 JDK版本中的 Date老哥!

同樣,我們也先來感受一下用法!

一、獲取當前此刻的時間

LocalDateTime rightNow = LocalDateTime.now(); System.out.println( "當前時刻:" + rightNow ); System.out.println( "當前年份:" + rightNow.getYear() ); System.out.println( "當前月份:" + rightNow.getMonth() ); System.out.println( "當前日份:" + rightNow.getDayOfMonth() ); System.out.println( "當前時:" + rightNow.getHour() ); System.out.println( "當前分:" + rightNow.getMinute() ); System.out.println( "當前秒:" + rightNow.getSecond() ); // 輸出結果: 當前時刻:2019-12-13T22:05:26.779 當前年份:2019 當前月份:DECEMBER 當前日份:13 當前時:22 當前分:5 當前秒:26

干得漂亮!

二、構造一個指定年、月、日的時間:

比如,想構造:2019年10月12月12日9時21分32秒

LocalDateTime beforeDate = LocalDateTime.of(2019, Month.DECEMBER, 12, 9, 21, 32);

沒毛病!

三、修改日期

LocalDateTime rightNow = LocalDateTime.now(); rightNow = rightNow.minusYears( 2 ); // 減少 2 年 rightNow = rightNow.plusMonths( 3 ); // 增加 3 個月 rightNow = rightNow.withYear( 2008 ); // 直接修改年份到2008年 rightNow = rightNow.withHour( 13 ); // 直接修改小時到13時

夠靈活!

四、格式化日期

LocalDateTime rightNow = LocalDateTime.now(); String result1 = rightNow.format( DateTimeFormatter.ISO_DATE ); String result2 = rightNow.format( DateTimeFormatter.BASIC_ISO_DATE ); String result3 = rightNow.format( DateTimeFormatter.ofPattern("yyyy/MM/dd") ); System.out.println("格式化后的日期(基本樣式一舉例):" + result1); System.out.println("格式化后的日期(基本樣式二舉例):" + result2); System.out.println("格式化后的日期(自定義樣式舉例):" + result3); // 輸出結果: 格式化后的日期(基本樣式一舉例):2019-12-13 格式化后的日期(基本樣式二舉例):20191213 格式化后的日期(自定義樣式舉例):2019/12/13

我無話可說,漂亮

五、時間反解析

給你一個陌生的字符串,你可以按照你需要的格式把時間給反解出來

LocalDateTime time = LocalDateTime.parse("2002--01--02 11:21",DateTimeFormatter.ofPattern("yyyy--MM--dd HH:mm")); System.out.println("字符串反解析后的時間為:" + time); // 輸出: 字符串反解析后的時間為:2002-01-02T11:21

tql!

零零散散舉了這么些例子,我想 LocalDateTime怎么地也不輸 Date吧!


?線程安全性問題!?

其實上面講來講去只講了兩者在用法上的差別,這其實倒還好,并不致命,可是接下來要討論的線程安全性問題才是致命的!

其實以前我們慣用的 Date時間類是可變類,這就意味著在多線程環境下對共享 Date變量進行操作時,必須由程序員自己來保證線程安全!否則極有可能翻車。

而自 Java8開始推出的 LocalDateTime卻是線程安全的,開發人員不用再考慮并發問題,這點我們從 LocalDateTime的官方源碼中即可看出:

不說別的,就光一句:

This class is immutable and thread-safe. (不可變、線程安全!)

你就沒有任何理由不用 LocalDateTime!


?日期格式化的選擇?

大家除了慣用 Date來表示時間之外,還有一個用于和 Date連用的 SimpleDateFormat 時間格式化類大家可能也戒不掉了!

SimpleDateFormat最主要的致命問題也是在于它本身并不線程安全,這在它的源碼注釋里已然告知過了:

那取而代之,我們現在改用什么呢?其實在前文已經用到啦,那就是了 DateTimeFormatter了,他也是線程安全的:


?小聲BB?

好了,說了這么多,如果你項目里還在使用 Date或者 SimpleDateFormat的話,答應我,二話別說,趕快全部偷偷去改掉,快!速度!跑步前進!

有道無術,術可成;有術無道,止于術

歡迎大家關注Java之道公眾號

好文章,我在看??

總結

以上是生活随笔為你收集整理的什么?你项目还在用Date表示时间?!的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。