實體類不要再用Date了,JDK8有新的時間
阿粉今天想介紹的,就是我們再實體類中,很多時候會用到時間這個概念,比如說,記錄的創(chuàng)建時間Create_Time或者說是某些需要確定的日期,在數(shù)據(jù)庫存儲的時候,毋庸置疑,肯定是 datetime和date的數(shù)據(jù)類型,但是也有個別的比較過分,直接是用字符串,也就是varchar來進(jìn)行存儲,而我們在之前使用JDK7創(chuàng)建時間的時候,很多時候都選擇的時比較老版本的 Date、Calendar 以及 SimpleDateFormatter 等等。
不過 java.util.Date 也是被詬病已久,它包含了日期、時間、毫秒數(shù)等眾多繁雜的信息,其內(nèi)部利用午夜 12 點來區(qū)分日期,利用 1970-01-01 來計算時間;并且其月份從 0 開始計數(shù),而且用于獲得年、月、日等信息的接口也是太不直觀。
除此之外,java.util.Date與 SimpleDateFormatter 都不是類型安全的,
而我們接下來要使用的,就是 JDK8 中的日期,用來替換掉之前使用的。
JDK7 的日期 和 JDK8 的日期對比
JDK7 創(chuàng)建一個時間:
Date date0 = new Date();
JDK8 創(chuàng)建一個時間:
LocalDate today = LocalDate.now();
我們先看看這執(zhí)行出來都是啥?
Date輸出:
Wed Apr 13 13:19:06 CST 2022
LocalDate輸出:
2022-04-13
首先我們從輸出上,直接就感覺有點難受,Date輸出的看起來就不是那么的直觀,所以,當(dāng)你想要直觀的去輸出這個時間的時候,可能就得用到 SimpleDateFormat 去格式化一下我們的這個時間。但是如果是用 LocalDate 就不會有這種顧慮了。
Date格式化:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH時mm分ss秒");
String str = sdf.format(date0);
我們執(zhí)行一下在看:
JDK7格式化后的時間數(shù)據(jù)==2022-04-13
JDK8的時間數(shù)據(jù)==2022-04-13
首先,從代碼上,就直接少了很多,畢竟轉(zhuǎn)換時間相對來說是非常簡單的。
這時候就有人得噴阿粉,說如果我不想要這樣的數(shù)據(jù),那么我再JDK8 里面我怎么去轉(zhuǎn)換這個時間呢?
我 JDK7 可以用 SimpleDateFormat,但是這個類并不支持我用 LocalDate 呀,別著急呀。既然人家敢出這個,那么肯定也得想到對應(yīng)的方案。
JDK1.7及之前版本我們使用java.text.DataFormat 的子類(如SimpleDateFormat類)進(jìn)行日期時間的格式化。
JDK1.8之后我們可以使用 java.time.format.DateTimeFormatter來進(jìn)行日期時間的格式化。
LocalDate now = LocalDate.now();
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");
String JDK8Time = now.format(dateTimeFormatter);
System.out.println("JDK8格式化后的時間數(shù)據(jù)=="+JDK8Time);
我們看一下輸出結(jié)果:
JDK7格式化后的時間數(shù)據(jù)==2022/04/13
JDK8格式化后的時間數(shù)據(jù)==2022/04/13
這屬實沒毛病是吧,但是,眾所周知,SimpleDateFormat 是個線程不安全的,使用的時候,只能在方法內(nèi)部創(chuàng)建新的局部變量。
而 DateTimeFormatter 不但是不變對象,它還是線程安全的。所以 DateTimeFormatter 可以只創(chuàng)建一個實例,到處引用。
這就是阿粉推薦大家換一下的原因,因為字符串轉(zhuǎn)換時間的例子,用的地方實在是非常的多,我們在完成功能的同時,也需要盡量的保證自己代碼的安全。
我們既然已經(jīng)對比完成了,接下來就直接講一下 JDK8 中的各種時間的用法。畢竟沒有實戰(zhàn)的空說,都是讓人難以記憶的。
JDK8 日期的各種用法
String 轉(zhuǎn) LocalDate:
LocalDate localDate = LocalDate.now();
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd");
String dateStr = localDate.format(fmt);
System.out.println("LocalDate轉(zhuǎn)String:" + dateStr);
轉(zhuǎn)換結(jié)果:
LocalDate轉(zhuǎn)String:2022/04/14
data轉(zhuǎn)LocalDate:
Date date = new Date();
System.out.println("LocalDateTime():" + (new Date()).toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime());
轉(zhuǎn)換結(jié)果:
LocalDateTime():2022-04-14T10:07:52.868
時間戳轉(zhuǎn)LocalDateTime:
long timestamp = System.currentTimeMillis();
Instant instant1 = Instant.ofEpochMilli(timestamp);
System.out.println("時間戳 轉(zhuǎn) LocalDateTime:" + LocalDateTime.ofInstant(instant1, ZoneId.systemDefault()));
轉(zhuǎn)換結(jié)果:
時間戳 轉(zhuǎn) LocalDateTime:2022-04-14T10:09:14.780
具體的API還有很多很多阿粉列舉一下:
以上的API相對來說已經(jīng)是比較全免的,可以滿足日常開發(fā)的需求了,阿粉就不再一一的去測試了,如果是想看看結(jié)果的,大家不妨寫個測試 Demo 去試試吧。