Java8以前處理日期一直是Java程序員比較頭疼的問題,從Java 8以後,Java裏面添加了許多的新特性,其中一個最多見也是最實用的即是日期處理的類——LocalDate。LocalDate是一種更爲高效的日期類,比起Date的複雜具備至關高的簡潔性,吸收了企業級別的joda.time時間處理的優勢,避免了傳統的Date和Calendar複合起來計算的難處。html
新增的日期經常使用的用這三個:java
LocalDate:表明IOS格式(yyyy-MM-hh)的日期,不包含具體時間的日期,好比2014-01-14。它能夠用來存儲生日,週年記念日,入職日期等。程序員
LocalTime:它表明的是不含日期的時間;數據庫
LocalDateTime:它包含了日期及時間,不過仍是沒有偏移信息或者說時區,比較經常使用;安全
它們三者共同特色:工具
經常使用方法:學習
因爲LocalDate的API與LocalTime、LocalDateTime大都是通用的,全部後面兩個的就不展現了。spa
方法使用舉例:線程
1 //now():獲取當前日期 2 LocalDate localDate=LocalDate.now(); 3 LocalTime localTime=LocalTime.now(); 4 LocalTime localTime1= LocalTime.now().withNano(0); // 這個是不帶毫秒的 5 LocalDateTime localDateTime=LocalDateTime.now(); 6 System.out.println("日期:"+localDate); 7 System.out.println("時間:"+localTime); 8 System.out.println("時間不帶毫秒:"+localTime1); 9 System.out.println("日期時間:"+localDateTime); 10 11 //of():設置指定的年月日時分秒,沒有偏移量 12 System.out.println("-----------"); 13 LocalDateTime localDateTime2=LocalDateTime.of(2020, 04, 04, 18, 48, 56); 14 System.out.println("設置的時間爲:"+localDateTime2); 15 16 //getXXX:獲取相關的屬性 17 System.out.println("-----------"); 18 System.out.println("這年的第幾天:"+localDateTime.getDayOfYear()); 19 System.out.println("這月的第幾天:"+localDateTime.getDayOfMonth()); 20 System.out.println("這月的第幾天:"+localDateTime.getDayOfWeek()); 21 System.out.println("月份爲:"+localDateTime.getMonth()); 22 System.out.println("月份爲:"+localDateTime.getMonthValue()); 23 System.out.println("小時爲:"+localDateTime.getHour()); 24 25 //withXXX:設置相關的屬性,體現了不可變性,修改後返回了新的對象 26 LocalDateTime localDateTime3=localDateTime.withDayOfMonth(22); 27 System.out.println("當前的時間:"+localDateTime); 28 System.out.println("修改月份後:"+localDateTime3); 29 30 LocalDateTime localDateTime4=localDateTime.withHour(14); 31 System.out.println("當前的時間:"+localDateTime); 32 System.out.println("修改小時後:"+localDateTime4); 33 34 //plusXXX:增長相關屬性 35 LocalDateTime localDateTime5=localDateTime.plusDays(10); 36 System.out.println("當前時間:"+localDateTime); 37 System.out.println("相加以後:"+localDateTime5); 38 39 //minusXXX:減小相關屬性 40 LocalDateTime localDateTime6=localDateTime.minusDays(10); 41 System.out.println("當前時間:"+localDateTime); 42 System.out.println("相減以後:"+localDateTime6);
LocalDate ,LocalTime ,LocalDateTime 它們之間的互相轉換: 設計
1 /** 2 * LocalDate ,LocalTime,LocalDateTime 互相轉換 3 */ 4 @Test 5 public void test5(){ 6 String date = "2020-7-12"; 7 String time = "15:51:30"; 8 LocalDate localDate = LocalDate.parse(date); 9 LocalTime localTime = LocalTime.parse(time); 10 11 LocalDateTime localDateTime = LocalDateTime.of(2020, 7, 13, 16, 01, 30, 888); 12 LocalDateTime localDateTime1 = LocalDateTime.of(localDate, localTime); 13 14 //localDateTime-->LocalDate,LocalTime 15 LocalDate localDate1 = localDateTime.toLocalDate(); 16 LocalTime localTime1 = localDateTime.toLocalTime(); 17 18 // LocalDate,LocalTime --> LocalDateTime 19 LocalDateTime localDateTime2 = localDate.atTime(16, 02, 30); 20 LocalDateTime localDateTime3 = localTime.atDate(localDate); 21 22 }
Instant類:時間線上的一個瞬時點,設計初衷是爲了便於機器使用,不提供人類意義上的時間單位,獲取當前時刻的時間戳;它只是簡單的從1970年1月1日0時0分0秒(UTC)開始的秒數。
經常使用方法:
方法使用舉例:
1 @Test 2 public void testInstant() { 3 //now():獲取標準時間,即本初子午線的時間,沒有偏移量 4 Instant instant = Instant.now(); 5 System.out.println(instant); 6 7 //atOffset:添加偏移量,北京在東八區,時區加八即爲北京時間 8 OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8)); 9 System.out.println(offsetDateTime); 10 11 //toEpochMilli:獲取1970-01-01 00:00:00 開始的毫秒;相似Date的getTime 12 long epochMilli = instant.toEpochMilli(); 13 System.out.println(epochMilli); 14 15 //ofEpochMilli:經過給定的毫秒數,獲取Instant實例;相似Date(long millis) 16 Instant ofEpochMilli = Instant.ofEpochMilli(1562384592201L); 17 System.out.println(ofEpochMilli); 18 }
Java 8 中還引入的兩個與日期相關的新類:Period 和 Duration。兩個類分別表示時間量或兩個日期之間的差,二者之間的差別爲:Period基於日期值,而Duration基於時間值。
實例:
1 @Test 2 public void testDurationAndPeriod(){ 3 //Duration 4 LocalDate date1 = LocalDate.of(2020, 7, 6); 5 LocalDate date2 = LocalDate.of(2025, 9, 10); 6 LocalTime time1 = LocalTime.of(15, 7, 50); 7 LocalTime time2 = LocalTime.of(17, 8, 53); 8 LocalDateTime dateTime1 = LocalDateTime.of(2020, 5, 12, 14, 22, 28); 9 LocalDateTime dateTime2 = LocalDateTime.of(2024, 5, 12, 14, 22, 28); 10 Instant instant1 = Instant.ofEpochSecond(1); 11 Instant instant2 = Instant.now(); 12 Duration d1 = Duration.between(time1, time2); 13 Duration d2 = Duration.between(dateTime1, dateTime2); 14 Duration d3 = Duration.between(instant1, instant2); 15 // 這裏會拋異常java.time.temporal.UnsupportedTemporalTypeException: Unsupported unit: Seconds 16 //須要使用Period類進行操做日期 17 //Duration d4 = Duration.between(date1, date2); 18 System.out.println("LocalTime持續秒數:" + d1.getSeconds()); 19 System.out.println("LocalDateTime持續秒數:" + d2.getSeconds()); 20 System.out.println("Instant持續秒數" + d3.getSeconds()); 21 22 //Period 23 Period period=Period.between(date1, date2); 24 System.out.println(period.getYears()); 25 System.out.println(period.getMonths()); 26 System.out.println(period.getDays()); 27 System.out.println(period.toTotalMonths()); 28 }
到如今你所看到的全部日期操做都是相對比較直接的。有的時候,你須要進行一些更加 複雜的操做,好比,將日期調整到下個週日、下個工做日,或者是本月的最後一天。這時,你可使用重載版本的with方法,向其傳遞一個提供了更多定製化選擇的TemporalAdjusters對象, 更加靈活地處理日期。對於最多見的用例,日期和時間API已經提供了大量預約義的 TemporalAdjusters。你能夠經過TemporalAdjusters類的靜態工廠方法訪問它們,以下所示:
下面是TemporalAdjusters類中的方法:
方法使用舉例:
1 @Test 2 public void testTemporalAdjusters(){ 3 //dayOfWeekInMonth:返回這個月第二週星期二的日期 4 LocalDate localDate1=LocalDate.of(2020,9,15); 5 LocalDate localDate2 = localDate1.with(TemporalAdjusters.dayOfWeekInMonth(2, DayOfWeek.TUESDAY)); 6 System.out.println("默認時間:"+localDate1); 7 System.out.println("更改時間:"+localDate2); 8 9 //firstDayOfMonth():這個月第一天 10 System.out.println("---------"); 11 LocalDate localDate3=localDate1.with(TemporalAdjusters.firstDayOfMonth()); 12 System.out.println("默認時間:"+localDate1); 13 System.out.println("更改時間:"+localDate3); 14 15 //lastDayOfMonth():這個月最後一天 16 System.out.println("---------"); 17 LocalDate localDate4=localDate1.with(TemporalAdjusters.lastDayOfMonth()); 18 System.out.println("默認時間:"+localDate1); 19 System.out.println("更改時間:"+localDate4); 20 21 //nextOrSame():獲取周2時間,若是當前時間恰好是星期2,那麼就返回當前時間 22 System.out.println("---------"); 23 LocalDate localDate5 = localDate1.with(TemporalAdjusters.nextOrSame(DayOfWeek.TUESDAY)); 24 System.out.println("默認時間:"+localDate1); 25 System.out.println("更改時間:"+localDate5); 26 }
運行結果:
以前格式化有SimpleDateFormat和DateFormat,可是它們二者都是線程不安全的!啥狀況下會有這樣的問題呢?若是咱們爲了實現日期轉換這樣的工具,每次都new一個對象,可是用完了就不用了,就形成了浪費,爲此咱們會將它寫成單例的,可是單例的同時,一個對象供多個線程使用的時候,就會出現線程安全的問題。這個時候就須要這個新的jdk8出的DateTimeformatter這個類。
由字符串轉爲日期的方法:
若是是默認的格式,yyyy-MM-dd 這種日期格式字符串,直接用LocalDate.parse()進行轉換就好了,相對應的時間也是。既有時間又有日期的用DateTimeformatte這個類就行。
1 String time="2019-02-16"; 2 LocalDate localDate=LocalDate.parse(time); 3 System.out.println(localDate);
有時間有日期:
1 String datetime1="2019-05-24 18:15:56"; 2 DateTimeFormatter formatter1=DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); 3 LocalDateTime localDateTime1=LocalDateTime.parse(datetime1,formatter1); 4 System.out.println(localDateTime1); 5 6 或者: 7 String datetime2="2019-05-24 18:15:56"; 8 DateTimeFormatter formatter2=DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); 9 TemporalAccessor parse = formatter2.parse(datetime2); 10 LocalDateTime localDateTime=LocalDateTime.from(parse); 11 System.out.println(localDateTime);
由日期轉爲字符串的方法:
1 LocalDate localDate=LocalDate.now(); 2 System.out.println(localDate.toString()); 3 4 DateTimeFormatter formatter=DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); 5 LocalDateTime localDateTime=LocalDateTime.now(); 6 String result=localDateTime.format(formatter); 7 System.out.println(result);
最新JDBC映射將把數據庫的日期類型和Java 8的新類型關聯起來:
SQL -> Java
---------------------
date -> LocalDate
time -> LocalTime
timestamp -> LocalDateTime
此次主要學習了Java8中新的日期處理類
更多用例查看此文: http://www.javashuo.com/article/p-cbjionju-be.html