[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 패키지의 클래스
- LocalDate
- 날짜
- LocalTime
- 시간
- LocalDateTime
- 날짜 + 시간
- ZonedDateTime
- 날짜 + 시간 + 시간대
- cf) Calendar : 날짜 + 시간 + 시간대 모두 포함
- Period
- 두 날짜 간의 차이
- 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"