Java time 관련 클래스 정리

November 21, 2023


시간

Date

java.util.Date는 이미 java 8이후로는 Deprecated된 클래스입니다. 하지만 호환성을 위해 여러 라이브러리에서 사용되고 있기 때문에 주의해서 사용할 점과 문제점에 대해 알아보도록 하겠습니다.

Date 타입의 문제점

Date 클래스는 변경 가능한(Mutable) 클래스입니다. 즉, 생성된 후 상태가 변경될 수 있습니다. Mutable하기 때문에 다중 스레드 환경에서 문제를 일으킬 수 있습니다.

그리고 timestamp를 나타내지만 시간대에 대한 정보를 저장하지 않습니다. 이로 인해 서로 다른 시간대의 날짜 및 시간을 작업할 때 혼란이 발생할 수 있습니다.

Date 타입의 대안

만약 어느 라이브러리로 인해 Date 클래스를 사용해야 한다면, 후술할 Instant 클래스를 사용하고 Date.from(Instant 자료형)을 사용한다면 Date 객체를 따로 관리할 필요가 없어집니다.

Instant now = Instant.now();
someLegacyMethod(Date.from(now));

LocalTime

LocalTime specificTime = LocalTime.of(15, 30, 45); // 3:30:45 PM
System.out.println("Specific Time: " + specificTime);

LocalDate

LocalDate specificDate = LocalDate.of(2023, 5, 20); // May 20, 2023
System.out.println("Specific Date: " + specificDate);

LocalDateTime

LocalDateTime specificDateTime = LocalDateTime.of(2023, 5, 20, 15, 30, 45); // May 20, 2023, 3:30:45 PM
System.out.println("Specific Date and Time: " + specificDateTime);

Instant

Instant specificInstant = Instant.ofEpochSecond(1621505445); // UNIX timestamp
System.out.println("Specific Instant: " + specificInstant);

Instant는 1970-01-01T00:00:00Z때부터 지금까지의 시간 차로 시간을 표현합니다.

java.util.Date와 유사하지만 차이점이 존재합니다. Date는 시간대 정보가 없어서 글로벌 서비스시 다른 지역을 구분할 수 없습니다.

하지만, Instant는 UTC 기준시로 시간 정보를 저장하기 때문에 다른 지역에 있더라도 누가 더 선행되었는지 비교할 수 있습니다.

OffsetDateTime

OffsetDateTime은 자바에서 날짜와 시간을 표현할 때 시간대(offset) 정보를 포함하는 클래스입니다.

UTC 시간대 기준으로 저장하는 Instant이나 시차 정보가 없는 LocalDateTime과 달리, 특정 시간대(+09:00)의 시간 정보를 같이 저장합니다.

ZonedDateTime

ZonedDateTimeOffsetDateTime 데이터와 지역 위치를 의미하는 Zone을 저장하는 자료형입니다.

OffsetDateTime과의 차이점은 시차 정보와 함께 지역 정보까지 저장할 수 있습니다.

따라서 같은 시간대라도 다른 국가임을 표현할 수 있고, 국가마다 다르게 적용되는 썸머타임의 정보를 확인할 수 있습니다.

서울 시간대를 파리 시간대로 바꾸는 예제

ZonedDateTime zdtSeoul = ZonedDateTime.of(2010, 9, 25,
        15, 45, 0, 0, ZoneId.of("Asia/Seoul"));

// Convert ZonedDateTime to the time zone of France (Europe/Paris)
// 2010-09-25T08:45+02:00[Europe/Paris]
ZonedDateTime zdtParis = zdtSeoul.withZoneSameInstant(ZoneId.of("Europe/Paris"));

기간

Period, Duration은 날짜와 시간의 을 나타내는 클래스입니다.

Duration

Duration시, 분, 초, 나노초의 양을 나타냅니다.

Instant start = Instant.now();
// do something ...
Instant end = Instant.now();
Duration duration = Duration.between(start, end);

또한, 유효 기간 등등 시, 분, 초 단위동안의 기간을 정할 때, ISO 표준 형식을 사용하면 더 이상 숫자 단위가 초인지 분인지 고민할 필요가 없어집니다.

Duration duration = Duration.parse("PT10M"); // 10분을 의미

long minutes = duration.toMinutes(); // 10
long seconds = duration.toSeconds(); // 600

Period

Period년, 달, 일의 양을 나타냅니다.

LocalDate startDate = LocalDate.of(2022, 1, 1);
LocalDate endDate = LocalDate.now();

Period period = Period.between(startDate, endDate);

Parsing

DateTimeConverter

LocalDateTime now = LocalDateTime.now();
DateTimeFormatter shortFormatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT);

System.out.println(shortFormatter.format(now)); // 23. 11. 21. 오후 11:59
System.out.println(now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); // 2023-11-21 23:59:48

Profile picture

이재원

이해하기 쉬운 코드를 작성하려 고민합니다.


© 2024 Won's blog Built with Gatsby