java.sql.timestamp를 LocalDate (java8) java.time으로 변환하는 방법은 무엇입니까?


답변:


196

넌 할 수있어:

timeStamp.toLocalDateTime().toLocalDate();

참고 timestamp.toLocalDateTime() 사용합니다 Clock.systemDefaultZone()변환을 할 시간대를. 이것은 당신이 원하는 것일 수도 있고 아닐 수도 있습니다.


1
Java 8에 추가되었습니다.
assylias

54
참고 timestamp.toLocalDateTime()로이 메서드는 systemDefault 시간대를 사용하여 변환합니다. 이것은 당신이 원하는 것일 수도 있고 아닐 수도 있습니다.
jacobhyphenated

1
@jacobhyphenated는 명시적인 시간대를 사용하여 답변을 게시하십시오. 감사!
user482745

@jacobhyphenated의 의견은 여기에서 매우 중요하므로 이에 대한 찬성 수입니다. 자세한 내용은 내 대답을 참조하십시오. stackoverflow.com/a/57101544/2032701
Ruslan

@jacobhyphenated, LocalDateTime항상 시스템 기본 시간대를 사용합니다. 그것이 "로컬"이 그 이름에서 의미하는 것입니다.
M. Prokhorov

21

받아 들여진 대답이 이상적이지 않아서 2 센트를 더하기로 결정했습니다

timeStamp.toLocalDateTime().toLocalDate();

일반적으로 나쁜 솔루션입니다 . 시스템 시간대를 사용하여 암시 적 변환을 수행하여 작업을 실제로 혼란스럽게 만들기 때문에 JDK에이 메서드를 추가 한 이유를 잘 모르겠습니다. 일반적으로 java8 날짜 클래스 만 사용할 때 프로그래머는 좋은 시간대를 지정해야합니다.

좋은 해결책은

timestamp.toInstant().atZone(zoneId).toLocalDate()

여기서 zoneId 는 사용하려는 시간대이며 시스템 시간대를 사용하려는 경우 일반적으로 ZoneId.systemDefault () 또는 ZoneOffset.UTC 와 같은 하드 코딩 된 시간대입니다.

일반적인 접근 방식은

  1. 직접 관련된 클래스를 사용하여 새로운 java8 날짜 클래스를 벗어나십시오. 예를 들어 우리의 경우 java.time.Instant는 java.sql.Timestamp와 직접 관련되어 있습니다. 즉, 그들 사이에 시간대 변환이 필요하지 않습니다.
  2. 이 java8 클래스에서 잘 설계된 메소드를 사용하여 올바른 작업을 수행하십시오. 우리의 경우 atZone (zoneId) 는 변환을 수행하고 특정 시간대를 사용하고 있음을 명시했습니다.

1
동의하지 않습니다. 타임 스탬프 (및 날짜)에는 영역 정보가 없습니다. LocalDate에는 영역 정보가 없으므로 두 가지가 동일합니다. 이들 간의 변환은 특정 영역에 관계없이 수행 할 수 있습니다. LocalDate로 변환하기 전에 ZonedDateTime으로 변환하면 시간대가 추가 된 다음 다시 벗어납니다. 그렇게하면 찾기 힘든 오류가 발생할 가능성이 훨씬 더 높습니다.
AutomatedMike

5
@AutomatedMike 타임 스탬프 (및 날짜)는 UTC의 특정 시점을 나타냅니다. LocalDate는 특정 시점이 아니라 벽시계에 표시되는 시간을 나타냅니다. 그들의 javadocs를 읽으십시오. "그들 간의 변환은 특정 영역과 독립적으로 수행 할 수 있습니다."- true가 아닌 경우 new Timestamp (0L) .toLocalDateTime ()은 모스크바 시간대에 대해 "1970-01-01T03 : 00"을 반환합니다. 시간대에 따라 결과가 다를 수 있습니다.
Ruslan

1
@AutomatedMike toLocalDate ()를 수행하여 시간을 제거하더라도 Timestamp가 자정에 가까운 시간을 가졌다면 그날이 잘못 될 수 있음을 쉽게 증명할 수 있습니다 (예 : new Timestamp (1000 * 60 * 60 * 23) .toLocalDateTime (). toLocalDate). ()는 UTC로 "1970-01-01"인 모스크바 시간대에 대해 "1970-01-02"를 반환합니다.
Ruslan

1
@AutomatedMike "시간대를 추가 한 다음 다시 제거합니다"-요점은 시간대를 추가 및 제거하는 것이 아니라 명시적인 시간대 를 사용하여 서로 다른 개념간에 변환하는 것 입니다. 이것은 시간대가 묵시적 으로 적용되는 이전의 두 주석의 예와는 대조적 입니다.
Ruslan

7

시간대를 고려하여 @assylias 답변을 약간 확장하겠습니다. 특정 시간대에 대해 LocalDateTime을 가져 오는 방법에는 두 가지 이상이 있습니다.

전체 애플리케이션에 대해 setDefault 시간대를 사용할 수 있습니다. 타임 스탬프-> java.time 변환 전에 호출해야합니다.

public static void main(String... args) {
    TimeZone utcTimeZone = TimeZone.getTimeZone("UTC");
    TimeZone.setDefault(utcTimeZone);
    ...
    timestamp.toLocalDateTime().toLocalDate();
}

또는 toInstant.atZone 체인을 사용할 수 있습니다.

timestamp.toInstant()
        .atZone(ZoneId.of("UTC"))
        .toLocalDate();
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.