LocalDateTime使用及相關(guān)類使用

LocalDateTime對日期的一些獲取操作:

LocalDate內(nèi)部維護(hù)了LocalDate和LocalTime(內(nèi)置方法基本相通)
大可使用LocalDateTime的相關(guān)方法獲取時間的一些相關(guān)數(shù)值

LocalDateTime now = LocalDateTime.now();   // 2021-05-03T16:02:46.498
int year = now.getYear();                  // 2021
Month month = now.getMonth();              // MAY
int monthValue = now.getMonthValue();      // 5
int dayOfYear = now.getDayOfYear();        // 123
int dayOfMonth = now.getDayOfMonth();      // 3
DayOfWeek dayOfWeek = now.getDayOfWeek();  // MONDAY
int dayOfWeekValue = dayOfWeek.getValue(); // 1
int hour = now.getHour();                  // 16
int minute = now.getMinute();              // 2
int second = now.getSecond();              // 46

long seconds = Instant.now().getEpochSecond();    // 秒時間戳(10位) 1620028966
long milliSeconds = Instant.now().toEpochMilli(); // 毫秒時間戳(13位) 1620028966499

LocalDateTime dateTimeFromSecond = LocalDateTime.ofInstant(
    Instant.ofEpochSecond(seconds), ZoneOffset.ofHours(8)
);  // 秒轉(zhuǎn)datetime 2021-05-03T16:02:46

LocalDateTime dateTimeFromMilliSecond = LocalDateTime.ofInstant(
    Instant.ofEpochMilli(milliSeconds), ZoneOffset.ofHours(8)
); // 毫秒轉(zhuǎn)datetime 2021-05-03T16:02:46.499

日期格式化轉(zhuǎn)換&與Date之間轉(zhuǎn)化

格式化日期使用DateTimeFormatter.
LocalDateTime和Date都有toInstant()方法

//localDateTime轉(zhuǎn)字符串
String format = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));// 2021-05-03 17:08:02
//字符串轉(zhuǎn)localDateTime
LocalDateTime dateTime = LocalDateTime.parse(format,DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));// 2021-05-03T17:08:02

//localDateTime轉(zhuǎn)Date
Date date = Date.from(dateTime.toInstant(ZoneOffset.ofHours(8)));// Mon May 03 17:08:02 CST 2021
//Date轉(zhuǎn)localDateTime
LocalDateTime fromDate = date.toInstant().atOffset(ZoneOffset.ofHours(8)).toLocalDateTime();// 2021-05-03T17:08:02

日期加減

/*plus->加  minus->減*/
LocalDateTime localDateTime = LocalDateTime.now();
//以減法為例:plus對應(yīng)+
LocalDateTime localDateTime1 = localDateTime.minusSeconds(1);
LocalDateTime localDateTime2 = localDateTime.minusMinutes(1);
LocalDateTime localDateTime3 = localDateTime.minusHours(1);
LocalDateTime localDateTime4 = localDateTime.minusDays(1);
LocalDateTime localDateTime5 = localDateTime.minusWeeks(1);
LocalDateTime localDateTime6 = localDateTime.minusMonths(1);
LocalDateTime localDateTime7 = localDateTime.minusYears(1);

判斷日期大小

LocalDateTime now = LocalDateTime.now();
LocalDateTime yesterday = now.minusDays(1);
boolean after = now.isAfter(yesterday);// 'now'是'昨天'之后?true
boolean before = now.isBefore(yesterday);// 'now'是'昨天'之前?false
boolean equal = now.isEqual(yesterday);// 相等?false

其他類

Instant:時刻
Instant instant=Instant.now();
long second = instant.getEpochSecond();
long milliSecond = instant.toEpochMilli();
Duration:時間差

Duration內(nèi)部維護(hù)了seconds(秒)和nanos(納秒)
(獲取一個時間差值時使用)

Duration duration = Duration.between(
    LocalDateTime.now(), LocalDateTime.now().plusDays(1)
);  // PT24H
/*可以直接獲取秒和納秒(getXX),但是換算成天、小時、分鐘等需要換算(toXX)*/
long seconds = duration.getSeconds();             // 86400
long seconds2 = duration.get(ChronoUnit.SECONDS); // 86400
int nano = duration.getNano();                    // 0
long nanos = duration.get(ChronoUnit.NANOS);      // 0

long days = duration.toDays();                    //換算成天
long hours = duration.toHours();                  //換算成小時...
//其他創(chuàng)建方法:
Duration ofDays = Duration.ofDays(1);             // PT24H
Duration ofHours = Duration.ofHours(1);           // PT1H
Duration ofMinutes = Duration.ofMinutes(1);       // PT1M
Duration ofSeconds = Duration.ofSeconds(1);       // PT1S
Period:時間段

Period內(nèi)部維護(hù)了三個int(year,month,day)
(偏向人的理解,不能使用它計(jì)算差值,需組合使用)

Period between = Period.between(
    LocalDate.of(2020, 1, 22), LocalDate.of(2020, 2, 9)
); // P18D
int year = between.getYears();   // 0
int month = between.getMonths(); // 0
int day = between.getDays();     // 18

Period period = Period.of(1, 2, 3); // P1Y2M3D
long years = period.get(ChronoUnit.YEARS);            // 1
long months = period.get(ChronoUnit.MONTHS);          // 2
long days = period.get(ChronoUnit.DAYS);              // 3
Clock:時鐘

