什么?你项目还在用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:21tql!
零零散散舉了這么些例子,我想 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表示时间?!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 线上一次fullgc搞得鸡飞狗跳后,我总
- 下一篇: 50道Java集合经典面试题