LocalDate、LocalTime、Period、Duration等
一、新的Date API介绍
jdk以前的java.util.Date存在的问题
1)比如new Date(119, 2, 18)表示Mon Mar 18 00:00:00 CST 2019,2019年3月18日,year要从1900年加起,month是从0开始,day是从1开始。
2)SimpleDateFormat不是线程安全的,比如多线程情况下simpleDateFormat.parse会出问题。
3)Date名字叫日期,但是后面还有time时间
例子如下:
1 package com.cy.java8; 2 3 import java.text.ParseException; 4 import java.text.SimpleDateFormat; 5 import java.util.Date; 6 7 public class DateTest { 8 9 public static void main(String[] args) throws ParseException { 10 Date date = new Date(119, 2, 18); 11 System.out.println(date); 12 13 SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); 14 for(int i=0; i<5; i++){ 15 new Thread(()->{ 16 try { 17 Date parseDate = sdf.parse("20190505"); 18 System.out.println(parseDate); 19 } catch (ParseException e) { 20 e.printStackTrace(); 21 } 22 23 }).start(); 24 } 25 } 26 }
二、LocalDate
1 package com.cy.java8; 2 3 import java.time.LocalDate; 4 import java.time.temporal.ChronoField; 5 6 public class DateTest { 7 8 public static void main(String[] args) { 9 testLocalDate(); 10 } 11 12 /** 13 * LocalDate是线程安全的 14 */ 15 private static void testLocalDate(){ 16 LocalDate localDate = LocalDate.of(2019, 10, 2); 17 System.out.println(localDate.getYear()); 18 System.out.println(localDate.getMonth()); 19 System.out.println(localDate.getMonthValue()); 20 System.out.println(localDate.getDayOfYear()); 21 System.out.println(localDate.getDayOfMonth()); 22 System.out.println(localDate.getDayOfWeek()); 23 24 System.out.println(localDate.get(ChronoField.YEAR)); 25 System.out.println(localDate.get(ChronoField.MONTH_OF_YEAR)); 26 System.out.println(localDate.get(ChronoField.DAY_OF_MONTH)); 27 28 LocalDate now = LocalDate.now(); 29 System.out.println(now); 30 } 31 }
console:
2019 OCTOBER 10 275 2 WEDNESDAY 2019 10 2 2019-10-02
三、LocalTime、Instant、Duration、Period简单介绍
1 package com.test.localdate; 2 3 import java.time.*; 4 5 public class DateTest { 6 7 public static void main(String[] args) throws InterruptedException { 8 System.out.println("===========testLocalTime======================"); 9 testLocalTime(); 10 11 System.out.println("===========testCombineLocalDateAndTime======================"); 12 testCombineLocalDateAndTime(); 13 14 System.out.println("==============testInstant==================="); 15 testInstant(); 16 17 System.out.println("============testDurarion====================="); 18 testDuration(); 19 20 System.out.println("============testPeriod====================="); 21 testPeriod(); 22 } 23 24 private static void testLocalTime(){ 25 LocalTime time = LocalTime.now(); 26 System.out.println(time); 27 28 System.out.println(time.getHour()); 29 System.out.println(time.getMinute()); 30 System.out.println(time.getSecond()); 31 } 32 33 private static void testCombineLocalDateAndTime(){ 34 LocalDate localDate = LocalDate.now(); 35 LocalTime time = LocalTime.now(); 36 LocalDateTime localDateTime = LocalDateTime.of(localDate, time); 37 System.out.println(localDateTime); 38 39 LocalDateTime now = LocalDateTime.now(); 40 System.out.println(now); 41 } 42 43 private static void testInstant() throws InterruptedException { 44 Instant start = Instant.now(); 45 Thread.sleep(1000); 46 Instant end = Instant.now(); 47 48 Duration duration = Duration.between(start, end); //类似于之前的System.currentTimeMillis 49 System.out.println(duration.toMillis()); 50 } 51 52 private static void testDuration(){ 53 LocalTime time = LocalTime.now(); 54 LocalTime beforeTime = time.minusHours(1); 55 Duration duration = Duration.between(time, beforeTime); 56 System.out.println(duration.toHours()); 57 } 58 59 private static void testPeriod(){ 60 Period period = Period.between(LocalDate.of(2017, 10, 1), LocalDate.of(2019, 1, 2)); 61 System.out.println(period.getYears()); 62 System.out.println(period.getMonths()); 63 System.out.println(period.getDays()); 64 } 65 }
console:
===========testLocalTime====================== 10:00:45.739 10 0 45 ===========testCombineLocalDateAndTime====================== 2021-10-10T10:00:45.740 2021-10-10T10:00:45.740 ==============testInstant=================== 1004 ============testDurarion===================== -1 ============testPeriod===================== 1 3 1
四、formatter、parse
1 package com.cy.java8; 2 3 import java.time.*; 4 import java.time.format.DateTimeFormatter; 5 6 public class DateTest { 7 8 public static void main(String[] args){ 9 testDateFormat(); 10 System.out.println("=============================="); 11 12 testDateParse(); 13 } 14 15 private static void testDateFormat(){ 16 LocalDate localDate = LocalDate.now(); 17 String format1 = localDate.format(DateTimeFormatter.BASIC_ISO_DATE); 18 System.out.println(format1); 19 20 String format2 = localDate.format(DateTimeFormatter.ISO_LOCAL_DATE); 21 System.out.println(format2); 22 23 DateTimeFormatter myFormatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日"); 24 String format3 = localDate.format(myFormatter); 25 System.out.println(format3); 26 } 27 28 private static void testDateParse(){ 29 String date0 = "20191002"; 30 LocalDate localDate0 = LocalDate.parse(date0, DateTimeFormatter.BASIC_ISO_DATE); 31 System.out.println(localDate0); 32 33 String date1 = "2019-10-02"; 34 LocalDate localDate1 = LocalDate.parse(date1, DateTimeFormatter.ISO_LOCAL_DATE); 35 System.out.println(localDate1); 36 37 String date2 = "2019年10月02日"; 38 LocalDate localDate2 = LocalDate.parse(date2, DateTimeFormatter.ofPattern("yyyy年MM月dd日")); 39 System.out.println(localDate2); 40 } 41 }
console:
20191002 2019-10-02 2019年10月02日 ============================== 2019-10-02 2019-10-02 2019-10-02
例子1:使用LocalDateTime进行时间格式的格式化
1 package com.mayikt.mytest.datetimeformatter; 2 3 import java.time.LocalDate; 4 import java.time.LocalDateTime; 5 import java.time.LocalTime; 6 import java.time.format.DateTimeFormatter; 7 8 public class TestLocalDateTime { 9 10 /** 11 * 将yyyy-MM-dd HH:mm:ss 转化为yyyy年mm月dd日 HH时mm分ss秒 格式 12 * 13 * @param args 14 */ 15 public static void main(String[] args) { 16 String string = "2021-05-14 16:10:32"; 17 System.out.println(formatDateTime1(string)); 18 System.out.println(formatDateTime2(string)); 19 } 20 21 public static String formatDateTime2(String dateStr) { 22 LocalDateTime localDateTime = LocalDateTime.parse(dateStr, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); 23 String result = localDateTime.format(DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH时mm分ss秒")); 24 return result; 25 } 26 27 public static String formatDateTime1(String dateStr) { 28 String[] strArray = dateStr.split(" "); 29 LocalDate localDate = LocalDate.parse(strArray[0], DateTimeFormatter.ISO_LOCAL_DATE); 30 LocalTime localTime = LocalTime.parse(strArray[1], DateTimeFormatter.ofPattern("HH:mm:ss")); 31 LocalDateTime localDateTime = LocalDateTime.of(localDate, localTime); 32 return localDateTime.format(DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH时mm分ss秒")); 33 } 34 }
console:
2021年05月14日 16时10分32秒
2021年05月14日 16时10分32秒
----