time 패키지 (util.Date와 util.Calendar의 문제, LocalDate, LocalDateTime, DateTimeFormatter)
참조문서
- http://d2.naver.com/helloworld/645609
- https://docs.oracle.com/javase/8/docs/api/java/time/package-frame.html
- http://jekalmin.tistory.com/entry/%EC%9E%90%EB%B0%94-18-%EB%82%A0%EC%A7%9C-%EC%A0%95%EB%A6%AC
jdk 1.8 부터 날짜 API 가 좋아졌다고 한다. java.util.Date 와 Calendar 를 사용했을 때도 크게 불편한 건 못느꼈지만(불편했다고하면 0부터 시작한다는거?ㅋㅋ) 새로운 java.time 패키지를 알아보자.
1. 이전 방식의 문제들(util.Date, util.Calendar)
찾아보니까 문제가 많군..?
- 복잡한 날짜 계산 : 그레고리력에서 율리우스력을 적용하며 발생한 오차날짜 생략, 서머타임 등등 뭐 이벤트 터지면 시간대가 비는 등등..
- 독특한 시간관리 : 시간대 데이터베이스에서 관리, OS와 별도
- 불변 객체가 아님
- 상수필드 남용
- 1월이 0부터 시작함
- 일관성 없는 요일 상수
- Calendar.get(Calendar.DAYOFWEEK) : 일요일은 1
- Date.getDay() : 일요일은 0
- 날짜 생성은 Date 객체, 날짜 연산은 Canlender 객체, 최종 결과는 다시 Date객체
이를 해결하기 위한 노력들
- joda-time 같은 라이브러리 들이 등장
- jdk 1.8 부터는 새로운 time 패키지로 해결
2. java.time 패키지
하루를 86400초만 계산한다. 공식시간만을 사용한다. 아래는 대표적인 클래스와 메소드들이다.
- Instant : 1970년 1월 1일부터 시간을 nanosecond 단위로 센다.
- LocalDate : 년월일까지 표현
- LocalDateTime : 년월일시분초 까지 표현
- LocalTime : 시분초만 표현
- Period : 두 날짜 사이의 년월일로 표현되는 기간 (LocalDate 사용)
- Duration : 두 시간 사이에 일시분초로 표현되는 기간 (Instant 사용)
- ChronoUnit : 한가지의 단위를 표현하기 위한 클래스 (년, 월, 일, 시, 분, 초 등)
- DayOfWeek : 요일
- ZonedDateTime : 구역에 해당하는 년, 월, 일, 시, 분, 초, 나노초 표현
공통적으로 많이 쓰는 메소드들
- now() : 지금을 클래스에 맞게 반환
- of(파라미터들) : 이 날짜를 클래스에 맞게 반환
- plus, minus : 해당 클래스에 맞게 날짜 증감
- ex. LocalDate.now().plusDays(1) : 내일 날짜
- format(formatter) : formatter를 사용하여이 날짜의 형식을 지정, 변환
- parse(String, formatter) : 문자열을 formatter 형식으로 변환한다. formatter를 안쓰면 기본형식으로 변환
3. java.time.format 패키지
time의 포맷변환 등으로 많이 쓰인다. java.time 패키지의 클래스들을 지원한다. 미리 정의된 Formatter 를 사용할 수도 있고, locale 종속 Formatter, 커스텀 Formatter 등을 사용할 수 있다.
- DateTimeFormatter
변환 예제
- LocalDate -> String : LocalDate.now().format(DateTimeFormatter.ISO_LOCAL_DATE);
- LocalDateTime -> String : LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss", Locale.KOREA));
- String -> LocalDate : LocalDate.parse("2018-02-21");
- String -> LocalDateTime : LocalDateTime.parse("2018-02-21 16:30:00", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
출처: https://sjh836.tistory.com/138?category=679845 [빨간색코딩]
'JAVA > Java' 카테고리의 다른 글
스레드덤프 (thread dump) (0) | 2021.03.21 |
---|---|
중첩클래스를 알아보자 (내부클래스, 정적 중첩클래스, 지역클래스, 익명클래스) (0) | 2021.03.21 |
최상위 객체 Object 클래스(주요 메소드, finalize 이슈) (0) | 2021.03.21 |
apache commons (StringUtils) (0) | 2021.03.19 |
enum (이전 방식, 개념, 동작방식, 사용예제, 관련메소드) (0) | 2021.03.19 |
서블릿 (servlet, jsp와 차이점, 컨테이너, 동작원리, web.xml) (0) | 2021.03.19 |
static 키워드 (메모리 상 위치, 클래스 변수, 클래스 메소드, static 블록) (0) | 2021.03.19 |
접근제어자 (public, protected, private, getter, setter) (0) | 2021.03.19 |