시간
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
ZonedDateTime
은 OffsetDateTime
데이터와 지역 위치를 의미하는 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