Java 8 中处理日期和时间示例
在Java 8以前,日期和時間處理一直被廣大java程序員抱怨太難用,首先是java.util和java.sql中,都包含Date類,如果要進行時間格式化,還需要java.text.DateFormat類處理。同時java.util.Date中既包含了日期,又包含了時間,所以java8新的日期和時間庫,很好的解決了以前日期和時間類的很多弊端。并且也借鑒了第三方日期庫joda很多的優(yōu)點。
在java8中,java.time包下主要包含下面幾個主要的類:
Instant:時間戳 Duration:持續(xù)時間,時間差 LocalDate:只包含日期,比如:2016-10-20 LocalTime:只包含時間,比如:23:12:10 LocalDateTime:包含日期和時間,比如:2016-10-20?23:14:21 Period:時間段 ZoneOffset:時區(qū)偏移量,比如:+8:00 ZonedDateTime:帶時區(qū)的時間 Clock:時鐘,比如獲取目前美國紐約的時間以及java.time.format包中的
DateTimeFormatter:時間格式化下面我們通過例子來看如何使用java8新的日期時間庫
1、獲取今天的日期
LocalDate?todayDate?=?LocalDate.now(); System.out.println("今天的日期:"+todayDate); //結(jié)果 今天的日期:2016-10-202、指定日期,進行相應操作
//取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);//運行結(jié)果 2016-10-20 2016-10-01 2016-10-01 2016-10-31 2016-10-21 true3、生日檢查或者賬單日檢查
開發(fā)過程中,經(jīng)常需要為過生日的用戶送上一些祝福,例如,用戶的生日為1990-10-12,如果今天是2016-10-12,那么今天就是用戶的生日(按公歷/身份證日期來算),那么通過java8新的日期庫,我們該如何來進行判斷?
在java8中,可以使用MonthDay,該類不包含年份信息,當然還有一個類是YearMonth
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)); //結(jié)果 true4、獲取當前的時間
日期主要是使用LocalTime,該類不包含日期,只有時間信息
//獲取當前的時間 LocalTime?nowTime?=?LocalTime.now();?//結(jié)果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);5、日期前后比較
比較2個日期哪個在前,哪個在后,java8 LocalDate提供了2個方法,isAfter(),isBefore
LocalDate?today?=?LocalDate.now(); LocalDate?specifyDate?=?LocalDate.of(2015,?10,?20); System.out.println(today.isAfter(specifyDate));?//true6、處理不同時區(qū)的時間
java8中,將日期,時間,時區(qū)都很好的進行了分離。
//查看當前的時區(qū) 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小時//帶有時區(qū)的時間 ZonedDateTime?americaZoneDateTime?=?ZonedDateTime.now(america); System.out.println(americaZoneDateTime);?//2016-11-06T02:23:44.863-05:00[America/New_York]7、比較兩個日期之前時間差
在項目中,經(jīng)常需要比較兩個日期之間相差幾天,或者相隔幾個月,我們可以使用java8的Period來進行處理。
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 //輸出結(jié)果 4 1 401我們可以看到,我們使用Period類比較天數(shù),比較奇怪,他返回的值,并不是2個日期之間總共的天數(shù)差,而是一個相對天數(shù)差,比如,5月1日,和10月2日,他比較的是僅僅2個天之間的差,那1號和2號,相差1天,而實際上,因為中間相差了好幾個月,所以真正的天數(shù)差肯定不是1天,所以我們可以使用until,并指明精度單位是days,就可以計算真正的天數(shù)差了。
8、日期時間格式解析、格式化
在java8之前,我們進行時間格式化主要是使用SimpleDateFormat,而在java8中,主要是使用DateTimeFormatter,java8中,預定義了一些標準的時間格式,我們可以直接將時間轉(zhuǎn)換為標準的時間格式:
String?specifyDate?=?"20151011"; DateTimeFormatter?formatter?=?DateTimeFormatter.BASIC_ISO_DATE; LocalDate?formatted?=?LocalDate.parse(specifyDate,formatter);? System.out.println(formatted);? //輸出 2015-10-11當然,很多時間標準的時間格式可能也不滿足我們的要求,我們需要轉(zhuǎn)為自定義的時間格式
DateTimeFormatter?formatter2?=?DateTimeFormatter.ofPattern("YYYY?MM?dd"); System.out.println(formatter2.format(LocalDate.now())); //結(jié)果 2015?10?119、java8 時間類與Date類的相互轉(zhuǎn)化
在轉(zhuǎn)換中,我們需要注意,因為java8之前Date是包含日期和時間的,而LocalDate只包含日期,LocalTime只包含時間,所以與Date在互轉(zhuǎn)中,勢必會丟失日期或者時間,或者會使用起始時間。如果轉(zhuǎn)LocalDateTime,那么就不存在信息誤差。
//Date與Instant的相互轉(zhuǎn)化 Instant?instant??=?Instant.now(); Date?date?=?Date.from(instant); Instant?instant2?=?date.toInstant();//Date轉(zhuǎn)為LocalDateTime Date?date2?=?new?Date(); LocalDateTime?localDateTime2?=?LocalDateTime.ofInstant(date2.toInstant(),?ZoneId.systemDefault());//LocalDateTime轉(zhuǎn)Date LocalDateTime?localDateTime3?=?LocalDateTime.now(); Instant?instant3?=?localDateTime3.atZone(ZoneId.systemDefault()).toInstant(); Date?date3?=?Date.from(instant);//LocalDate轉(zhuǎn)Date //因為LocalDate不包含時間,所以轉(zhuǎn)Date時,會默認轉(zhuǎn)為當天的起始時間,00:00:00 LocalDate?localDate4?=?LocalDate.now(); Instant?instant4?=?localDate4.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant(); Date?date4?=?Date.from(instant);總結(jié)
以上是生活随笔為你收集整理的Java 8 中处理日期和时间示例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 从员工的离职时间,就能看出离职原因
- 下一篇: Spring IoC、AOP、Trans