왜 자바 8 은 새로운 날짜 와 시간 라 이브 러 리 를 도입 해 야 합 니까?

1.Date 날짜 출력 가 독성 이 떨 어 집 니 다.

Date date = new Date();
System.out.println(date);
출력 결과 출력:
Sat Nov 14 11:03:41 CST 2020
2.Date 날짜 의 해석,포맷 은 JDK 자체 api 를 통 해 이 루어 지 는 것 이 귀 찮 습 니 다.보통 제3자 의 날짜 시간 라 이브 러 리 를 사용 합 니 다.예 를 들 어 joda-time,comons-lang 등 입 니 다.
자바 8 에 서 는 어떤 날짜 와 시간 류 를 제공 합 니까?
java.time 패키지 에 새로운 클래스 를 많이 제공 합 니 다.보통 LocalDate,LocalTime,LocalDateTime,ZoneId,ZoneDateTime 을 사용 합 니 다.관계 도 는 다음 과 같다.

LocaDate 라 는 클래스 자 체 는 시간 과 시간 대 정 보 를 포함 하지 않 고 날짜 정보 만 포함 합 니 다.자주 사용 하 는 값 을 얻 기 위해 많은 방법 을 제공 합 니 다:무슨 요일,몇 월...
자주 사용 하 는 정적 구조 LocaDate 방법

LocalDate.of(2020, 11, 14); //     
LocalDate.of(2020, Month.NOVEMBER, 14); //        Month   
LocalDate.ofYearDay(2020, 10); //2020  10  => 2020-01-10
LocalDate.now(); //    
System.out.println(LocalDate.now()); //           => 2020-11-14
LocaDate 에서 자주 사용 하 는 인 스 턴 스 방법

LocalDate now = LocalDate.of(2020, 11, 14);
System.out.println(now.getMonth()); //      => NOVEMBER
System.out.println(now.getMonthValue()); //      => 11
System.out.println(now.getDayOfMonth()); //   => 14
System.out.println(now.getDayOfYear()); //         => 319
System.out.println(now.getDayOfWeek()); //      => SATURDAY
System.out.println(now.lengthOfMonth()); //      => 30
System.out.println(now.lengthOfYear()); //      => 366
LocalTime 은 시간 정보 만 포함 합 니 다.

LocalTime.of(12, 9, 10); // 、 、 
LocalTime.now();
LocalTime time = LocalTime.of(12, 9, 10);
System.out.println(time.getHour());
System.out.println(time.getMinute());
System.out.println(time.getSecond());
LocalDateTime 은 이러한 종류의 이름 에서 알 수 있 듯 이 LocalDate,LocalTime 을 합 친 것 으로 날짜 와 시간 만 포함 하고 시간 대 정 보 는 포함 되 지 않 습 니 다.
구조 방식 은 정적 방법 으로 직접 만 들 수도 있 고 LocalDate,LocalTime 을 통 해 합 칠 수도 있 습 니 다.

LocalDateTime.of(LocalDate.now(), LocalTime.now());
LocalDateTime.of(2020, 11, 14, 13, 10, 50);
LocalDate.now().atTime(LocalTime.now());
LocalTime.now().atDate(LocalDate.now());
LocalDateTime.now();
LocalDateTime 은 LocalDate,LocalTime 의 합병 이기 때문에 LocalDate,LocalTime 의 실례 적 인 방법 은 기본적으로 LocalDateTime 에서 찾 을 수 있다
ZoneId 는 오래된 버 전의 TimeZone 을 대체 하 는 데 사용 되 며,모든 ZoneId 는 특정한 지역 표 지 를 가지 고 있다.

ZoneId.of("Asia/Shanghai");
 ZoneId.systemDefault()
모든 지역 표 지 를 보면 ZoneId 소스 에 들 어 갈 수 있 습 니 다.
ZoneDateTime 은 날짜,시간,시간 정보 가 있 는 LocalDateTime 과 ZoneId 의 조합 입 니 다.

ZonedDateTime zonedDateTime = ZonedDateTime.of(LocalDateTime.now(), ZoneId.systemDefault());
ZonedDateTime.of(LocalDate.now(),LocalTime.now(),ZoneId.of("Asia/Shanghai"));
항상 우 리 는 두 시간 사이 의 차 이 를 구 해 야 하 는 시간 을 만 나 는데 어떻게 실현 합 니까?
Java8 도 해당 API 지원,Duration,Period 를 제공 합 니 다.

