在Java 8以前,日期和時間處理一直被廣大java程序員抱怨太難用,
java.util
和
java.sql
中,都包含
Date
類,如果要進行時間格式化,還需要
java.text.DateFormat
類處理。同時
java.util.Date
中既包含了日期,又包含了時間,所以java8新的日期和時間庫,很好的解決了以前日期和時間類的很多弊端。並且也借鑒了第三方日期庫
joda
很多的優點。
java.time
包下主要包含下面幾個主要的類:
Instant:時間戳 Duration:持續時間,時間差 LocalDate:只包含日期,比如:2019-02-02 LocalTime:只包含時間,比如:23:12:10 LocalDateTime:包含日期和時間,比如:2019-02-02 23:14:21 Period:時間段 ZoneOffset:時區偏移量,比如:+8:00 ZonedDateTime:帶時區的時間 Clock:時鍾,比如獲取目前美國紐約的時間
1 獲取當天日期
LocalDate localDate =LocalDate.now(); System.out.println(localDate);
輸出結果為:2019-02-02
2 指定日期,進行相應操作
1)獲取某月份的第一天的兩種方法
LocalDate localDate =LocalDate.now(); LocalDate firstDay = localDate.with(TemporalAdjusters.firstDayOfMonth()); LocalDate firstDay = localDate.withDayOfMonth(1);
2)取某月的最后一天
LocalDate localDate =LocalDate.now();
LocalDate lastDay = localDate.with(TemporalAdjusters.lastDayOfMonth());
3)當前日期+1天
LocalDate localDate =LocalDate.now();
LocalDate tomorrow = localDate.plusDays(1);
4)判斷是否為閏年
LocalDate localDate =LocalDate.now();
boolean aa =localDate.isLeapYear();
5)指定日期
LocalDate localDate =LocalDate.of(2019,01,01); System.out.println(localDate);
3 生日檢查或賬單檢查
我們在購物時注冊會員時都會有生日祝福,例如,用戶的生日為1996-03-19,如果今天是2018-03-19,那么今天就是用戶的生日(按公歷/身份證日期來算),那么通過java8新的日期庫,我們該如何來進行實現呢?
LocalDate birthday = LocalDate.of(1996, 03, 19); MonthDay birthdayMd = MonthDay.of(birthday.getMonth(), birthday.getDayOfMonth()); MonthDay today = MonthDay.from(LocalDate.of(2018, 03, 19)); System.out.println(today.equals(birthdayMd));
輸出結果為 :true
4 獲取當前時間(不含日期)
LocalTime localTime =LocalTime.now(); ////獲取當前時間不顯示毫秒 10:13:14 LocalTime localTime1 =LocalTime.now().withNano(0); //指定時間 LocalTime time =LocalTime.of(0,0,20); LocalTime time1 =LocalTime.parse("10:20:20"); //當前時間+2h LocalTime add =localTime.plus(1, ChronoUnit.HOURS); LocalTime add1 =localTime.plusHours(1);
5 日期前后比較
LocalDate today = LocalDate.now(); LocalDate specifyDate = LocalDate.of(2018, 12, 20); System.out.println(today.isBefore(specifyDate)); //false System.out.println(today.isAfter(specifyDate)); //true
6 處理不同時間的時間
//查看當前的時區 ZoneId defaultZone = ZoneId.systemDefault(); System.out.println(defaultZone); //Asia/Shanghai //查看美國紐約當前的時間 ZoneId usa = ZoneId.of("America/New_York"); LocalDateTime shanghai = LocalDateTime.now(); LocalDateTime usaTime = LocalDateTime.now(usa); System.out.println(shanghai); //2019-02-02T10:28:31.471 System.out.println(usaTime); //2019-02-01T21:28:31.471,可以看到美國與北京時間差了11小時 //帶有時區的時間 ZonedDateTime americaZoneDateTime = ZonedDateTime.now(defaultZone); System.out.println(americaZoneDateTime); //2019-02-02T11:03:05.926+08:00[Asia/Shanghai]
7 比較兩個日期之前時間差
LocalDate today = LocalDate.now(); LocalDate date = LocalDate.of(2018, 12, 30); System.out.println(date.until(today, ChronoUnit.DAYS)); //34
8 日期時間格式化
在java8之前,我們進行時間格式化主要是使用SimpleDateFormat
,而在java8中,主要是使用DateTimeFormatter
,java8中,預定義了一些標准的時間格式,我們可以直接將時間轉換為標准的時間格式
LocalDateTime dateTime = LocalDateTime.now();
String strDate1 = dateTime.format(DateTimeFormatter.BASIC_ISO_DATE); // 20190202
String strDate2 = dateTime.format(DateTimeFormatter.ISO_LOCAL_DATE); // 2019-02-02
String strDate3 = dateTime.format(DateTimeFormatter.ISO_LOCAL_TIME); // 11:29:43.08
String strDate4 = dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); // 2019-02-02
String strDate5 = dateTime.format(DateTimeFormatter.ofPattern("今天是:YYYY年 MMMM dd日 E", Locale.CHINESE)); // 今天是:2019年 二月 02日 星期六
//字符串解析日期對象
String strDate1 = "2019-02-02";
String strDate2 = "2019-02-02 12:30:05";
LocalDate date = LocalDate.parse(strDate1, DateTimeFormatter.ofPattern("yyyy-MM-dd"));//2019-02-02
LocalDateTime dateTime1 = LocalDateTime.parse(strDate2, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));//2019-02-02T12:30:05
但是有些時候標准的時間格式不能滿足我們的要求需要我們自定義時間格式
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("YYYY年MM月dd日00:00:00"); System.out.println(dateTimeFormatter.format(LocalDate.now()));//2019年02月02日00:00:00
9 Date類於java8時間類相互轉化
在轉換中,我們需要注意,因為java8之前Date是包含日期和時間的,而LocalDate只包含日期,LocalTime只包含時間,所以與Date在互轉中,必定會丟失日期或者時間,或者會使用起始時間。如果轉LocalDateTime,就不存在信息誤差。
//Date與Instant的相互轉化 Instant instant = Instant.now(); Date date = Date.from(instant); Instant instant2 = date.toInstant(); System.out.println(instant);//2019-02-02T03:22:18.387Z System.out.println(date);//Sat Feb 02 11:22:18 CST 2019 System.out.println(instant2);//2019-02-02T03:22:18.387Z
//Date轉為LocalDateTime Date date2 = new Date(); LocalDateTime localDateTime2 = LocalDateTime.ofInstant(date2.toInstant(), ZoneId.systemDefault()); System.out.println(date2);//Sat Feb 02 11:24:24 CST 2019 System.out.println(localDateTime2);//2019-02-02T11:24:24.213
//LocalDateTime轉Date LocalDateTime localDateTime3 = LocalDateTime.now(); Instant instant3 = localDateTime3.atZone(ZoneId.systemDefault()).toInstant(); Date date3 = Date.from(instant); System.out.println(localDateTime3);//2019-02-02T11:25:38.524 System.out.println(instant3);//2019-02-02T03:25:38.524Z System.out.println(date3);//Sat Feb 02 11:25:38 CST 2019
//LocalDate轉Date,因為LocalDate不包含時間,所以轉Date時,會默認轉為當天的起始時間,00:00:00 LocalDate localDate4 = LocalDate.now(); Instant instant4 = localDate4.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant(); Date date4 = Date.from(instant); System.out.println(localDate4);//2019-02-02 System.out.println(instant4);//2019-02-01T16:00:00Z System.out.println(date4);//Sat Feb 02 11:26:35 CST 2019