[Java] java.time패키지

java.time 패키지

  • JDK 1.8부터 추가됨
  • java.time 패키지에 속한 클래스들은 불변
    • 멀티 쓰레드 환경에서 여러 쓰레드가 동시에 객체에 접근할 수 있기 때문에 변경 불가한 객체여야 한다.
패키지설명
java.time날짜와 시간을 다루는데 필요한 핵심 클래스 제공
java.time.chrono표준(ISO)이 아닌 달력 시스템을 위한 클래스 제공
java.time.format날짜와 시간을 파싱하고, 형식화하기 위한 클래스 제공
java.time.temporal날짜와 시간의 필드와 단위를 위한 클래스 제공
java.time.zone시간대(time-zone)와 관련대 클래스 제공

java.time 패키지의 클래스

  1. LocalDate
    • 날짜
  2. LocalTime
    • 시간
  3. LocalDateTime
    • 날짜 + 시간
  4. ZonedDateTime
    • 날짜 + 시간 + 시간대
    • cf) Calendar : 날짜 + 시간 + 시간대 모두 포함
  5. Period
    • 두 날짜 간의 차이
  6. Duration
    • 두 시간 간의 차이

java.time 패키지 객체 생성하기

1. now()
- 현재 날짜와 시간을 저장하는 객체를 생성

LocalDate date = LocalDate.now(); //2020-07-19
LocalTime time = LocalTime.now(); //23:22:01.875
LocalDateTime dateTime = LocalDateTime.now(); //2020-07-19T21:53:01.875
ZonedDateTime zDateTime = ZonedDateTime.now() //2020-07-19T21:53:01.875+09:00[Asia/Seoul]

2. of()
- 해당 필드의 값을 순서대로 지정하는 메소드 - 각 클래스마다 다양한 종류의 of() 정의되어 있음

LocalDate date = LocalDate.of(1999,01,01); 
LocalTime time = LocalTime.now(23,59,59); 

LocalDateTime dateTime = LocalDateTime.of(date, time); 
ZonedDateTime zDateTime = ZonedDateTime.of(dateTime, ZoneId.of("Asia/Seoul"));

필드 값 변경

  • 날짜 및 시간의 특정 필드 값 변경

1. with()

LocalDate date = LocalDate.now();
date = date.withYear(1999); //년도 1999년도로 변경

2. plus()
3. minus()

날짜와 시간 비교

  • LocalDate , LocalTime 클래스는 compareTo() 오버라이딩 되어 있어 클래스간 비교 가능
    int result = date1.compareTo(date2); // 동일 시 :0 , date1이 이전 : -1, 이후 : 1
    
  • 추가적으로 isAfter(), isBefore(), isEqual() 메서드 제공

1. isAfter()

2. isBefore()

3. isEqual()

날짜 및 시간의 차이 (Period & Duration)

  • Period : 날짜 - 날짜
LocalDate date1 = LocalDate.of(2019,1,1);
LocalDate date2 = LocalDate.of(2020,1,1);

Period period = Period.between(date1, date2);
- date1이 date2보다 이전 날짜일 경우 양수 / 이후 날짜일 경우 음수로 Period에 저장
  • Duration : 시간 - 시간 ```java LocalTime time1 = LocalTime.of(00,00,00); LocalTime time2 = LocalTime.of(12,34,56);

Duration duration = Duration.between(time1, time2);



### Parsing
- 날짜 및 시간 파싱을 위한 클래스들은 java.time.format 패키지 내에 있음. 그 중에서도 `DateTimeFormatter`가 핵심
- `format()` 메서드를 사용해 파싱 가능 : `DateTimeFormatter` 클래스뿐만 아니라, `LocalDate`, `LocalTime` 클래스에도 `format()` 메서드가 있기 때문에 편한대로 취사선택 사용

```java
LocalDate date = LocalDate.of(2020,07,19);
String yyyymmdd = DateTimeFormatter.ISO_LOCAL_DATE.format(date); // "2020-07-19"
String yyyymmdd2 = date.format(DateTimeFormatter.ISO_LOCAL_DATE); // "2020-07-19"