1. java의 날짜와 시간 클래스 변천사
1. java.util.Date (java 1.0)
- 날짜를 의미하는 Date라는 클래스의 이름과 달리 특정 시점을 날짜가 아닌 밀리초 단위로 표현
- 1900년을 기준으로 하는 오프셋, 0에서 시작하는 달 인덱스 등 모호한 설계로 유용성이 떨어짐
- ex) 2017년 9월 21일을 가르키는 Date 인스턴스를 만드는 코드
(자바 9가 나온 날짜..)
Date date = new Date(117, 8, 21);
// 출력 결과
// Thu Sep 21 00:00:00 KST 2017
2. java.util.Calendar (java 1.1)
- Date 클래스의 여러 메서드를 deprecated 하고 대안으로 나온 클래스
- 0에서 시작하는 달 인덱스가 변하지 않음
- DateFormat 등의 클래스들은 Date 클래스에만 작동함
- DateFormat 도 문제가 있었다. 스레드 안전하지 않아서 두 스레드가 동시에 하나의 formatter로 날짜를 파싱하면 문제가 발생할 수 있음
- Date, Calendar 모두 가변 클래스인 점도 문제(기존 값을 변경할 수 있다)
3. Joda-Time
- 위의 클래스들이 가진 문제점들로 개발자들은 joda-time 이라는 서드파티 라이브러리를 많이 사용해왔음
4. java.time (java 8)
- 자바 8에서 joda-time 의 클래스들이 java.time 의 패키지로 추가됨
- 주요 클래스
- LocalDate
- LocalTime
- LocalDateTime
- ZonedDateTime
- Duration 및 Period
- DateTimeFormatter
2. java.time 의 다양한 날짜 객체
1. LocalDate & LocalDateTime
- 날짜를 표현하는 클래스 LocalDate
- 시간을 표현하는 클래스 LocalTime
- LocalDate + LocalTime = LocalDateTime
1-1. Instant
- 에포크 타임(EPOCH TIME, 1970-01-01 00:00:00 UTC)부터 경과된 시간을 나노초 단위로 표현한 것
- 사람이 보기에는 불편하지만 계산은 편리함
- 항상 UTC를 기준으로 하기 때문에, LocalTime과 차이가 있을 수 있음
- UTC? 1972년 1월 1일부터 시행된 국제 표준시로 세슘 원자 진동수를 기반으로 측정한 시간, 영국 그리니치 천문대를 기준으로 계산
2. OffsetDateTime
- LocalDateTime + ZoneOffset
- ZoneOffset : UTC 기준으로 시간(Time Offset)을 나타낸 것. 우리나라는 +09:00 으로 표기
3. ZonedDateTime
- OffsetDateTime + ZoneId
- ZoneId : DST와 같은 시간대와 관련된 규칙들 포함
참고)
https://www.baeldung.com/java-zoneddatetime-offsetdatetime
https://d2.naver.com/helloworld/645609
https://gaebalsogi.tistory.com/66
https://www.tcpschool.com/java/java_time_localDateTime
https://blog-tech.tadatada.com/2016-12-28-struggling-with-the-leap-second
https://www.youtube.com/watch?v=-5wpm-gesOY
3. DateTimeFormatter 클래스
- uuuu와 yyyy 의 차이점
- 문서를 보면 uuuu는 year, yyyy는 year-of-era 라고 되어있음
- uuuu가 덜 엄격하므로 사용하는 것을 권장함
- https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/time/format/DateTimeFormatter.html
- https://stackoverflow.com/questions/41177442/uuuu-versus-yyyy-in-datetimeformatter-formatting-pattern-codes-in-java
- ResolverStyle
- 날짜 포맷에 대해 엄격하게 할지 설정할 수 있음
- STRICT 로 하면 날짜에 오류가 있는 경우 파싱 오류가 발생함
4. jsr310 의 time package
- https://jcp.org/aboutJava/communityprocess/pfd/jsr310/JSR-310-guide.html
- joda-time 의 개발자와 java time 개발자가 같음
- 전자에는 있으나 후자에는 지원하지 않는 클래스도 있었다
- 잠수함 패치를 위해 threeten-extra 라는 라이브러리 사용
- 번외) 컴퓨터는 어떻게 timezone 을 알고 있을까?
반응형