Jdk14 都要出了,Jdk8 的時間處理姿勢還不瞭解一下?
阿新 • • 發佈:2019-10-24
當前時間:2019年10月24日。距離 JDK 14 釋出時間(2020年3月17日)還有多少天?
// 距離JDK 14 釋出還有多少天?
LocalDate jdk14 = LocalDate.of(2020, 3, 17);
LocalDate nowDate = LocalDate.now();
System.out.println("距離JDK 14 釋出還有:"+nowDate.until(jdk14,ChronoUnit.DAYS)+"天");
JDK 8 已經在 2014年 3月 18日正式可用 ,距離現在已經 5年多時間過去了。5年時間裡很多企業也都換上了 JDK 8,明年 3月份 Jdk14 也要來了,那麼 Jdk 8 的新特性你真的用起來了嗎?我準備寫一個 Jdk 8開始的新特性介紹以及使用的系列文章,後續 Jdk 也會繼續更新,你如果需要的話不妨關注下部落格或者公眾號。
1. 時間處理類
Jdk8 帶來了全新的時間處理工具類,用於代替之前存在缺陷的時間處理。新的時間處理相比之前更加簡單好用。
常用的類有以下幾個類。
時間相關類 | 介紹 |
---|---|
LocalDateTime | 時間處理類,最高精確到納秒 |
LocalDate | 時間處理類,最高精確到天 |
DateTimeFormatter | 時間格式化 |
ZoneId | 時區設定類 |
2. 時間獲取
使用不同的類可以獲取不同精度的時間。
/** * 時間獲取 */ @Test public void nowTimeTest() { // 當前精確時間 LocalDateTime now = LocalDateTime.now(); System.out.println("當前精確時間:" + now); System.out.println("當前精確時間:" + now.getYear() + "-" + now.getMonthValue() + "-" + now.getDayOfMonth() + " " + now.getHour() + "-" + now.getMinute() + "-" + now.getSecond()); // 獲取當前日期 LocalDate localDate = LocalDate.now(); System.out.println("當前日期:" + localDate); System.out.println("當前日期:" + localDate.getYear() + "-" + localDate.getMonthValue() + "-" + localDate.getDayOfMonth()); // 獲取當天時間 LocalTime localTime = LocalTime.now(); System.out.println("當天時間:" + localTime); System.out.println("當天時間:" + localTime.getHour() + ":" + localTime.getMinute() + ":" + localTime.getSecond()); // 有時區的當前精確時間 ZonedDateTime nowZone = LocalDateTime.now().atZone(ZoneId.systemDefault()); System.out.println("當前精確時間(有時區):" + nowZone); System.out.println("當前精確時間(有時區):" + nowZone.getYear() + "-" + nowZone.getMonthValue() + "-" + nowZone.getDayOfMonth() + " " + nowZone.getHour() + "-" + nowZone.getMinute() + "-" + nowZone.getSecond()); }
獲取到的時間:
當前精確時間:2019-10-24T00:26:41.724
當前精確時間:2019-10-24 0-26-41
當前日期:2019-10-24
當前日期:2019-10-24
當前精確時間(有時區):2019-10-24T00:26:41.725+08:00[GMT+08:00]
當前精確時間(有時區):2019-10-24 0-26-41
當天時間:00:26:41.725
當天時間:0:26:41
3. 時間建立
可以指定年月日時分秒建立一個時間類,也可以使用字串直接轉換成時間。
/** * 時間建立 */ @Test public void createTime() { LocalDateTime ofTime = LocalDateTime.of(2019, 10, 1, 8, 8, 8); System.out.println("當前精確時間:" + ofTime); LocalDate localDate = LocalDate.of(2019, 10, 01); System.out.println("當前日期:" + localDate); LocalTime localTime = LocalTime.of(12, 01, 01); System.out.println("當天時間:" + localTime); }
建立的時間:
當前精確時間:2019-10-01T08:08:08
當前日期:2019-10-01
當天時間:12:01:01
4. 時間轉換
/**
* 日期轉換
*/
@Test
public void convertTimeTest() {
LocalDateTime parseTime = LocalDateTime.parse("2019-10-01T22:22:22.222");
System.out.println("字串時間轉換:" + parseTime);
LocalDate formatted = LocalDate.parse("20190101", DateTimeFormatter.BASIC_ISO_DATE);
System.out.println("字串時間轉換-指定格式:" + formatted);
// Date 轉換成 LocalDateTime
Date date = new Date();
ZoneId zoneId = ZoneId.systemDefault();
System.out.println("Date 轉換成 LocalDateTime:" + LocalDateTime.ofInstant(date.toInstant(), zoneId));
// LocalDateTime 轉換成 Date
LocalDateTime localDateTime = LocalDateTime.now();
Date toDate = Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
System.out.println("LocalDateTime 轉換成 Date:" + toDate);\
// 當前時間轉時間戳
long epochMilli = LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli();
System.out.println("當前時間轉時間戳:" + epochMilli);
// 時間戳轉換成時間
LocalDateTime epochMilliTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(epochMilli), ZoneId.systemDefault());
System.out.println("時間戳轉換成時間:" + epochMilliTime);
}
轉換結果:
字串時間轉換:2019-10-01T22:22:22.222
字串時間轉換-指定格式:2019-01-01
Date 轉換成 LocalDateTime:2019-10-24T00:46:41.251
LocalDateTime 轉換成 Date:Thu Oct 24 00:46:41 GMT+08:00 2019
當前時間轉時間戳:1571849201258
時間戳轉換成時間:2019-10-24T00:46:41.258
5. 時間格式化
/**
* 日期格式化
*/
@Test
public void formatTest() {
LocalDateTime now = LocalDateTime.now();
System.out.println("當前時間:" + now);
System.out.println("格式化後:" + now.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));
System.out.println("格式化後:" + now.format(DateTimeFormatter.ISO_LOCAL_DATE));
System.out.println("格式化後:" + now.format(DateTimeFormatter.ISO_LOCAL_TIME));
System.out.println("格式化後:" + now.format(DateTimeFormatter.ofPattern("YYYY-MM-dd hh:mm:ss")));
}
格式化後:
當前時間:2019-10-24T00:37:44.867
格式化後:2019-10-24T00:37:44.867
格式化後:2019-10-24
格式化後:00:37:44.867
格式化後:2019-10-24 12:37:44
6. 時間比較
/**
* 時間比較
*/
@Test
public void diffTest() {
LocalDateTime now = LocalDateTime.now();
LocalDateTime yestory = now.minusDays(1);
System.out.println(now + "在" + yestory + "之後嗎?" + now.isAfter(yestory));
System.out.println(now + "在" + yestory + "之前嗎?" + now.isBefore(yestory));
// 時間差
long day = yestory.until(now, ChronoUnit.DAYS);
long month = yestory.until(now, ChronoUnit.MONTHS);
long hours = yestory.until(now, ChronoUnit.HOURS);
long minutes = yestory.until(now, ChronoUnit.MINUTES);
System.out.println("相差月份" + month);
System.out.println("相差天數" + day);
System.out.println("相差小時" + hours);
System.out.println("相差分鐘" + minutes);
// 距離JDK 14 釋出還有多少天?
LocalDate jdk14 = LocalDate.of(2020, 3, 17);
LocalDate nowDate = LocalDate.now();
System.out.println("距離JDK 14 釋出還有:" + nowDate.until(jdk14, ChronoUnit.DAYS) + "天");
}
比較結果:
2019-10-24T00:39:01.589在2019-10-23T00:39:01.589之後嗎?true
2019-10-24T00:39:01.589在2019-10-23T00:39:01.589之前嗎?false
相差月份0
相差天數1
相差小時24
相差分鐘1440
距離JDK 14 釋出還有:145天
7. 時間加減
/**
* 日期加減
*/
@Test
public void calcTest() {
LocalDateTime now = LocalDateTime.now();
System.out.println("當前時間:"+now);
LocalDateTime plusTime = now.plusMonths(1).plusDays(1).plusHours(1).plusMinutes(1).plusSeconds(1);
System.out.println("增加1月1天1小時1分鐘1秒時間後:" + plusTime);
LocalDateTime minusTime = now.minusMonths(2);
System.out.println("減少2個月時間後:" + minusTime);
}
操作結果:
當前時間:2019-10-24T00:41:08.877
增加1月1天1小時1分鐘1秒時間後:2019-11-25T01:42:09.877
減少2個月時間後:2019-08-24T00:41:08.877
8. 時間擴充套件方法
/**
* 時間方法
*/
@Test
public void timeFunctionTest() {
LocalDateTime now = LocalDateTime.now();
System.out.println("當前時間:" + now);
// 第一天
LocalDateTime firstDay = now.withDayOfMonth(1);
System.out.println("本月第一天:" + firstDay);
// 當天最後一秒
LocalDateTime lastSecondOfDay = now.withHour(23).withMinute(59).withSecond(59);
System.out.println("當天最後一秒:" + lastSecondOfDay);
// 最後一天
LocalDateTime lastDay = now.with(TemporalAdjusters.lastDayOfMonth());
System.out.println("本月最後一天:" + lastDay);
// 是否閏年
System.out.println("今年是否閏年:" + Year.isLeap(now.getYear()));
}
輸出結果:
當前時間:2019-10-24T00:43:28.296
本月第一天:2019-10-01T00:43:28.296
當天最後一秒:2019-10-24T23:59:59.296
本月最後一天:2019-10-31T00:43:28.296
今年是否閏年:false
Jdk 8 新的時間類使用起來相比之前顯得更加方便簡單。
Jdk 8 也把時間處理成獨立成一個包,並且使用不同的類名加以區分。而不是像之前相同的類名不同的包。這樣的方式使用起來也更加清晰。