Java8的产品周期_java8的时间和`Date`的对比
java8提供了新的時(shí)間接口。相對Date,Calendar,個(gè)人感覺最大的好處是對時(shí)間操作的學(xué)習(xí)成本很低,比Calendar低。
1. LocalDate,LocalTime,LocalDateTime
LocalDate 代表日期,LocalTime表示時(shí)刻,類似11:23這樣的時(shí)刻。 LocalDateTime就是前面2個(gè)的結(jié)合,這個(gè)可以從java.time.LocalDateTime#toString的代碼看出一二:
date,time 在java.time.LocalDateTime中
實(shí)際使用中,計(jì)算日期就用LocalDate,計(jì)算日期加時(shí)刻用LocalDateTime,如果只有時(shí)刻就是LocalTime(感覺在說廢話)?這三個(gè)的用法基本上一樣,通過方法名就知道用法那種
1.1 獲取當(dāng)前時(shí)間的對象
localDateTime相比Date更像是一個(gè)工具類,就是為了時(shí)間操作使用。其構(gòu)造方法是私有的。
1.2 從字符串中解析
字符串 2019-01-11
DateTimeFormatter的包路徑是java.time.format和LocalDate一樣在java.time下面,而SimpleDateFormat和Date是不同的。所以當(dāng)判斷引入路徑的時(shí)候更容易判斷。 當(dāng)解析失敗的時(shí)候,兩個(gè)異常的拋出不一樣,DateTimeFormatter拋出的是DateTimeParseException,繼承自RuntimeException,而ParseException明顯繼承的是Exception。
個(gè)人感覺這個(gè)思路是,前者如果拋出異常那就是編程上錯(cuò)誤,而后者則是的程序代碼的不穩(wěn)定性。我更傾向于第一種的異常設(shè)計(jì),應(yīng)該加強(qiáng)對入?yún)⒌臋z測判斷,而不是通過捕獲異常去處理入?yún)⒌腻e(cuò)誤。(類似NumberFormatException)
1.3 LocalDate比Date更強(qiáng)的初始化時(shí)間
Date 設(shè)置某個(gè)日期,基本上3個(gè)方式,時(shí)間戳/Calendar/字符串解析。相對的LocalDate就簡單了很多
LocalDate.of(2019,1,12);
其他的也一樣
1.4 時(shí)間戳的轉(zhuǎn)換
時(shí)間戳和時(shí)區(qū)關(guān)系的參考 時(shí)間轉(zhuǎn)換代碼參考
在這里時(shí)間戳的轉(zhuǎn)換不如Date直接。主要因?yàn)長ocalDate本身是沒有時(shí)區(qū)的。
####LocalDateTime轉(zhuǎn)時(shí)間戳
關(guān)于時(shí)區(qū)的計(jì)算也很簡單,就是相差幾個(gè)小時(shí)就加上多少秒
1.5 和Date互轉(zhuǎn)
Instant 和 LocalDate或LocalDateTime 就不贅述了…
代碼來自 Java 日期時(shí)間傳統(tǒng)互操作性
1.6 更好的理解和操作方式
Date、Calendar的操作,例如設(shè)置月份,day of week 都有些讓人迷惑,例如1月的定義是0,周一是0。1號好像也是0吧(我真沒咋用過這東西,現(xiàn)用現(xiàn)百度…
LocalDate感覺好多了。例如DayOfWeek是枚舉類型。使用枚舉就不會理解錯(cuò)了吧
很多日期和時(shí)間操作,無非就是加減時(shí)間和比較. 使用‘加’的示例:
不用再去使用一個(gè)不熟悉的Calendar去操作了(Calendar提供的接口都是啥玩意,get,set的)
2. 線程安全性比較
LocalDate…系列是線程安全的 額..每一個(gè)字段都用了final關(guān)鍵字了,都變不了… 所以進(jìn)行操作后都是返回新的copy對象
至于說Date線程不安全,get,set的肯定在多線程的時(shí)候容易出現(xiàn)問題,不過set方法已經(jīng)都@Deprecated廢棄了。當(dāng)然不是因?yàn)榫€程安全問題廢棄的,是因?yàn)橛辛烁玫奶娲?/p>
Calendar.set(Calendar.DAY_OF_MONTH, int date)
不過感覺還是不如這個(gè)更清晰明了
LocalDate.of(2019,1,12);
2.1 SimpleDateFormat的線程安全性
參考:深入理解Java:SimpleDateFormat安全的時(shí)間格式化
在一定負(fù)載情況下,SimpleDateFormat會出問題的。簡單測試一下
package open.note;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.concurrent.CountDownLatch;
import java.util.function.Consumer;
public class UnSafeTest {
private static String time = “2019-01-11 11:11:11”;
private static long timestamp = 1547176271000L;
private static LocalDateTime dateTime = LocalDateTime.of(2019,1,11,11,11,11);
private static SimpleDateFormat dateFormat = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”);
private static DateTimeFormatter formatter = DateTimeFormatter.ofPattern(“yyyy-MM-dd HH:mm:ss”);
public static void main(String[] args) {
dateFormatTest((obj)->{
try {
Date date = dateFormat.parse(time);
if (date.getTime() != timestamp){
System.out.println(date);
}
} catch (Exception e) {
System.out.println(e.getMessage());
}
});
System.out.println(“—————“);
dateFormatTest((obj)->{
try {
LocalDateTime dateTime = LocalDateTime.parse(time,formatter);
if (!dateTime.isEqual(UnSafeTest.dateTime)){
System.out.println(dateTime);
}
} catch (Exception e) {
System.out.println(e.getMessage());
}
});
}
private static void dateFormatTest(Consumer runnable){
CountDownLatch countDownLatch = new CountDownLatch(1000);
for (int i = 0; i < 1000; i++) {
new Thread(()->{
runnable.accept(null);
countDownLatch.countDown();
}).start();
}
try {
countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
輸出結(jié)果
測試過程中,SimpleDateFormat 1000個(gè)線程里,有5次,時(shí)間解析錯(cuò)了,5次異常了(時(shí)間錯(cuò)了,比拋出異常還可怕) DateTimeFormatter只是對比參考一下,未出現(xiàn)異常(人家已經(jīng)聲明是線程安全了…) 當(dāng)然SimpleDateFormat線程不安全應(yīng)該人盡皆知的,但依然有不安全的使用,但每次使用都new一個(gè)實(shí)例,當(dāng)負(fù)載大的時(shí)候也不好。所以一個(gè)線程一個(gè)SimpleDateFormat實(shí)例應(yīng)該可以的。
最后
java8 對時(shí)間操作的類還有很多 到j(luò)ava.time包下去看看,以后總會用得到的地方。
總結(jié)
以上是生活随笔為你收集整理的Java8的产品周期_java8的时间和`Date`的对比的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: zstd安装_PHP: 安装 - Man
- 下一篇: 计算机逻辑判断函数函数知识点,计算机考点