java8 - 新的时间日期API示例
Java 8之前的庫對時間和日期的支持非常不理想,不用擔心,在Java 8中引入全新的時間和日期API,并且都是線程安全的
-
新時間日期API常用對象介紹
LocalDate: 表示沒有時區的日期, LocalDate是不可變且線程安全
LocalTime: 表示沒有時區的時間, LocalTime是不可變且線程安全
LocalDateTime: 表示沒有時區的日期時間, LocalDateTime是不可變且線程安全
ZoneId: 時區ID,用來確定Instant和LocalDateTime互相轉換的規則
Instant: 用來表示時間線上的一個點(瞬時/時間戳)
Clock: 用于訪問當前時刻、日期、時間,用到時區
Duration: 用秒和納秒表示時間的數量(長短),用于計算兩個日期的“時間”間隔
Period: 用于計算兩個“日期”間隔
其中,LocalDate、LocalTime、LocalDateTime是新API里的基礎對象:
LocalDate : 只含年月日的日期對象
LocalTime :只含時分秒的時間對象
LocalDateTime : 同時含有年月日時分秒的日期對象
?
-
新時間日期API示例
(1)獲取當前時間:
- now() : 靜態方法,根據當前時間創建對象
LocalDate localDate = LocalDate.now();LocalTime localTime = LocalTime.now();LocalDateTime localDateTime = LocalDateTime.now();System.out.println(localDate);System.out.println(localTime);System.out.println(localDateTime);/*輸出:2019-02-2319:23:10.8650213002019-02-23T19:23:10.866021400*/? (2)獲取當前年、月、日
LocalDate today = LocalDate.now();int year = today.getYear();int month = today.getMonthValue();int day = today.getDayOfMonth();System.out.println("年:"+year+"\n月:"+month+"\n日:"+day);/*輸出:年:2019月:2日:23*/(3)根據指定日期時間創建對象
- of() : 靜態方法 ?并返回一個LocalDate實例
LocalDate localDate = LocalDate.of(2019, 2, 23);LocalTime localTime = LocalTime.of(9, 43, 20);LocalDateTime localDateTime = LocalDateTime.of(2019, 2, 23, 9, 43, 20);System.out.println(localDate);System.out.println(localTime);System.out.println(localDateTime);/*輸出:2019-02-239:43:202019-02-23T9:43:20*/(4)檢查兩個日期是否相等
?LocalDate重寫了equals方法來進行日期的比較
LocalDate today = LocalDate.now();LocalDate day = LocalDate.of(2019, 2, 14);System.out.println("今天的日期是2019-02-14么?"+today.equals(day));// 今天的日期是2019-02-14么?false(5)判斷是否閏年
LocalDate now = LocalDate.now();System.out.println( now + "是否是閏年" + now.isLeapYear());// 2019-02-23 是否是閏年 false(6)獲取當前時間戳
Instant類由一個靜態的工廠方法now()可以返回當前時間戳
Instant instant = Instant.now();System.out.println(instant);// 2019-02-23T12:19:53.455638400Z可以使用這個兩個類中的方法在這兩個類型之間進行轉換
-?Date.from(Instant)就是用來把Instant轉換成java.util.date
-?Date.toInstant()就是將Date轉換成Instant
以上獲取到的是 UTC 時區的時間,與中國時間相差8小時,可以設置偏移量
Instant instant = Instant.now();System.out.println(instant.atOffset(ZoneOffset.ofHours(8)));// 中國當前時間:2019-02-23T20:37:26.980896600+08:00(7)兩個日期之間相差多少時間 LocalDate today = LocalDate.now();
LocalDate day = LocalDate.of(2018, 2, 14);Period period = Period.between(day, today);System.out.println(period.getYears()+"-"+period.getMonths()+"-"+period.getDays());// 兩者 相差 1年-0月-9天// 以下用來判斷時間的差
LocalTime startTime = LocalTime.now();
LocalTime endTime = LocalTime.now();
System.out.println(Duration.between(startTime, endTime).toSeconds());
?
LocalDate startDate = LocalDate.of(1993, Month.OCTOBER, 19);
LocalDate endDate = LocalDate.of(2017, Month.JUNE, 16);
long daysDiff = ChronoUnit.DAYS.between(startDate, endDate);
System.out.println("兩天之間的差在天數 : " + daysDiff);
(8)獲取這個年中月有多少天
用于檢查2月是否潤2
YearMonth yMonth = YearMonth.now();System.out.println("這個"+yMonth+"年月有"+yMonth.lengthOfMonth()+"天");// 這個2019-02年月有28天(9)使用時鐘
獲取某個時區下當前的瞬時時間、日期,代替System.currentTimelnMillis()與TimeZone.getDefault()方法
Clock clock = Clock.systemUTC();System.out.println(clock);// SystemClock[Z] Clock.systemDefaultZone();System.out.println(clock);// SystemClock[Z](10)判斷某個日期在另一個日期的之前/之后
LocalDate today = LocalDate.now();LocalDate tommorow = today.plus(1,ChronoUnit.DAYS);System.out.println("明天的日期:"+tommorow);System.out.println("日期:"+tommorow+"是否在日期:"+today+"之后:"+tommorow.isAfter(today));System.out.println("日期:"+tommorow+"是否在日期:"+today+"之后:"+tommorow.isBefore(today));//今天的日期:2019-02-23//明天的日期:2019-02-24//日期:2019-02-24是否在日期:2019-02-23之后:true//日期:2019-02-24是否在日期:2019-02-23之后:false(11)時間/日期的修改
LocalDate nowDate = LocalDate.now();System.out.println(nowDate.minusYears(1));//一年前System.out.println(nowDate.minusMonths(1));//一月前System.out.println(nowDate.minusWeeks(1));//一周前System.out.println(nowDate.minusDays(1));//一天前 System.out.println(nowDate.plusYears(1));//一年后System.out.println(nowDate.plusMonths(1));//一月后System.out.println(nowDate.plusWeeks(1));//一周后System.out.println(nowDate.plusDays(1));//一天后 LocalTime nowTime = LocalTime.now();System.out.println(nowTime.minusHours(1));//一小時前System.out.println(nowTime.minusMinutes(1));//一分鐘前System.out.println(nowTime.minusSeconds(1));//一秒前System.out.println(nowTime.minusNanos(1));//一納秒前 System.out.println(nowTime.plusHours(1));//一小時后System.out.println(nowTime.plusMinutes(1));//一分鐘后System.out.println(nowTime.plusSeconds(1));//一秒后System.out.println(nowTime.plusNanos(1));//一納秒后(12)時間日期格式化
LocalDateTime ldt = LocalDateTime.now();System.out.println(ldt);//2018-09-06T18:22:47.366DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");String ldtStr = ldt.format(dtf);System.out.println(ldtStr);//2018-09-06 18:22:47String ldtStr1 = dtf.format(ldt);System.out.println(ldtStr1);//2018-09-06 18:22:47預定義的格式器來對日期進行解析/格式化:
String temp = "20190214";LocalDate formatted = LocalDate.parse(temp,DateTimeFormatter.BASIC_ISO_DATE);System.out.println("格式化后的格式是:"+formatted);// 格式化后的格式是:2019-02-14自定義解析為日期:
String str = "01 12 2014";DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM dd yyyy");LocalDate lDate = LocalDate.parse(str,formatter);System.out.println("格式化后的格式是:"+lDate);// 格式化后的格式是:2014-01-12日期進行格式化,轉換成字符串:
LocalDateTime lDateTime = LocalDateTime.now();DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM dd yyyy HH:mm a");String str = localDateTime.format(formatter);System.out.println("格式化后的格式是:"+str);// 2019-02-23T9:45:20 格式化后的格式是:02 23 2019 22:37 下午OffsetDateTime類實際上包含了LocalDateTime與ZoneOffset。它用來表示一個包含格林威治時間偏移量(+/-小時:分,比如+06:00或者 -08:00)的完整的日期(年月日)及時間(時分秒,納秒)
“MMM d yyyy”與“MMm dd yyyy”這兩個日期格式也略有不同,前者能識別出"Jan 2 2019"與"Jan 14 2019"這兩個串,而后者如果傳進來的是"Jan 2 2014"則會報錯,因為它期望月份處傳進來的是兩個字符。為了解決這個問題,在天為個位數的情況下,你得在前面補0,比如"Jan 2 2019"應該改為"Jan 02 2019"
DateTimeFormatter類用于在Java中進行日期的格式化與解析。與SimpleDateFormat不同,它是不可變且線程安全的
時區指的是地球上共享同一標準時間的地區。每個時區都有一個唯一標識符,同時還有一個地區/城市(Asia/Tokyo)的格式以及從格林威治時間開始的一個偏移時間。比如說,東京的偏移時間就是+09:00
?
轉載于:https://www.cnblogs.com/stamp/p/java_base_newDate.html
總結
以上是生活随笔為你收集整理的java8 - 新的时间日期API示例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Oracle的PL/SQL编程前奏之基础
- 下一篇: 优惠劵系统库存设计浅谈