본문 바로가기
개발 언어/Java

Java 시간 클래스 차이 LocalDateTime OffsetDateTime

by 정권이 내 2024. 11. 14.

Java 시간 클래스 차이: LocalDateTime vs OffsetDateTime

 

Java에서는 시간을 다룰 때, 여러 종류의 클래스가 존재합니다. 그중에서도 LocalDateTimeOffsetDateTime은 날짜와 시간을 나타내기 위한 대표적인 클래스입니다.

이 두 클래스는 날짜와 시간을 저장한다는 점에서는 유사하지만, 시간대와 오프셋 처리 방식에서 중요한 차이점이 있습니다. 이 글에서는 LocalDateTimeOffsetDateTime의 차이점과 함께 두 객체를 서로 변환하는 방법을 설명합니다.

 

LocalDateTime이란?

LocalDateTime은 타임존 정보가 없는 날짜와 시간을 나타내는 클래스입니다. 예를 들어, "2023-10-14T10:15:30"과 같은 형식으로 날짜와 시간을 저장하며, 시간대와 오프셋 정보는 포함하지 않습니다.

LocalDateTime은 특정 지역의 시간을 나타내기 때문에, 타임존이 필요하지 않은 일정이나 로컬 시간을 다룰 때 유용하게 사용할 수 있습니다.

 

LocalDateTime의 주요 특징

  • 타임존 정보 없음: LocalDateTime은 타임존이나 UTC 오프셋 정보가 없습니다.
  • 절대 시간 표현 불가: 로컬 시간으로만 해석되기 때문에 절대적인 시각을 나타내지는 않습니다.
  • 사용 예: 특정 지역의 일정, 단순한 시간 비교 등.

 

OffsetDateTime이란?

OffsetDateTime은 UTC 오프셋 정보가 포함된 날짜와 시간을 나타내는 클래스입니다. 예를 들어, "2023-10-14T10:15:30+09:00"과 같이 시간과 함께 "+09:00" 같은 오프셋을 추가로 포함합니다. 이 오프셋은 UTC와의 시차를 의미합니다.

이 클래스를 사용하면, 전 세계 어디서나 절대적인 시간을 나타낼 수 있어 로그 기록이나 타임스탬프와 같이 시간이 중요한 데이터를 저장할 때 유용합니다.

 

OffsetDateTime의 주요 특징

  • UTC 오프셋 포함: OffsetDateTime은 UTC와의 시차를 나타내는 오프셋 정보를 포함합니다.
  • 절대 시간 표현 가능: 오프셋 덕분에 전 세계 어디서나 동일하게 해석될 수 있는 절대적인 시각을 나타낼 수 있습니다.
  • 사용 예: 로그 기록, 타임스탬프, 특정 시간대 기반 이벤트 기록.

 

LocalDateTime과 OffsetDateTime의 변환

LocalDateTimeOffsetDateTime은 서로 변환할 수 있습니다. 두 클래스의 주요 차이점은 시간대와 오프셋 정보를 포함하느냐 아니냐에 있습니다.

따라서 변환 과정에서 시간대 및 오프셋 정보를 명시적으로 처리해야 합니다.

 

LocalDateTime을 OffsetDateTime으로 변환

LocalDateTime은 시간대 정보를 포함하지 않으므로, OffsetDateTime으로 변환할 때는 명시적으로 오프셋을 제공해야 합니다.

예를 들어, ZoneOffset을 이용해 시간대 오프셋을 지정할 수 있습니다.

 

예시: LocalDateTime을 OffsetDateTime으로 변환

java코드 복사import java.time.LocalDateTime;
import java.time.OffsetDateTime;
import java.time.ZoneOffset;

public class LocalDateTimeToOffsetDateTime {
    public static void main(String[] args) {
        // LocalDateTime 생성
        LocalDateTime localDateTime = LocalDateTime.of(2023, 10, 14, 10, 15, 30);
        
        // OffsetDateTime으로 변환 (UTC+9)
        OffsetDateTime offsetDateTime = localDateTime.atOffset(ZoneOffset.ofHours(9));
        
        System.out.println("OffsetDateTime: " + offsetDateTime);
    }
}

이 예시에서 LocalDateTime은 시간대 정보를 포함하지 않기 때문에 atOffset() 메서드를 사용해 오프셋을 지정하여 OffsetDateTime으로 변환합니다.

 

