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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

Java8的产品周期_java8的时间和`Date`的对比

發(fā)布時(shí)間:2025/3/12 java 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java8的产品周期_java8的时间和`Date`的对比 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

java8提供了新的時(shí)間接口。相對(duì)Date,Calendar,個(gè)人感覺最大的好處是對(duì)時(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(感覺在說(shuō)廢話)?這三個(gè)的用法基本上一樣,通過(guò)方法名就知道用法那種

1.1 獲取當(dāng)前時(shí)間的對(duì)象

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)對(duì)入?yún)⒌臋z測(cè)判斷,而不是通過(guò)捕獲異常去處理入?yún)⒌腻e(cuò)誤。(類似NumberFormatException)

1.3 LocalDate比Date更強(qiáng)的初始化時(shí)間

Date 設(shè)置某個(gè)日期,基本上3個(gè)方式,時(shí)間戳/Calendar/字符串解析。相對(duì)的LocalDate就簡(jiǎn)單了很多

LocalDate.of(2019,1,12);

其他的也一樣

1.4 時(shí)間戳的轉(zhuǎn)換

時(shí)間戳和時(shí)區(qū)關(guān)系的參考 時(shí)間轉(zhuǎn)換代碼參考

在這里時(shí)間戳的轉(zhuǎn)換不如Date直接。主要因?yàn)長(zhǎng)ocalDate本身是沒有時(shí)區(qū)的。

####LocalDateTime轉(zhuǎn)時(shí)間戳

關(guān)于時(shí)區(qū)的計(jì)算也很簡(jiǎn)單,就是相差幾個(gè)小時(shí)就加上多少秒

1.5 和Date互轉(zhuǎn)

Instant 和 LocalDate或LocalDateTime 就不贅述了…

代碼來(lái)自 Java 日期時(shí)間傳統(tǒng)互操作性

1.6 更好的理解和操作方式

Date、Calendar的操作,例如設(shè)置月份,day of week 都有些讓人迷惑,例如1月的定義是0,周一是0。1號(hào)好像也是0吧(我真沒咋用過(guò)這東西,現(xiàn)用現(xiàn)百度…

LocalDate感覺好多了。例如DayOfWeek是枚舉類型。使用枚舉就不會(huì)理解錯(cuò)了吧

很多日期和時(shí)間操作,無(wú)非就是加減時(shí)間和比較. 使用‘加’的示例:

不用再去使用一個(gè)不熟悉的Calendar去操作了(Calendar提供的接口都是啥玩意,get,set的)

2. 線程安全性比較

LocalDate…系列是線程安全的 額..每一個(gè)字段都用了final關(guān)鍵字了,都變不了… 所以進(jìn)行操作后都是返回新的copy對(duì)象

至于說(shuō)Date線程不安全,get,set的肯定在多線程的時(shí)候容易出現(xiàn)問題,不過(guò)set方法已經(jīng)都@Deprecated廢棄了。當(dāng)然不是因?yàn)榫€程安全問題廢棄的,是因?yàn)橛辛烁玫奶娲?/p>

Calendar.set(Calendar.DAY_OF_MONTH, int date)

不過(guò)感覺還是不如這個(gè)更清晰明了

LocalDate.of(2019,1,12);

2.1 SimpleDateFormat的線程安全性

參考:深入理解Java:SimpleDateFormat安全的時(shí)間格式化

在一定負(fù)載情況下,SimpleDateFormat會(huì)出問題的。簡(jiǎn)單測(cè)試一下

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é)果

測(cè)試過(guò)程中,SimpleDateFormat 1000個(gè)線程里,有5次,時(shí)間解析錯(cuò)了,5次異常了(時(shí)間錯(cuò)了,比拋出異常還可怕) DateTimeFormatter只是對(duì)比參考一下,未出現(xiàn)異常(人家已經(jīng)聲明是線程安全了…) 當(dāng)然SimpleDateFormat線程不安全應(yīng)該人盡皆知的,但依然有不安全的使用,但每次使用都new一個(gè)實(shí)例,當(dāng)負(fù)載大的時(shí)候也不好。所以一個(gè)線程一個(gè)SimpleDateFormat實(shí)例應(yīng)該可以的。

最后

java8 對(duì)時(shí)間操作的類還有很多 到j(luò)ava.time包下去看看,以后總會(huì)用得到的地方。

總結(jié)

以上是生活随笔為你收集整理的Java8的产品周期_java8的时间和`Date`的对比的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。