java8 - 新的时间日期API示例
Java 8之前的庫(kù)對(duì)時(shí)間和日期的支持非常不理想,不用擔(dān)心,在Java 8中引入全新的時(shí)間和日期API,并且都是線程安全的
-
新時(shí)間日期API常用對(duì)象介紹
LocalDate: 表示沒(méi)有時(shí)區(qū)的日期, LocalDate是不可變且線程安全
LocalTime: 表示沒(méi)有時(shí)區(qū)的時(shí)間, LocalTime是不可變且線程安全
LocalDateTime: 表示沒(méi)有時(shí)區(qū)的日期時(shí)間, LocalDateTime是不可變且線程安全
ZoneId: 時(shí)區(qū)ID,用來(lái)確定Instant和LocalDateTime互相轉(zhuǎn)換的規(guī)則
Instant: 用來(lái)表示時(shí)間線上的一個(gè)點(diǎn)(瞬時(shí)/時(shí)間戳)
Clock: 用于訪問(wèn)當(dāng)前時(shí)刻、日期、時(shí)間,用到時(shí)區(qū)
Duration: 用秒和納秒表示時(shí)間的數(shù)量(長(zhǎng)短),用于計(jì)算兩個(gè)日期的“時(shí)間”間隔
Period: 用于計(jì)算兩個(gè)“日期”間隔
其中,LocalDate、LocalTime、LocalDateTime是新API里的基礎(chǔ)對(duì)象:
LocalDate : 只含年月日的日期對(duì)象
LocalTime :只含時(shí)分秒的時(shí)間對(duì)象
LocalDateTime : 同時(shí)含有年月日時(shí)分秒的日期對(duì)象
?
-
新時(shí)間日期API示例
(1)獲取當(dāng)前時(shí)間:
- now() : 靜態(tài)方法,根據(jù)當(dāng)前時(shí)間創(chuàng)建對(duì)象
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)獲取當(dāng)前年、月、日
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)根據(jù)指定日期時(shí)間創(chuàng)建對(duì)象
- of() : 靜態(tài)方法 ?并返回一個(gè)LocalDate實(shí)例
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)檢查兩個(gè)日期是否相等
?LocalDate重寫(xiě)了equals方法來(lái)進(jìn)行日期的比較
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)獲取當(dāng)前時(shí)間戳
Instant類由一個(gè)靜態(tài)的工廠方法now()可以返回當(dāng)前時(shí)間戳
Instant instant = Instant.now();System.out.println(instant);// 2019-02-23T12:19:53.455638400Z可以使用這個(gè)兩個(gè)類中的方法在這兩個(gè)類型之間進(jìn)行轉(zhuǎn)換
-?Date.from(Instant)就是用來(lái)把Instant轉(zhuǎn)換成java.util.date
-?Date.toInstant()就是將Date轉(zhuǎn)換成Instant
以上獲取到的是 UTC 時(shí)區(qū)的時(shí)間,與中國(guó)時(shí)間相差8小時(shí),可以設(shè)置偏移量
Instant instant = Instant.now();System.out.println(instant.atOffset(ZoneOffset.ofHours(8)));// 中國(guó)當(dāng)前時(shí)間:2019-02-23T20:37:26.980896600+08:00(7)兩個(gè)日期之間相差多少時(shí)間 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天// 以下用來(lái)判斷時(shí)間的差
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("兩天之間的差在天數(shù) : " + daysDiff);
(8)獲取這個(gè)年中月有多少天
用于檢查2月是否潤(rùn)2
YearMonth yMonth = YearMonth.now();System.out.println("這個(gè)"+yMonth+"年月有"+yMonth.lengthOfMonth()+"天");// 這個(gè)2019-02年月有28天(9)使用時(shí)鐘
獲取某個(gè)時(shí)區(qū)下當(dāng)前的瞬時(shí)時(shí)間、日期,代替System.currentTimelnMillis()與TimeZone.getDefault()方法
Clock clock = Clock.systemUTC();System.out.println(clock);// SystemClock[Z] Clock.systemDefaultZone();System.out.println(clock);// SystemClock[Z](10)判斷某個(gè)日期在另一個(gè)日期的之前/之后
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)時(shí)間/日期的修改
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));//一小時(shí)前System.out.println(nowTime.minusMinutes(1));//一分鐘前System.out.println(nowTime.minusSeconds(1));//一秒前System.out.println(nowTime.minusNanos(1));//一納秒前 System.out.println(nowTime.plusHours(1));//一小時(shí)后System.out.println(nowTime.plusMinutes(1));//一分鐘后System.out.println(nowTime.plusSeconds(1));//一秒后System.out.println(nowTime.plusNanos(1));//一納秒后(12)時(shí)間日期格式化
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預(yù)定義的格式器來(lái)對(duì)日期進(jìn)行解析/格式化:
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日期進(jìn)行格式化,轉(zhuǎn)換成字符串:
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類實(shí)際上包含了LocalDateTime與ZoneOffset。它用來(lái)表示一個(gè)包含格林威治時(shí)間偏移量(+/-小時(shí):分,比如+06:00或者 -08:00)的完整的日期(年月日)及時(shí)間(時(shí)分秒,納秒)
“MMM d yyyy”與“MMm dd yyyy”這兩個(gè)日期格式也略有不同,前者能識(shí)別出"Jan 2 2019"與"Jan 14 2019"這兩個(gè)串,而后者如果傳進(jìn)來(lái)的是"Jan 2 2014"則會(huì)報(bào)錯(cuò),因?yàn)樗谕路萏巶鬟M(jìn)來(lái)的是兩個(gè)字符。為了解決這個(gè)問(wèn)題,在天為個(gè)位數(shù)的情況下,你得在前面補(bǔ)0,比如"Jan 2 2019"應(yīng)該改為"Jan 02 2019"
DateTimeFormatter類用于在Java中進(jìn)行日期的格式化與解析。與SimpleDateFormat不同,它是不可變且線程安全的
時(shí)區(qū)指的是地球上共享同一標(biāo)準(zhǔn)時(shí)間的地區(qū)。每個(gè)時(shí)區(qū)都有一個(gè)唯一標(biāo)識(shí)符,同時(shí)還有一個(gè)地區(qū)/城市(Asia/Tokyo)的格式以及從格林威治時(shí)間開(kāi)始的一個(gè)偏移時(shí)間。比如說(shuō),東京的偏移時(shí)間就是+09:00
?
轉(zhuǎn)載于:https://www.cnblogs.com/stamp/p/java_base_newDate.html
總結(jié)
以上是生活随笔為你收集整理的java8 - 新的时间日期API示例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Oracle的PL/SQL编程前奏之基础
- 下一篇: 优惠劵系统库存设计浅谈