日期格式化为yyyymmdd_你还在用SimpleDateFormat格式化时间嘛
生活随笔
收集整理的這篇文章主要介紹了
日期格式化为yyyymmdd_你还在用SimpleDateFormat格式化时间嘛
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Jdk1.8之時間處理
該文章已經同步到Github:https://github.com/stackInk/makerstack1. 傳統時間處理的問題
1.1 多線程環境下的SimpleDateFormat
當多個線程使用同一個時間處理對象進行對日期的格式化的時候,會出現java.lang.NumberFormatException: multiple points。主要原因是由于SimpleDateFormat是線程不安全的,當線程共享的時候,會引發這個異常。
1.1.1 代碼演示
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd"); //線程池中線程共享了SimpleDateFormat,引發線程不安全 Callable<String> callable = () -> simpleDateFormat.parse("20200402").toString();ExecutorService executorService = Executors.newFixedThreadPool(10); List<Future<String>> list = new LinkedList<>();for (int i = 0; i < 10; i++) {Future<String> submit = executorService.submit(callable);list.add(submit); } for (Future<String> stringFuture : list) {String s = stringFuture.get();System.out.println(s); } executorService.shutdown();解決方法:
- 線程不共享變量SimpleDateFormat,每一個線程在進行日期格式化的時候都自己創建一個
- 通過ThreadLocal為每一個線程綁定一個SimpleDateFormate
2. 1.8時間處理
對于時間的處理,均在java.time包及其子包中,且線程安全
- java.time包下存放了進行時間處理的各種類
- Instant獲取本地時間的時間戳
- LocalDate獲取本地時間的日期
- LocalTime獲取本地時間的時間
- LocalDateTime獲取本地時間的日期和時間
- Duration計算兩個日期之間的間隔
- Period計算兩個時間的間隔
- OffsetDateTime對日期和時間進行偏移量計算
- offsetTime對時間進行偏移量計算
- ZoneId各種時區代碼
- ZoneOffset市區偏移量計算
- ZonedDateTime
- java.time.chrono不同地區時間記時方式
- java.time.temporal對時間進行一些調整的包
- java.time.format對時間進行格式化
2.1 LocalDate、LocalTime、LocalDateTime
三者的使用方式完全相同,輸出的結果不同
- now獲取本地時間
- of()傳入指定的日期和時間
- 對時間進行偏移量加計算
- 對事件進行偏移量減運算
- 當前時間與另一個時間的比較
- 將月份天數,年份天數,月份等修改為指定的值,返回一個新的LocalDateTime對象
- get方法
- format(DateTimeFormatter formatter)對日期進行格式化
- until返回兩個日期之間的Period對象
- isLeapYear判斷是否為閏年
2.2 Instant時間戳
以Unix元年(傳統設定為UTC時區1970年1月1日)開始所經歷的描述進行運算
- 獲取當前時間的時間戳toEpochMilli
- 獲取當前時間的秒getEpochSecond
- 對時間進行偏移Instant.now().ofHours(ZoneOffset.ofHours(int hours))
2.3 TemporalAdjuster 時間校正器
主要通過TemporalAdjusters工具類獲取到TemporalAdjuster實例對象
LocalDateTime now = LocalDateTime.now();//直接調用JDK提供的時間校正器LocalDateTime with = now.with(TemporalAdjusters.next(DayOfWeek.SUNDAY));System.out.println(with);//自定義一個時間校正器,計算下一個工作日LocalDateTime with2 = now.with(e -> {LocalDateTime e1 = (LocalDateTime) e;DayOfWeek dayOfWeek = e1.getDayOfWeek();if (dayOfWeek.equals(DayOfWeek.FRIDAY)) {return e1.plusDays(3);} else if (dayOfWeek.equals(DayOfWeek.SATURDAY)) {return e1.plusDays(2);} else {return e1.plusDays(1);}});System.out.println(with2);2.4 DateTimeFormatter日期格式化
三種格式化方法:
- 預定義的標準格式
- 語言環境相關的格式
- 自定義的格式
2.4.1 預定義的標準格式
JDK提供的格式化格式
LocalDate localDate = LocalDate.now(); String format = localDate.format(DateTimeFormatter.ISO_DATE); 輸出:2020-04-032.4.1 自定義的時間格式
//自定義日期格式化方式,可以通過format和parse對日期進行格式化 DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日"); String format1 = localDate.format(dateTimeFormatter); System.out.println(format1); localDate.parse(format1,dateTimeFormatter);輸出:2020年04月03日2020-04-032.5 時區處理
2.5.1 ZoneId
- 獲取所有的時區信息
- 獲取指定時區信息的ZoneId對象
2.5.2 ZonedDateTime
獲取一個帶時區的日期時間對象
ZonedDateTime now = ZonedDateTime.now();System.out.println(now); //輸出 2020-04-03T14:22:54.250+08:00[Asia/Shanghai]其他用法和LocalDateTime類相同
7000字長文帶你深入IOC加載流程?mp.weixin.qq.comSpringMVC的執行流程,你想知道的都有?mp.weixin.qq.com總結
以上是生活随笔為你收集整理的日期格式化为yyyymmdd_你还在用SimpleDateFormat格式化时间嘛的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: maven中的oracle,maven中
- 下一篇: 数组循环右移