Duration between = Duration.between(LocalTime.of(13, 0), LocalTime.of(14, 0)); 
between.getSeconds(); //            => 3600
Duration 은 초 와 밀리초 로 시간의 길 이 를 기록 하기 때문에 두 개의 LocalTime,DateLocalTime,Zoned DateTime 만 처리 할 수 있 습 니 다.LocalDate 가 들 어 오 면 이상 을 던 집 니 다.

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.haixue.crm.stock.service.LocalTest.testDate(LocalTest.java:121)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
 at java.lang.reflect.Method.invoke(Method.java:498)
 at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
 at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
 at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
 at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
 at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
 at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
 at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
 at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
 at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
 at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
 at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
 at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
 at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
 at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
 at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
 at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
 at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
 at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)

이 경우 Period 를 사용 할 수 있 습 니 다.

Period between1 = Period.between(LocalDate.of(2020, 11, 13), LocalDate.of(2020, 11, 13));
between1.getDays(); //        => 1
시간 날짜 의 더 높 은 작업
시간 과 날짜 에 대한 수정 증가 와 감 소 는 모두 제3자 의존 패 킷 작업 을 통 해 이 루어 진 것 으로 생각 되 었 으 며,현재 원생 API 가 지원 되 고 있 습 니 다.

LocalDate now2 = LocalDate.of(2020, 11, 13);
System.out.println(now2.plusDays(2));  // 2  => 2020-11-15
System.out.println(now2.plusMonths(1));  // 1  => 2020-12-13
System.out.println(now2.plusWeeks(1));  //    => 2020-11-20
System.out.println(now2.minusDays(1));  //    => 2020-11-12
System.out.println(now2.minusMonths(1)); //    => 2020-10-13
System.out.println(now2.minusYears(1));  //    => 2019-11-13
System.out.println(now2.withYear(2021)); //    => 2021-11-13
때때로 우 리 는 이 달의 마지막 날,이 달의 첫날,다음 일요일 로 날 짜 를 조정 해 야 하 는 것 을 만 날 수 있다.이러한 수 요 는 Temporal Adjuster 를 사용 하여 잘 실 현 될 수 있 습 니 다.Temporal Adjuster 는 많은 맞 춤 형 날짜 작업 을 실현 할 수 있 습 니 다.자바 8 은 Temporal Adjusters 에서 기본 적 인 많은 실현 을 제 공 했 습 니 다.

LocalDate now3 = LocalDate.of(2020, 11, 13);
System.out.println(now3.with(TemporalAdjusters.firstDayOfYear())); //        => 2020-01-01
System.out.println(now3.with(TemporalAdjusters.next(DayOfWeek.MONDAY))); //      => 2020-11-16
System.out.println(now3.with(TemporalAdjusters.lastDayOfMonth())); //         => 2020-11-30
System.out.println(now3.with(TemporalAdjusters.lastDayOfYear())); //         => 2020-12-31
사용자 정의 TemporalAdjuster 는 당일 의 시작 시간 과 당일 의 마지막 시간 을 가 져 옵 니 다.

LocalDateTime localDateTime = LocalDateTime.of(2020, 11, 13, 10, 10, 10);
System.out.println(localDateTime);
System.out.println(localDateTime.with((temporal) -> 
 temporal.with(ChronoField.SECOND_OF_DAY, 0))); //       => 2020-11-13T00:00
System.out.println(localDateTime.with((temporal) ->
 temporal.with(ChronoField.SECOND_OF_DAY, temporal.range(ChronoField.SECOND_OF_DAY).getMaximum()))); //           => 2020-11-13T23:59:59
해석,포맷
날짜 에 대한 문자열 해석 과 포맷 작업 은 자주 사용 되 며,먼저 제3자 가방 을 사용 하지 않 고 날짜 해석 을 어떻게 간단하게 하 는 지 살 펴 보 겠 습 니 다.

System.out.println(LocalDateTime.parse("2020-11-14T20:50:00")); //   :2020-11-14T20:50
System.out.println(LocalDateTime.parse("2020/11/14 20:50:00",
  DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss"))); //   :2020-11-14T20:50
포맷 을 실현 하 는 것 도 마찬가지 로 간단 하 다

LocalDate now4 = LocalDate.of(2020, 11, 13);
System.out.println(now4.format(DateTimeFormatter.ofPattern("yyyy/MM/dd"))); //  :2020/11/13

LocalDateTime localDateTime2 = LocalDateTime.of(2020, 11, 13, 10, 10, 10);
System.out.println(localDateTime2.format(DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss"))); //  :2020/11/13 10:10:10

마지막 한 마디
자바 8 이 왜 새로운 날짜 와 시간 라 이브 러 리 를 도입 해 야 하 는 지 에 대한 글 은 여기까지 입 니 다.더 많은 자바 8 이 새로운 날짜 와 시간 라 이브 러 리 를 도입 하 는 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 부탁드립니다!

좋은 웹페이지 즐겨찾기