JDK1.8-日期使用

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è)包:

  1. java.time包:JDK8中的基礎(chǔ)包苹威,所有常用的基礎(chǔ)類(lèi)都是這個(gè)包的一部分,如LocalDate驾凶,LocalTime牙甫,LocalDateTime等等,所有這些類(lèi)都是不可變且線(xiàn)程安全的调违;
  2. java.time.chrono包:這個(gè)包為非ISO的日歷系統(tǒng)定義了一些API窟哺,我們可以在借助這個(gè)包中的一些類(lèi)擴(kuò)展我們自己的日歷系統(tǒng);
  3. java.time.format包:這個(gè)包很明顯了技肩,格式化和解析日期時(shí)間對(duì)象且轨,一般java.time包中的類(lèi)都差不多能滿(mǎn)足我們的需求了,如果有需要虚婿,可以調(diào)用這個(gè)包下的類(lèi)自定義解析方式旋奢;
  4. java.time.temporal包:這個(gè)包很有意思,封裝了一些獲取某個(gè)特定日期和時(shí)間的接口然痊,比如某月的第一天或最后一天至朗,并且這些方法都是屬于特別好認(rèn)的方法。
  5. java.time.zone包:這個(gè)包就是時(shí)區(qū)相關(guān)的類(lèi)了剧浸。

下面對(duì)ISO-8601簡(jiǎn)單描述一下锹引,參考自百度百科:

  1. ISO-8601: 國(guó)際標(biāo)準(zhǔn)化組織制定的日期和時(shí)間的表示方法,全稱(chēng)為《數(shù)據(jù)存儲(chǔ)和交換形式·信息交換·日期和時(shí)間的表示方法》唆香,簡(jiǎn)稱(chēng)為ISO-8601嫌变。
  2. 日的表示:小時(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。
  3. 日期和時(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):

  1. LocalDateTime默認(rèn)的格式是 2018-01-29T21:23:26.774 這種格式,這可能與我們經(jīng)常使用的格式不太符合,所以我們可以指定格式凸克。
  2. DateTimeFormatter本身提供了許多靜態(tài)格式化常量议蟆,我們可以參考使用,如果不能滿(mǎn)足我們的需求的話(huà)萎战,我們可以自定義咐容;

LocalDateTime的toString方法:

@Override
public String toString() {
    return date.toString() + 'T' + time.toString();
}
  1. LocalDateLocalTime蚂维,LocalDateTime這三個(gè)類(lèi)基本上處理了大部分的日期戳粒,時(shí)間。而與這三個(gè)類(lèi)經(jīng)常結(jié)合使用的還有如下幾個(gè)類(lèi):Year,Month,YearMonth,MonthDay,DayOfWeek虫啥。
  2. 并且蔚约,我們?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è)分別打印12畔勤。

所以說(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ō)明锄蹂,比如:

  1. Instant氓仲,表示的是時(shí)間戳,用于記錄某一時(shí)刻的更改(JDK8之前的Timestamp);
  2. ZoneId 時(shí)區(qū)標(biāo)志,比如用于標(biāo)志歐洲/巴黎敬扛;
  3. ZoneOffset 時(shí)區(qū)偏移量晰洒,與UTC的偏移量;
  4. ZonedDateTime 與時(shí)區(qū)有關(guān)的日歷系統(tǒng)啥箭,比如2007-12 03t10:15:30+01歐洲/巴黎谍珊;
  5. 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é)

  1. java.time包下其實(shí)還有一些其他的類(lèi)與方法绎速,如查詢(xún)是否是閏年,日期比較焙蚓,獲取某一年的某一天等等纹冤,我們可以等用到的時(shí)候再去查看不遲洒宝。并且我們可以將我們常用的方法封裝成util包供我們?cè)谑褂玫臅r(shí)候直接調(diào)用。
  2. JDK8提供的這套API接口基本上封裝了我們平時(shí)常用的所有與日期時(shí)間的相關(guān)操作萌京,所以如果升級(jí)了JDK8雁歌,在處理日期和時(shí)間的時(shí)候盡量多用新的API。
  3. JDK8中新的日期不但命名優(yōu)雅知残,通俗易懂靠瞎,而且提供了向下兼容的能力,可以無(wú)縫連接求妹。
  4. 如果用到了Period乏盐,注意它的getDays方法。

本文實(shí)例參考自:
Java 8 – Period and Duration examples
https://docs.oracle.com/javase/8/docs/api/
Java8 日期/時(shí)間(Date Time)API指南

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末制恍,一起剝皮案震驚了整個(gè)濱河市父能,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌吧趣,老刑警劉巖法竞,帶你破解...
    沈念sama閱讀 211,348評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件耙厚,死亡現(xiàn)場(chǎng)離奇詭異强挫,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)薛躬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén)俯渤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人型宝,你說(shuō)我怎么就攤上這事八匠。” “怎么了趴酣?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,936評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵梨树,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我岖寞,道長(zhǎng)抡四,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,427評(píng)論 1 283
  • 正文 為了忘掉前任仗谆,我火速辦了婚禮指巡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘隶垮。我一直安慰自己藻雪,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,467評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布狸吞。 她就那樣靜靜地躺著勉耀,像睡著了一般指煎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上瑰排,一...
    開(kāi)封第一講書(shū)人閱讀 49,785評(píng)論 1 290
  • 那天贯要,我揣著相機(jī)與錄音,去河邊找鬼椭住。 笑死崇渗,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的京郑。 我是一名探鬼主播宅广,決...
    沈念sama閱讀 38,931評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼些举!你這毒婦竟也來(lái)了跟狱?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,696評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤户魏,失蹤者是張志新(化名)和其女友劉穎驶臊,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體叼丑,經(jīng)...
    沈念sama閱讀 44,141評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡关翎,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,483評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鸠信。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片纵寝。...
    茶點(diǎn)故事閱讀 38,625評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖星立,靈堂內(nèi)的尸體忽然破棺而出爽茴,到底是詐尸還是另有隱情,我是刑警寧澤绰垂,帶...
    沈念sama閱讀 34,291評(píng)論 4 329
  • 正文 年R本政府宣布室奏,位于F島的核電站,受9級(jí)特大地震影響劲装,放射性物質(zhì)發(fā)生泄漏胧沫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,892評(píng)論 3 312
  • 文/蒙蒙 一酱畅、第九天 我趴在偏房一處隱蔽的房頂上張望琳袄。 院中可真熱鬧,春花似錦纺酸、人聲如沸窖逗。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)碎紊。三九已至佑附,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間仗考,已是汗流浹背音同。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留秃嗜,地道東北人权均。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像锅锨,于是被迫代替她去往敵國(guó)和親叽赊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,492評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容