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