LocalDateTime
특징
- 날짜와 시간 정보만 있음(예: 2025-06-10T08:30:00)
(yyyy-MM-dd hh:mm:ss)
- 타임존(시간대) 정보 없음
- 서버의 기본 타임존(JVM 타임존)에 의존
- 주로 로컬 환경에서만 유효, 글로벌 서비스에서는 혼동 우려
사용 예시
LocalDateTime now = LocalDateTime.now();
ZonedDateTime
특징
- 날짜, 시간, 타임존(ZoneId) 정보를 모두 가짐
- ex> 2025-06-10T08:30:00+09:00Asia/Seoul
- 시간대가 명확히 포함되어 있어 글로벌 서비스에 적합하다
사용 예시
ZonedDateTime now = ZonedDateTime.now(ZoneId.of("Asia/Seoul"));
OffsetDateTime
특징
- 날짜, 시간, UTC 기준의 오프셋(Offset, +09:00 등) 정보 포함
- ex> 2025-06-10T08:30:00+09:00
- 타임존 이름(Asia/Seoul 등)은 없고, 오프셋만 있음
- 시간대 이름이 필요 없고, 단순히 오프셋만 관리할 때 유용
사용 예시
OffsetDateTime now = OffsetDateTime.now(ZoneOffset.of("+09:00"));
Instant
특징
- UTC 기준의 타임 스탬프
- 시간대 개념이 아예 존재 하지 않는다 (UTC)
- ex> 2025-06-09T23:30:00Z
- 주로 DB 저장, 네트워크 전송 등에서 표준 시각 기준으로 사용
사용 예시
Instant now = Instant.now();
타입 간 변환 예시
// LocalDateTime → ZonedDateTime
LocalDateTime ldt = LocalDateTime.now();
ZonedDateTime zdt = ldt.atZone(ZoneId.of("Asia/Seoul"));
// ZonedDateTime → OffsetDateTime
OffsetDateTime odt = zdt.toOffsetDateTime();
// ZonedDateTime → Instant
Instant instant = zdt.toInstant();
// Instant → ZonedDateTime
ZonedDateTime zdt = instant.atZone(ZoneId.of("Asia/Seoul"));
Spring에서 Default UTC 설정
JVM 옵션으로 설정
java -Duser.timezone=UTC -jar myapp.jar
코드에서 설정
- 애플리케이션 시작 시 타임존을 UTC로 강제한다.
@PostConstruct
public void setTimeZone() {
TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
}
applicatoin.yaml에서 설정하기
spring:
jackson:
time-zone: UTC
jpa:
properties:
hibernate:
jdbc:
time_zone: UTC