❓날짜와 시간 라이브러리가 필요한 이유
날짜와 시간을 계산하는 것은 단순하게 생각하면 쉬워보이지만, 실제로는 매우 어렵고 복잡합니다.
날짜와 시간 차이의 계산, 윤년의 계산, 일광 절약 시간의 변환, 타임존의 계산 등의 이유로 인해 날짜와 시간을 계산하는 것이 정~~말 어렵습니다. 강의를 보면서 하나하나 듣다보니....라이브러리를 만든 분이 정말 대단하다고 느껴졌습니다....🫠
깨알지식
자바 1.0 버전 시절 java.util.Date 라이브러리가 존재하였으나, 타임존 처리 부족과 날짜, 시간 연산 등을 제대로 처리하지 못하는 일이 발생했습니다. 개발자들은 자바 내부의 라이브러리가 부련해서 Joda-Time이라는 외부 라이브러리를 사용했지만 자바 표준에 포함되지 않아 프로젝트에 별도로 추가해야 되는 불편함이 또 발생하였습니다.
해결책으로 Joda-Time의 개발자를 섭외하여 자바 8 버전에 Java.Time이라는 채키지를 표준 API를 성공적으로 도입하여 지금까지 사랑 받고 있다고합니다 !
⏰날짜와 시간 라이브러리
라이브러리 상세 타입을 보기 전에 날짜와 자바 공식 문서가 제공하는 표를 한번 훑어보고 가세요 !
(자바 문서 중에서 제일 잘 정리된 문서이지 않을까...라는 저를 포함한 많은 분들의 생각⭐️)
LocalDate, LocalTime, LocalDateTime
LocalDate는 날짜(년, 월, 일)만 표현할 때 사용하고, LocalTime은 시간(시, 분, 초)만을 표현할 때 사용합니다.
LocalDateTime은 LocalDate와 LocalTime을 합한 것이라고 생각하시면 됩니다 !
LocalDateTime Class의 내부를 보면 필드에 LocalDate와 LocalTime class가 선언 되어있더라구요.
완벽한 객체지향이란 이런 것일까요....?⭐️
ZonedDateTime, OffsetDateTime
ZonedDateTime은 시간대를 고려한 날짜와 시가늘 표현할 때 사용되며, 여기에는 시간대를 표현하는 타임존이 포함됩니다 !
형식은 '2024-07-20T09:20:30.213+9:00[Asia/Seoul]'로 표현되고, +9:00은 UTC(협정 세계시)로 부터의 시간대 차이입니다.
OffsetDateTime은 타임존은 없고, UTC로 부터의 시간대 차이인 고정된 오프셋만 포함됩니다.
UTC와 Offset이란 ?
UTC는 국제적인 표준 시간의 기준으로 쓰이는 시각입니다.
Offset은 UTC로 부터의 시간대의 차입니다. 한국은 UTC보다 +9:00시간입니다.
Instant
Instant는 UTC를 기준으로 하는, 시간의 한 지점을 나타냅니다. 날짜와 시간을 나노초 정밀도로 표현하며, 1970년 01월 01일 0시 0분 0초를 기준으로한 시간으로 계산됩니다. 쉽게 이야기해서 Instant 내부에는 초 데이터만 들어있습니다. (나노초 포함)
따라서 날짜와 시간을 계산에 사용할 때 Instant는 적합하지 않습니다.
Period, Dration
시간의 개념은 크게 특정 시점의 시간(시각)과 시간의 간격(기간)으로 표현할 수 있습니다.
Period, Duration은 시간의 간격(기간)을 표현하는데 사용되며 Period는 두 날짜 사이의 간격을 년, 월, 일로 나타내고 Duration은 두 시간 사이의 간격을 시, 분, 초(나노초) 단위로 나타냅니다.
날짜와 시간의 핵심 인터페이스
위에서 언급한 것과 같이 날짜와 시간은 특정 시점의 시간(시각)과 시간의 간격(기간)으로 나눌 수 있습니다.
두 기준으로 나누어 날짜와 시간의 핵심 인터페이스를 살펴보겠습니다 !
- TemporalAccessor 인터페이스는 날짜와 시간을 읽기 위한 기본 인터페이스입니다. 특정 시점의 날짜와 시간 정보를 읽을 수 있는 최소한의 기능을 제공합니다.
- Temporal 인터페이스는 TemporalAccessor의 하위 인터페이스로, 날짜와 시간을 조작(추가, 빼기 등)하기 위한 기능을 제공합니다. 이를 통해 날짜와 시간을 변경하거나 조정할 수 있습니다. TemporalAccessor가 구현되어 있으니 당연히 읽기도 지원합니다 !
- TemporalAmount는 시간의 간격(시간의 양, 기간)을 나타내며, 날짜와 시간 객체에 적용하여 그 객체를 조정할 수 있습니다. 예를 들어, 특정 날짜에 기간을 더하거나 빼는데 사용됩니다.
- TemporalUnit(ChrnoUnit) 인터페이스는 날짜와 시간을 측정하는 단위를 나타내며, 주로 사용되는 구현체는 java.time.temporal.ChronoUnit 라이브러리에 열거형으로 구현되어 다양한 시간 단위를 제공합니다.
- TemporalField(ChrnoField) 인터페이스는 날짜 및 시간을 나타내는데 사용됩니다. 주로 사용되는 구현체는 java.time.temporal.ChronoField 라이브러이에 열거형으로 구현되어 다양한 필드를 통해 날짜와 시간의 특정 부분을 나타냅니다.
날짜와 시간 문자열 파싱과 포맷팅
포맷팅은 날짜와 시간 데이터를 원하는 포맷의 문자열로 변경하는 것이고, 파싱은 문자열을 날짜와 시간 데이터로 변경하는 것입니다.
예제를 통해 확인해보겠습니다 !
public static void main(String[] args) {
// 포맷팅 : 날짜를 문자로
LocalDate date = LocalDate.of(2024, 12, 31);
System.out.println("date = " + date);
// 패턴 생성
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy년 MM월 dd일");
String formattedDate = date.format(formatter);
System.out.println("현재 날짜와 시간 포맷팅 = " + formattedDate);
// 파싱 : 문자를 날짜로
String input = "2030년 01월 01일";
LocalDate parsedDate = LocalDate.parse(input, formatter);
System.out.println("문자열 파싱 날짜와 시간 = " + parsedDate);
}
public static void main(String[] args) {
// 포맷팅 : 날짜와 시간을 문자로
LocalDateTime now = LocalDateTime.of(2024, 12, 31, 13, 30, 59);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String formattedDateTime = now.format(formatter);
System.out.println("날짜와 시간 포맷팅 = " + formattedDateTime);
// 파싱 : 문자를 날짜와 시간으로
String dateTimeString = "2030-01-01 11:30:00";
LocalDateTime parsedDateTime = LocalDateTime.parse(dateTimeString, formatter);
System.out.println("문자열 파싱 날짜와 시간 = " + parsedDateTime);
}
정리
시간과 날짜는 정말 까다로워서 직접 구현할 수 있을까 싶습니다.....구현했다고 해도 99% 확률로 에러가 발생하지 않을까요...?
.getHour(), get.Minute(), now()와 같은 만들어 놓은 메서드들만 사용했었는데 깊이 파고들면서 공부해 보니까 세상엔 당연한 게 없다...라는 생각이 드네요 !! 편하게 사용할 수 있도록 라이브러리를 만든 개발자에게 박수를 보내며 ! 마치겠습니다 !
'프로그래밍 > Java' 카테고리의 다른 글
[Java, Spring] Logging, @Slf4j란 ? (0) | 2024.07.29 |
---|---|
[Java, Spring] application.properties란 ? (0) | 2024.07.29 |
[Java, 자바] Enum에 대하여 (0) | 2024.07.16 |
[Java, 자바] Wrapper Class에 대하여 (1) | 2024.07.14 |
[Java, 자바] String 클래스에 대하여 (0) | 2024.07.02 |
개발의 모든 것 !
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!