Java 8中處理日期和時間示例

在Java 8之前,日期和時間處理一直被廣大java程序員抱怨太難用,首先是java.utiljava.sql中,都包含Date類,若是要處理java.text.DateFormat類處理。同時java.util.Date中既包含了日期,又包含了時間,因此java8新的日期和時間庫,很好的解決了之前日期和時間類的不少弊端。而且也借鑑了第三方日期庫joda不少的優勢。java

在java8中,java.time包下主要包含下面幾個主要的類:程序員

Instant:時間戳  
Duration:持續時間,時間差  
LocalDate:只包含日期,好比:2016-10-20  
LocalTime:只包含時間,好比:23:12:10  
LocalDateTime:包含日期和時間,好比:2016-10-20 23:14:21  
Period:時間段  
ZoneOffset:時區偏移量,好比:+8:00  
ZonedDateTime:帶時區的時間  
Clock:時鐘,好比獲取目前美國紐約的時間

以及java.time.format包中的sql

DateTimeFormatter:時間格式化

下面咱們經過例子來看如何使用java8新的日期時間庫spa

一、獲取今天的日期

LocalDate todayDate = LocalDate.now();  
System.out.println("今天的日期:"+todayDate);  
//結果
今天的日期:2016-10-20

二、指定日期,進行相應操做

//取2016年10月的第1天
LocalDate firstDay = oneday.with(TemporalAdjusters.firstDayOfMonth());  
System.out.println(firstDay);

//取2016年10月的第1天,另一種寫法
LocalDate firstDay2 = oneday.withDayOfMonth(1);  
System.out.println(firstDay2);

//取2016年10月的最後1天,不用考慮大月,小月,平年,閏年
LocalDate lastDay = oneday.with(TemporalAdjusters.lastDayOfMonth());  
System.out.println(lastDay);

//當前日期+1天
LocalDate tomorrow = oneday.plusDays(1);  
System.out.println(tomorrow);

//判斷是否爲閏年
boolean isLeapYear = tomorrow.isLeapYear();  
System.out.println(isLeapYear);

//運行結果
2016-10-20  
2016-10-01  
2016-10-01  
2016-10-31  
2016-10-21  
true

三、生日檢查或者帳單日檢查

開發過程當中,常常須要爲過生日的用戶送上一些祝福,例如,用戶的生日爲1990-10-12,若是今天是2016-10-12,那麼今天就是用戶的生日(按公曆/身份證日期來算),那麼經過java8新的日期庫,咱們該如何來進行判斷?code

在java8中,可使用MonthDay,該類不包含年份信息,固然還有一個類是YearMonthorm

LocalDate birthday = LocalDate.of(1990, 10, 12);  
MonthDay birthdayMd = MonthDay.of(birthday.getMonth(), birthday.getDayOfMonth());  
MonthDay today = MonthDay.from(LocalDate.of(2016, 10, 12));  
System.out.println(today.equals(birthdayMd));  
//結果
true

四、獲取當前的時間

日期主要是使用LocalTime,該類不包含日期,只有時間信息ci

//獲取當前的時間
LocalTime nowTime = LocalTime.now(); //結果14:29:40.558

//若是不想顯示毫秒
LocalTime nowTime2 = LocalTime.now().withNano(0); //14:43:14

//指定時間
LocalTime time = LocalTime.of(14, 10, 21); //14:10:21  
LocalTime time2 = LocalTime.parse("12:00:01"); // 12:00:01

//當前時間增長2小時
LocalTime nowTimePlus2Hour = nowTime.plusHours(2); //16:47:23.144  
//或者
LocalTime nowTimePlus2Hour2 = nowTime.plus(2, ChronoUnit.HOURS);

五、日期先後比較

比較2個日期哪一個在前,哪一個在後,java8 LocalDate提供了2個方法,isAfter(),isBefore開發

LocalDate today = LocalDate.now();  
LocalDate specifyDate = LocalDate.of(2015, 10, 20);  
System.out.println(today.isAfter(specifyDate)); //true

六、處理不一樣時區的時間

