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 |