有4個實(shí)現(xiàn)類,例子使用的是SystemClock;
永遠(yuǎn)返回最新的時間?。?chuàng)建時需要指定時區(qū)。

Clock clock1 = Clock.system(ZoneOffset.ofHours(8));  // SystemClock[+08:00]
Clock clock2 = Clock.systemUTC();                    // SystemClock[Z]
Clock clock3 = Clock.systemDefaultZone();            // SystemClock[Asia/Shanghai]

long millis1 = clock1.millis();      // 1620203451235
long millis2 = clock2.millis();      // 1620203451235
Thread.sleep(12312);
long millis3 = clock2.millis();      // 1620203463548
Instant instant1 = clock1.instant(); // 2021-05-05T08:31:03.548Z
Instant instant2 = clock2.instant(); // 2021-05-05T08:31:03.548Z
Thread.sleep(2342);
Instant instant3 = clock2.instant(); // 2021-05-05T08:31:05.891Z

分析一波Clock:

millis1、millis2、millis3可以看出,時區(qū)對獲取時間戳沒有影響,所以1.時間戳是不存在時區(qū)區(qū)別的,2.SystemClock永遠(yuǎn)返回最新的時間(Instant)

ChronoUnit:日期差值

該類適合用來計(jì)算日期時間的差值(重點(diǎn)使用)

long years = ChronoUnit.YEARS.between( LocalDateTime.of(2013,3,14,12,34,34),LocalDateTime.now());
long months = ChronoUnit.MONTHS.between( LocalDateTime.of(2013,3,14,12,34,34),LocalDateTime.now());
long days = ChronoUnit.DAYS.between( LocalDateTime.of(2013,3,14,12,34,34),LocalDateTime.now());
long hours = ChronoUnit.HOURS.between( LocalDateTime.of(2013,3,14,12,34,34),LocalDateTime.now());
long minutes = ChronoUnit.MINUTES.between( LocalDateTime.of(2013,3,14,12,34,34),LocalDateTime.now());
long seconds = ChronoUnit.SECONDS.between( LocalDateTime.of(2013,3,14,12,34,34),LocalDateTime.now());

log.info("相差:{}年",years);
log.info("相差:{}月",months);
log.info("相差:{}日",days);
log.info("相差:{}時",hours);
log.info("相差:{}分",minutes);
log.info("相差:{}秒",seconds);

/*
相差:9年
相差:110月
相差:3354日
相差:80498時
相差:4829890分
相差:289793422秒
*/

總結(jié)

  • Duration和Period相比,Duration中維護(hù)的是秒和納秒,Period維護(hù)的是年月日,所以Duration時間粒度更小。

  • Clock和Instant相比,Instant內(nèi)部維護(hù)了seconds和nanos,通過Clock每次獲取Instant都是最新時間,Instant基本等同于維護(hù)了一個時間戳(seconds+nanos)僅僅適合作轉(zhuǎn)化中間值,Clock內(nèi)部維護(hù)的是時區(qū)。

  • Duration和Period獲取時間差的時候,可以使用get方法,參數(shù)使用枚舉:ChronoUnit定義時間粒度?;蛘咧苯觛etSeconds、getDays...

  • 通過參考LocalDateTime.now()方法,獲取系統(tǒng)默認(rèn)的ZoneOffSet:

 ZoneOffset.ofHours(8)
     //OR
 Clock defaultClock=Clock.systemDefaultZone();
 ZoneOffset zoneOffset = defaultClock.getZone().getRules().getOffset(defaultClock.instant());

月、周對應(yīng)value值

沒有0.都是1開始,符合現(xiàn)實(shí)說法

Month Month.getValue
1月 JANUARY 1
2月 FEBRUARY 2
3月 MARCH 3
4月 APRIL 4
5月 MAY 5
6月 JUNE 6
7月 JULY 7
8月 AUGUST 8
9月 SEPTEMBER 9
10月 OCTOBER 10
11月 NOVEMBER 11
12月 DECEMBER 12
DayOfWeek DayOfWeek.getValue
周一 MONDAY 1
周二 TUESDAY 2
周三 WEDNESDAY 3
周四 THURSDAY 4
周五 FRIDAY 5
周六 SATURDAY 6
周日 SUNDAY 7

參考:LocalDateTime用法大全_博學(xué)de叫獸-CSDN博客_localdatetime使用

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. 概述 ??JDK1.8中對日期的改動是特別大的,基本上是引入了一套全新的API 。因?yàn)橛捎谠瓉砝吓f的日期AP...
    騎著烏龜去看海閱讀 15,424評論 0 15
  • 目錄: 什么是時間?這是一個物理概念和哲學(xué)問題。物理學(xué)認(rèn)為時間是一種尺度,一個標(biāo)量,借著時間,事件發(fā)生之先后可以按...
    Wayne566閱讀 528評論 0 1
  • 轉(zhuǎn)載于:https://www.cnblogs.com/feika/p/4448924.html 伴隨lambda...
    雨筍情緣閱讀 1,024評論 0 0
  • 背景 java的日期和時間API設(shè)計(jì)不理想,java8引入新的時間和日期API就是為了解決這個問題。 java8引...
    李福春carter閱讀 243評論 0 0
  • 我是黑夜里大雨紛飛的人啊 1 “又到一年六月,有人笑有人哭,有人歡樂有人憂愁,有人驚喜有人失落,有的覺得收獲滿滿有...
    陌忘宇閱讀 8,889評論 28 54

友情鏈接更多精彩內(nèi)容