1. 概述
??JDK1.8中對(duì)日期的改動(dòng)是特別大的,基本上是引入了一套全新的API 凝垛。因?yàn)橛捎谠瓉?lái)老舊的日期API一直被人詬病策橘,比如java.util.Date,java.util.Calendar等瓶逃,并且原來(lái)所有的日期類(lèi)都是可變且線(xiàn)程不安全的束铭,導(dǎo)致許多人要么自己手動(dòng)封裝廓块,要么轉(zhuǎn)去使用Joda Time等這類(lèi)優(yōu)秀的第三方工具包。所以契沫,在JDK1.8中带猴,JDK官方在Joda Time等優(yōu)秀工具包基礎(chǔ)上,重新提供了一份相當(dāng)不錯(cuò)的日期API懈万。并且拴清,在JDK1.8中,java.time包中的類(lèi)是不可變且線(xiàn)程安全的会通。
??JAVA8中的日期API是JSR-310的實(shí)現(xiàn)贷掖,并且是工作在ISO-8601日歷系統(tǒng)基礎(chǔ)上的,但我們也可以在非ISO的日歷上渴语。
??JDK8的日期API大致分為以下幾個(gè)包:
- java.time包:JDK8中的基礎(chǔ)包苹威,所有常用的基礎(chǔ)類(lèi)都是這個(gè)包的一部分,如
LocalDate
驾凶,LocalTime
牙甫,LocalDateTime
等等,所有這些類(lèi)都是不可變且線(xiàn)程安全的调违;- java.time.chrono包:這個(gè)包為非ISO的日歷系統(tǒng)定義了一些API窟哺,我們可以在借助這個(gè)包中的一些類(lèi)擴(kuò)展我們自己的日歷系統(tǒng);
- java.time.format包:這個(gè)包很明顯了技肩,格式化和解析日期時(shí)間對(duì)象且轨,一般java.time包中的類(lèi)都差不多能滿(mǎn)足我們的需求了,如果有需要虚婿,可以調(diào)用這個(gè)包下的類(lèi)自定義解析方式旋奢;
- java.time.temporal包:這個(gè)包很有意思,封裝了一些獲取某個(gè)特定日期和時(shí)間的接口然痊,比如某月的第一天或最后一天至朗,并且這些方法都是屬于特別好認(rèn)的方法。
- java.time.zone包:這個(gè)包就是時(shí)區(qū)相關(guān)的類(lèi)了剧浸。
下面對(duì)ISO-8601簡(jiǎn)單描述一下锹引,參考自百度百科:
- ISO-8601: 國(guó)際標(biāo)準(zhǔn)化組織制定的日期和時(shí)間的表示方法,全稱(chēng)為《數(shù)據(jù)存儲(chǔ)和交換形式·信息交換·日期和時(shí)間的表示方法》唆香,簡(jiǎn)稱(chēng)為ISO-8601嫌变。
- 日的表示:小時(shí)、分和秒都用2位數(shù)表示躬它,對(duì)UTC時(shí)間最后加一個(gè)大寫(xiě)字母Z腾啥,其他時(shí)區(qū)用實(shí)際時(shí)間加時(shí)差表示。如UTC時(shí)間下午2點(diǎn)30分5秒表示為14:30:05Z或143005Z,當(dāng)時(shí)的北京時(shí)間表示為22:30:05+08:00或223005+0800碑宴,也可以簡(jiǎn)化成223005+08。
- 日期和時(shí)間的組合表示:合并表示時(shí)桑谍,要在時(shí)間前面加一大寫(xiě)字母T延柠,如要表示北京時(shí)間2004年5月3日下午5點(diǎn)30分8秒,可以寫(xiě)成2004-05-03T17:30:08+08:00或20040503T173008+08锣披。
??在JDK1.8中贞间,我們經(jīng)常使用的大約有如下幾個(gè)類(lèi):LocalDate
, LocalTime
, LocalDateTime
, DateTimeFormatter
等,所以我們主要看一下這幾個(gè)類(lèi)的相關(guān)方法雹仿。
2. 日期API
2.1 LocalDate
java.time.LocalDate這個(gè)類(lèi)增热,是用來(lái)表示日期的,也僅包含日期胧辽,用起來(lái)十分方便峻仇,方法也十分簡(jiǎn)單。我們來(lái)看一些小例子:
public static void testDate() {
// 1. 獲取當(dāng)前日期(年月日) -----打印輸出-----2018-01-29
LocalDate localDate = LocalDate.now();
System.out.println(localDate.toString());
// 2. 根據(jù)年月日構(gòu)建Date ----打印輸出-----2018-01-30
LocalDate localDate1 = LocalDate.of(2018, 01, 30);
// 3. 字符串轉(zhuǎn)換日期,默認(rèn)按照yyyy-MM-dd格式邑商,也可以自定義格式 -----打印輸出-----2018-01-30
LocalDate localDate2 = LocalDate.parse("2018-01-30");
// 4. 獲取本月第一天 -----打印輸出-----2018-01-01
LocalDate firstDayOfMonth = localDate.with(TemporalAdjusters.firstDayOfMonth());
// 5. 獲取本月第二天 -----打印輸出-----2018-01-02
LocalDate secondDayOfMonth = localDate.withDayOfMonth(2);
// 6. 獲取本月最后一天 -----打印輸出-----2018-01-31
LocalDate lastDayOfMonth = localDate.with(TemporalAdjusters.lastDayOfMonth());
// 7. 明天 -----打印輸出----- 2018-01-30
LocalDate tomorrowDay = localDate.plusDays(1L);
// 8. 昨天 -----打印輸出----- 2018-01-28
LocalDate yesterday = localDate.minusDays(1L);
// 9. 獲取本年第12天 -----打印輸出----- 2018-04-30
LocalDate day = localDate.withDayOfYear(120);
// 10. 計(jì)算兩個(gè)日期間的天數(shù)
long days = localDate.until(localDate1, ChronoUnit.DAYS);
System.out.println(days);
// 11. 計(jì)算兩個(gè)日期間的周數(shù)
long weeks = localDate.until(localDate1, ChronoUnit.WEEKS);
System.out.println(weeks);
}
??上面我只列舉了幾個(gè)常用的方法摄咆,但實(shí)際上LocalDate還有相當(dāng)多的有意思的方法,基本上我們工作上遇到的與日期有關(guān)的操作人断,都可以通過(guò)LocadDate來(lái)實(shí)現(xiàn)吭从。如果大家在遇到相關(guān)問(wèn)題的時(shí)候,可以自行查看API去了解和使用恶迈。
2.2 LocalTime
同樣涩金,和LocalDate相對(duì)應(yīng)的另一個(gè)類(lèi)就是LocalTime,這個(gè)類(lèi)恰好和LocalDate相反暇仲,它表示的全是時(shí)間步做,不包含日期。例子如下:
public static void testTime() {
// 1. 獲取當(dāng)前時(shí)間奈附,包含毫秒數(shù) -----打印輸出----- 21:03:26.315
LocalTime localTime = LocalTime.now();
// 2. 構(gòu)建時(shí)間 -----打印輸出----- 12:15:30
LocalTime localTime1 = LocalTime.of(12, 15, 30);
// 3. 獲取當(dāng)前時(shí)間辆床,不包含毫秒數(shù) -----打印輸出----- 21:01:56
LocalTime localTime2 = localTime.withNano(0);
// 4. 字符串轉(zhuǎn)為時(shí)間,還可以有其他格式桅狠,比如12:15, 12:15:23.233
// -----打印輸出----- 12:15:30
LocalTime localTime3 = LocalTime.parse("12:15:30");
}
2.3 LocalDateTime
LocalDateTime就和原先的java.util.Date很像了讼载,既包含日期,又包含時(shí)間中跌,它經(jīng)常和DateTimeFormatter一起使用咨堤。
public static void testDateTime() {
// 1. 獲取當(dāng)前年月日 時(shí)分秒 -----打印輸出----- 2018-01-29T21:23:26.774
LocalDateTime localDateTime = LocalDateTime.now();
// 2. 通過(guò)LocalDate和LocalTime構(gòu)建 ----- 打印輸出----- 2018-01-29T21:24:41.738
LocalDateTime localDateTime1 = LocalDateTime.of(LocalDate.now(), LocalTime.now());
// 3. 構(gòu)建年月日 時(shí)分秒 -----打印輸出----- 2018-01-29T19:23:13
LocalDateTime localDateTime2 = LocalDateTime.of(2018, 01, 29, 19, 23, 13);
// 4. 格式化當(dāng)前時(shí)間 ----打印輸出----- 2018/01/29
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");
System.out.println(formatter.format(localDateTime2));
}
使用LocalDateTime的with開(kāi)頭的方法可以設(shè)置相應(yīng)的時(shí)間,小時(shí)漩符,分鐘等一喘,比如:
// 設(shè)置分鐘數(shù)
LocalDateTime localDateTime = LocalDateTime.now().withMinute(23);
需要注意的有兩點(diǎn):
- LocalDateTime默認(rèn)的格式是
2018-01-29T21:23:26.774
這種格式,這可能與我們經(jīng)常使用的格式不太符合,所以我們可以指定格式凸克。- DateTimeFormatter本身提供了許多靜態(tài)格式化常量议蟆,我們可以參考使用,如果不能滿(mǎn)足我們的需求的話(huà)萎战,我們可以自定義咐容;
LocalDateTime的toString方法:
@Override
public String toString() {
return date.toString() + 'T' + time.toString();
}
LocalDate
,LocalTime
蚂维,LocalDateTime
這三個(gè)類(lèi)基本上處理了大部分的日期戳粒,時(shí)間。而與這三個(gè)類(lèi)經(jīng)常結(jié)合使用的還有如下幾個(gè)類(lèi):Year
,Month
,YearMonth
,MonthDay
,DayOfWeek
虫啥。- 并且蔚约,我們?cè)贚ocalDate相關(guān)類(lèi)的操作也可以通過(guò)Year,Month等來(lái)實(shí)現(xiàn)涂籽。
Year year =Year.now();
System.out.println(year.getValue()); // 2018
2.4 TemporalAdjusters
該類(lèi)是一個(gè)計(jì)算用的類(lèi)苹祟,提供了各種各樣的計(jì)算方法。比如某個(gè)月的第一天评雌,某個(gè)月的最后一天苔咪,某一年的第一天,某一年的第幾天等各種計(jì)算方法柳骄。該類(lèi)內(nèi)部實(shí)現(xiàn)基本上全都是通過(guò)JDK8的Lambda表達(dá)式來(lái)實(shí)現(xiàn)的团赏。隨便舉一些例子,都很簡(jiǎn)單耐薯。
LocalDate localDate = LocalDate.now();
// 1. 本月第一天
LocalDate firstDayOfMonth = localDate.with(TemporalAdjusters.firstDayOfMonth());
// 2. 本月最后一天
LocalDate lastDayOfMonth = localDate.with(TemporalAdjusters.lastDayOfMonth());
// 3. 本年第一天
LocalDate firstDayOfYear = localDate.with(TemporalAdjusters.firstDayOfYear());
// 4. 下個(gè)月第一天
LocalDate firstDayOfNextMonth = localDate.with(TemporalAdjusters.firstDayOfNextMonth());
// 5. 本年度最后一天
LocalDate lastDayOfYear = localDate.with(TemporalAdjusters.lastDayOfYear());
System.out.println(firstDayOfMonth);
System.out.println(lastDayOfMonth);
System.out.println(firstDayOfYear);
System.out.println(firstDayOfNextMonth);
System.out.println(lastDayOfYear);
打印輸出:
2018-01-01
2018-01-31
2018-01-01
2018-02-01
2018-12-31
2.5 Period和Duration
??Period是基于ISO-8601標(biāo)準(zhǔn)的日期系統(tǒng)舔清,用于計(jì)算兩個(gè)日期間的年,月曲初,日的差值体谒。比如'2年,3個(gè)月臼婆,4天'抒痒;而Duration和Period很像,但Duration計(jì)算的是兩個(gè)日期間的秒颁褂,納秒的值故响,是一種更為精確的計(jì)算方式;而ISO-8601系統(tǒng)是當(dāng)今世界大部分地區(qū)采用的現(xiàn)代日歷的陽(yáng)歷系統(tǒng)颁独。
LocalDate localDate = LocalDate.now();
LocalDate localDate1 = LocalDate.of(2018, 3, 28);
Period period = Period.between(localDate, localDate1);
System.out.println(period.getDays());
System.out.println(period.getMonths());
當(dāng)然如果我們看一下Period的between方法實(shí)現(xiàn)彩届,就知道底層是通過(guò)LocalDate.until方法來(lái)實(shí)現(xiàn)的。同樣誓酒,Period的between方法也就等同于LocalDate.until方法樟蠕。
但這里有一個(gè)問(wèn)題,就是Period的getDays方法返回的不是兩個(gè)日期間總的天數(shù),有點(diǎn)像月計(jì)算后剩余的天數(shù)寨辩,但也不完全是吓懈,所以不太清楚這個(gè)類(lèi)實(shí)際的意義∶夷看個(gè)例子:
LocalDate localDate1 = LocalDate.of(2018, 01, 30);
LocalDate localDate2 = LocalDate.of(2018, 03, 01);
Period period = Period.between(localDate1, localDate2);
System.out.println(period.getDays());
打映芫:1
我們把第一行代碼換一下值,再看一下:
LocalDate localDate1 = LocalDate.of(2018, 01, 29);
結(jié)果還是打印1
耍攘。再換:
LocalDate localDate1 = LocalDate.of(2018, 01, 28);
LocalDate localDate1 = LocalDate.of(2018, 01, 27);
上面兩個(gè)分別打印1
,2
畔勤。
所以說(shuō)蕾各,在沒(méi)搞清楚上面的方法之前,還是不要貿(mào)然使用庆揪,而如果要計(jì)算兩個(gè)日期間的總的天數(shù)式曲,可以用如下方法來(lái)計(jì)算:
System.out.println(localDate1.until(localDate2, ChronoUnit.DAYS));
System.out.println(ChronoUnit.DAYS.between(localDate1, localDate2));
而對(duì)于Duration來(lái)說(shuō),就更簡(jiǎn)單了缸榛,計(jì)算兩個(gè)時(shí)間之間的秒數(shù)吝羞,納秒數(shù):
LocalTime localTime1 = LocalTime.of(12, 12, 12);
LocalTime localTime2 = LocalTime.of(12, 13, 27);
Duration duration = Duration.between(localTime1, localTime2);
System.out.println(duration.getSeconds()); // 75
但有一點(diǎn)需要注意,Duration中必須要支持秒數(shù)内颗,如果沒(méi)有的話(huà)钧排,將會(huì)報(bào)錯(cuò),如:
LocalDate localDate1 = LocalDate.of(2018, 02, 28);
LocalDate localDate2 = LocalDate.of(2018, 02, 27);
Duration duration = Duration.between(localDate1, localDate2);
System.out.println(duration.getSeconds());
將會(huì)直接提示:
Exception in thread "main" java.time.temporal.UnsupportedTemporalTypeException: Unsupported unit: Seconds
at java.time.LocalDate.until(LocalDate.java:1614)
at java.time.Duration.between(Duration.java:475)
at com.jdk8.DateTest.testPeriod(DateTest.java:40)
at com.jdk8.DateTest.main(DateTest.java:23)
2.6 ChronoUnit
??這個(gè)是個(gè)枚舉類(lèi)型均澳,實(shí)現(xiàn)功能類(lèi)型Period和Duration恨溜,但如果我們看它的底層實(shí)現(xiàn),就可以看到它基本是基于Duration來(lái)實(shí)現(xiàn)的找前。這個(gè)枚舉很簡(jiǎn)單糟袁,我們直接看一些例子就可以了:
LocalDateTime oldDate = LocalDateTime.of(2017, Month.AUGUST, 31, 10, 20, 55);
LocalDateTime newDate = LocalDateTime.of(2018, Month.NOVEMBER, 9, 10, 21, 56);
System.out.println(oldDate);
System.out.println(newDate);
// count between dates
long years = ChronoUnit.YEARS.between(oldDate, newDate);
long months = ChronoUnit.MONTHS.between(oldDate, newDate);
long weeks = ChronoUnit.WEEKS.between(oldDate, newDate);
long days = ChronoUnit.DAYS.between(oldDate, newDate);
long hours = ChronoUnit.HOURS.between(oldDate, newDate);
long minutes = ChronoUnit.MINUTES.between(oldDate, newDate);
long seconds = ChronoUnit.SECONDS.between(oldDate, newDate);
long milis = ChronoUnit.MILLIS.between(oldDate, newDate);
long nano = ChronoUnit.NANOS.between(oldDate, newDate);
System.out.println("\n--- Total --- ");
System.out.println(years + " years");
System.out.println(months + " months");
System.out.println(weeks + " weeks");
System.out.println(days + " days");
System.out.println(hours + " hours");
System.out.println(minutes + " minutes");
System.out.println(seconds + " seconds");
System.out.println(milis + " milis");
System.out.println(nano + " nano");
打印結(jié)果:
2017-08-31T10:20:55
2018-11-09T10:21:56
--- Total ---
1 years
14 months
62 weeks
435 days
10440 hours
626401 minutes
37584061 seconds
37584061000 milis
37584061000000000 nano
2.7 Clock
??時(shí)鐘系統(tǒng),用于查找當(dāng)前時(shí)刻躺盛。通過(guò)指定一個(gè)時(shí)區(qū)项戴,我們可以獲取到當(dāng)前的時(shí)刻,日期槽惫,時(shí)間周叮。所以可以使用一個(gè)時(shí)鐘來(lái)代替System.currenttimemillis()
和 TimeZone.getDefault()
。
在應(yīng)用程序的最佳實(shí)踐是將時(shí)鐘傳遞給任何需要當(dāng)前即刻的方法:
public class MyBean {
private Clock clock; // dependency inject
...
public void process(LocalDate eventDate) {
if (eventDate.isBefore(LocalDate.now(clock)) {
...
}
}
}
我們可以簡(jiǎn)單測(cè)試一下:
// 系統(tǒng)默認(rèn)
Clock systemDefaultClock = Clock.systemDefaultZone();
System.out.println("Current DateTime with system default clock: " + LocalDateTime.now(systemDefaultClock));
System.out.println(systemDefaultClock.millis());
// 世界協(xié)調(diào)時(shí)UTC
Clock systemUTCClock = Clock.systemUTC();
System.out.println("Current DateTime with UTC clock: " + LocalDateTime.now(systemUTCClock));
System.out.println(systemUTCClock.millis());
//芝加哥
Clock clock = Clock.system(ZoneId.of(ZoneId.SHORT_IDS.get("CST")));
System.out.println("Current DateTime with CST clock: " + LocalDateTime.now(clock));
System.out.println(clock.millis());
打咏缧薄:
Current DateTime with system default clock: 2018-02-02T16:26:07.665
1517559967665
Current DateTime with UTC clock: 2018-02-02T08:26:07.665
1517559967665
Current DateTime with CST clock: 2018-02-02T02:26:07.667
1517559967667
并且我們可以使用 millis
方法來(lái)代替 System.currenttimemillis()
则吟。
更多有關(guān)Clock方法實(shí)例可以參考下面鏈接(沒(méi)找到JDK8的,不過(guò)可以參考JDK9的):
https://www.concretepage.com/java/java-9/java-clock
2.8 其他
其中還有一些類(lèi)沒(méi)有詳細(xì)說(shuō)明锄蹂,比如:
- Instant氓仲,表示的是時(shí)間戳,用于記錄某一時(shí)刻的更改(JDK8之前的Timestamp);
- ZoneId 時(shí)區(qū)標(biāo)志,比如用于標(biāo)志歐洲/巴黎敬扛;
- ZoneOffset 時(shí)區(qū)偏移量晰洒,與UTC的偏移量;
- ZonedDateTime 與時(shí)區(qū)有關(guān)的日歷系統(tǒng)啥箭,比如2007-12 03t10:15:30+01歐洲/巴黎谍珊;
- OffsetDateTime 用于與UTC偏移的日期時(shí)間,如如2007-12 03t10:15:30+01:00急侥。
3. 轉(zhuǎn)換
3.1 java.util.Date與LocalDate砌滞,LocalTime,LocalDateTime替換
將Date轉(zhuǎn)換為L(zhǎng)ocalDate坏怪,LocalTime贝润,LocalDateTime可以借助于ZonedDateTime和Instant,實(shí)現(xiàn)如下:
Date date = new Date();
System.out.println("current date: " + date);
// Date -> LocalDateTime
LocalDateTime localDateTime = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
System.out.println("localDateTime by Instant: " + localDateTime);
// Date -> LocalDate
LocalDate localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
System.out.println("localDate by Instant: " + localDate);
// Date -> LocalTime
LocalTime localTime = date.toInstant().atZone(ZoneId.systemDefault()).toLocalTime();
System.out.println("localTime by Instant: " + localTime);
//2. Date -> LocalDateTime
localDateTime = LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault());
System.out.println("localDateTime by ofInstant: " + localDateTime);
output:
current date: Fri Feb 02 16:43:13 CST 2018
localDateTime by Instant: 2018-02-02T16:43:13.073
localDateTime by ofInstant: 2018-02-02T16:43:13.073
localDate by Instant: 2018-02-02
localTime by Instant: 16:43:13.073
由于JDK8實(shí)現(xiàn)了向下兼容铝宵,所以Date里在JDK8版本引入了2個(gè)方法打掘,from
和
toInstant
,所以我們可以借助這兩個(gè)方法來(lái)實(shí)現(xiàn)LocalDateTime到Date的轉(zhuǎn)換鹏秋。將LocalDateTime轉(zhuǎn)為Date如下:
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println("localDateTime: " + localDateTime);
// LocalDateTime -> Date
Date date = Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
System.out.println("LocalDateTime -> current date: " + date);
// LocalDate -> Date尊蚁,時(shí)間默認(rèn)都是00
LocalDate localDate = LocalDate.now();
date = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
System.out.println("LocalDate -> current date: " + date);
output:
localDateTime: 2018-02-02T16:55:52.464
LocalDateTime -> current date: Fri Feb 02 16:55:52 CST 2018
LocalDate -> current date: Fri Feb 02 00:00:00 CST 2018
而單獨(dú)的LocalTime轉(zhuǎn)為Date沒(méi)什么意義,所以如果LocalTime要轉(zhuǎn)為Date侣夷,一般借助于LocalDate和LocalDateTime來(lái)實(shí)現(xiàn)就可以了横朋。
3.2 日期與字符串的轉(zhuǎn)換
??日期與字符串的轉(zhuǎn)換比較簡(jiǎn)單。先說(shuō)轉(zhuǎn)換成日期格式百拓,通過(guò)LocalDate叶撒,LocalTime,LocalDateTime的parse方法和DateTimeFormatter來(lái)實(shí)現(xiàn):
LocalDate localDate = LocalDate.parse("2018-09-09", DateTimeFormatter.ofPattern("yyyy-MM-dd"));
LocalDateTime localDateTime = LocalDateTime.parse("2018-09-10 12:12:12", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
而將日期轉(zhuǎn)為字符串耐版,可以通過(guò)format方法和DateTimeFormatter來(lái)實(shí)現(xiàn):
String localDate = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
String localDateTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
// 也可以通過(guò)DateTimeFormatter的format方法
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
localDateTime = dateTimeFormatter.format(LocalDateTime.now());
毫秒的話(huà)祠够,是SSS,這個(gè)可能不經(jīng)常使用粪牲,不過(guò)也要注意下:yyyy-MM-dd HH:mm:ss.SSS
古瓤。
3.3 時(shí)間戳與LocalDateTime轉(zhuǎn)換
將時(shí)間戳轉(zhuǎn)為L(zhǎng)ocalDateTime,可以借助Instant(其實(shí)就是時(shí)間戳)來(lái)實(shí)現(xiàn):
public static LocalDateTime convertToDate(long timestamp) {
// ofEpochSecond 以秒為單位腺阳, ofEpochMilli 以毫秒為單位
// Instant.ofEpochSecond(timestamp);
Instant instant = Instant.ofEpochMilli(timestamp);
return LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
}
而將LocalDateTime轉(zhuǎn)為時(shí)間戳落君,則同樣可以借助Instant來(lái)實(shí)現(xiàn):
public static long convertToTimestamp() {
LocalDateTime localDateTime = LocalDateTime.now();
return localDateTime.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
}
而至于字符串與時(shí)間戳的轉(zhuǎn)換,借助LocalDateTime來(lái)實(shí)現(xiàn)即可亭引。
總結(jié)
- java.time包下其實(shí)還有一些其他的類(lèi)與方法绎速,如查詢(xún)是否是閏年,日期比較焙蚓,獲取某一年的某一天等等纹冤,我們可以等用到的時(shí)候再去查看不遲洒宝。并且我們可以將我們常用的方法封裝成util包供我們?cè)谑褂玫臅r(shí)候直接調(diào)用。
- JDK8提供的這套API接口基本上封裝了我們平時(shí)常用的所有與日期時(shí)間的相關(guān)操作萌京,所以如果升級(jí)了JDK8雁歌,在處理日期和時(shí)間的時(shí)候盡量多用新的API。
- JDK8中新的日期不但命名優(yōu)雅知残,通俗易懂靠瞎,而且提供了向下兼容的能力,可以無(wú)縫連接求妹。
- 如果用到了Period乏盐,注意它的getDays方法。
本文實(shí)例參考自:
Java 8 – Period and Duration examples
https://docs.oracle.com/javase/8/docs/api/
Java8 日期/時(shí)間(Date Time)API指南