OffsetDateTime을 LocalDateTime으로 변환

OffsetDateTime은 시간대 정보를 포함하므로, 이를 LocalDateTime으로 변환하려면 오프셋을 제거해야 합니다.

OffsetDateTime 객체에서 시간대 오프셋을 제외한 순수한 로컬 시간만을 얻을 수 있습니다.

 

예시: OffsetDateTime을 LocalDateTime으로 변환

java코드 복사import java.time.OffsetDateTime;
import java.time.LocalDateTime;

public class OffsetDateTimeToLocalDateTime {
    public static void main(String[] args) {
        // OffsetDateTime 생성 (UTC+9)
        OffsetDateTime offsetDateTime = OffsetDateTime.of(2023, 10, 14, 10, 15, 30, 0, ZoneOffset.ofHours(9));
        
        // LocalDateTime으로 변환
        LocalDateTime localDateTime = offsetDateTime.toLocalDateTime();
        
        System.out.println("LocalDateTime: " + localDateTime);
    }
}

이 예시에서 OffsetDateTime은 시간대 정보(+09:00)를 포함하고 있지만, toLocalDateTime() 메서드를 사용하여 LocalDateTime으로 변환하면 시간대 정보는 제거되고 로컬 시간만 남습니다.

 

타임존을 적용하여 변환하기

타임존을 적용하여 LocalDateTimeOffsetDateTime을 변환할 때는 ZonedDateTime을 사용하는 것이 일반적입니다.

ZonedDateTime은 시간대 정보를 포함하여 날짜와 시간을 표현할 수 있기 때문에, 이를 통해 다양한 시간대 간의 변환을 쉽게 할 수 있습니다.

 

LocalDateTime을 특정 타임존에 맞춰 변환

LocalDateTime을 특정 타임존에 맞추려면 먼저 ZonedDateTime으로 변환한 후, 해당 타임존에 맞춰 OffsetDateTime으로 변환할 수 있습니다.

 

예시: LocalDateTime을 타임존에 맞춰 변환

java코드 복사import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.OffsetDateTime;

public class LocalDateTimeToZonedDateTime {
    public static void main(String[] args) {
        // LocalDateTime 생성
        LocalDateTime localDateTime = LocalDateTime.of(2023, 10, 14, 10, 15, 30);
        
        // ZonedDateTime으로 변환 (Asia/Seoul 타임존)
        ZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.of("Asia/Seoul"));
        
        // ZonedDateTime을 OffsetDateTime으로 변환
        OffsetDateTime offsetDateTime = zonedDateTime.toOffsetDateTime();
        
        System.out.println("OffsetDateTime: " + offsetDateTime);
    }
}

이 예시에서 LocalDateTimeZonedDateTime으로 변환한 후, 원하는 타임존(Asia/Seoul)을 적용하고, 최종적으로 OffsetDateTime으로 변환합니다.

 

LocalDateTime과 OffsetDateTime의 차이점 비교

특징 LocalDateTime OffsetDateTime
시간대 정보 없음 UTC 오프셋 포함
시간 표현 예 2023-10-14T10:15:30 2023-10-14T10:15:30+09:00
절대 시간 표현 가능 불가능 가능
사용 예 로컬 시간 표현, 일정 로그 기록, 타임스탬프

 

언제 LocalDateTime과 OffsetDateTime을 사용해야 할까?

  • 로컬 시간 필요 시: 타임존이 필요 없는 단순한 시간 데이터를 다룰 때는 LocalDateTime이 적합합니다.
  • 절대적인 시간 필요 시: 특정 시간대나 전 세계적으로 동일하게 해석될 절대 시간을 나타내고자 할 때는 OffsetDateTime을 사용하는 것이 좋습니다.

 

마무리

LocalDateTimeOffsetDateTime은 시간대를 처리하는 방식에서 큰 차이를 가지며, 각각의 상황에 맞는 클래스를 사용하는 것이 중요합니다.

또한, 타임존을 적용하여 변환하는 과정에서 ZonedDateTime을 활용하는 방법도 유용하게 사용될 수 있습니다.

이 두 클래스를 이해하고 적절하게 활용하면, 보다 정확하고 의미 있는 시간 데이터를 다룰 수 있습니다.

반응형

댓글