java8中,將日期,時間,時區都很好的進行了分離。get

//查看當前的時區
ZoneId defaultZone = ZoneId.systemDefault();  
System.out.println(defaultZone); //Asia/Shanghai

//查看美國紐約當前的時間
ZoneId america = ZoneId.of("America/New_York");  
LocalDateTime shanghaiTime = LocalDateTime.now();  
LocalDateTime americaDateTime = LocalDateTime.now(america);  
System.out.println(shanghaiTime); //2016-11-06T15:20:27.996  
System.out.println(americaDateTime); //2016-11-06T02:20:27.996 ,能夠看到美國與北京時間差了13小時

//帶有時區的時間
ZonedDateTime americaZoneDateTime = ZonedDateTime.now(america);  
System.out.println(americaZoneDateTime); //2016-11-06T02:23:44.863-05:00[America/New_York]

七、比較兩個日期以前時間差

在項目中,常常須要比較兩個日期之間相差幾天,或者相隔幾個月,咱們可使用java8的Period來進行處理。it

LocalDate today = LocalDate.now();  
LocalDate specifyDate = LocalDate.of(2015, 10, 2);  
Period period = Period.between(specifyDate, today);

System.out.println(period.getDays());  //4  
System.out.println(period.getMonths()); //1  
System.out.println(specifyDate.until(today, ChronoUnit.DAYS)); //401  
//輸出結果
4  
1  
401

咱們能夠看到,咱們使用Period類比較天數,比較奇怪,他返回的值,並非2個日期之間總共的天數差,而是一個相對天數差,好比,5月1日,和10月2日,他比較的是僅僅2個天之間的差,那1號和2號,相差1天,而實際上,由於中間相差了好幾個月,因此真正的天數差確定不是1天,因此咱們可使用until,並指明精度單位是days,就能夠計算真正的天數差了。

八、日期時間格式解析、格式化

在java8以前,咱們進行時間格式化主要是使用SimpleDateFormat,而在java8中,主要是使用DateTimeFormatter,java8中,預約義了一些標準的時間格式,咱們能夠直接將時間轉換爲標準的時間格式:

String specifyDate = "20151011";  
DateTimeFormatter formatter = DateTimeFormatter.BASIC_ISO_DATE;  
LocalDate formatted = LocalDate.parse(specifyDate,formatter);  
System.out.println(formatted);  
//輸出
2015-10-11

固然,不少時間標準的時間格式可能也不知足咱們的要求,咱們須要轉爲自定義的時間格式

DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("YYYY MM dd");  
System.out.println(formatter2.format(LocalDate.now()));  
//結果
2015 10 11

九、java8 時間類與Date類的相互轉化

在轉換中,咱們須要注意,由於java8以前Date是包含日期和時間的,而LocalDate只包含日期,LocalTime只包含時間,因此與Date在互轉中,勢必會丟失日期或者時間,或者會使用起始時間。若是轉LocalDateTime,那麼就不存在信息偏差。

//Date與Instant的相互轉化
Instant instant  = Instant.now();  
Date date = Date.from(instant);  
Instant instant2 = date.toInstant();

//Date轉爲LocalDateTime
Date date2 = new Date();  
LocalDateTime localDateTime2 = LocalDateTime.ofInstant(date2.toInstant(), ZoneId.systemDefault());

//LocalDateTime轉Date
LocalDateTime localDateTime3 = LocalDateTime.now();  
Instant instant3 = localDateTime3.atZone(ZoneId.systemDefault()).toInstant();  
Date date3 = Date.from(instant);

//LocalDate轉Date
//由於LocalDate不包含時間,因此轉Date時,會默認轉爲當天的起始時間,00:00:00
LocalDate localDate4 = LocalDate.now();  
Instant instant4 = localDate4.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant();  
Date date4 = Date.from(instant);

©聲明:除非註明,本站全部文章皆爲原創,轉載請以連接形式標明本文地址。 
©轉載請註明來源:https://www.rjkf.cn/java8-date-localdate/

陶清清

相關文章
相關標籤/搜索