java.time.LocalDate를 java.util.Date 유형으로 변환


372

나는 변환 할 java.time.LocalDatejava.util.Date유형입니다. 날짜를로 설정하고 싶습니다 JDateChooser. 또는 날짜를 지원하는 날짜 선택기가 java.time있습니까?



2
LGoodDatePicker는 기본적으로 자바 8 시간 일명합니다 (java.time 패키지를 사용, 또는 JSR-310 특히, LGoodDatePicker 날짜 값을 저장하기 위해 "java.time.LocalDate"를 사용 스크린 샷과 데모가에있다.. 프로젝트 홈페이지 .
BlakeTNC

답변:


560
Date date = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());

날짜 선택자가 시스템 기본 시간대를 사용하여 날짜를 문자열로 변환한다고 가정합니다.


JB Nizet는 아마도 Java 8이 개발 / 릴리스의 초기 단계에 있었으며 @ user3509494가 어떻게 든 그것을 테스트했습니다.
russellhoff

2
atStartOfDay()내가 이해하는 것처럼 날짜 값을 변경하기 때문에 피할 수 있습니까?
yegor256

1
@ JBNizet 귀하의 답변이 저에게 이해가되지 않기 때문에 명확히하기로 결정했습니다. 쓸모없는 의견을 제시하는 대신 명확하게 설명하지 않겠습니까?
yegor256

12
왜 그리고 왜 설명이 필요한지 알 수 없기 때문입니다. 232 명이이 답변을 찬성하여 분명하게 알았습니다. atStartOfDay가 날짜 값을 변경한다고 말합니다. 말이되지 않습니다. atStartOfDay는 javadoc의 기능을 수행합니다. LocalDate를 같은 날짜와 시작 시간에 LocalDateTime으로 변환합니다.
JB 니 제트

2
@cornz 결과가 정확하지 않습니까? 독일에있는 경우 1893 년 4 월 독일의 6 분 32 초 글리치와 관련이있을 수 있습니다. 자세한 내용은 timeanddate.com/time/zone/germany/berlin?syear=1850 을 참조 하십시오. .
다우드 이븐 카림

104

최신 java.time클래스를 java.util.Date객체로 또는 그 반대로 변환하는 데 사용하는 유틸리티 클래스는 다음과 같습니다 .

import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Date;

public class DateUtils {

  public static Date asDate(LocalDate localDate) {
    return Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());
  }

  public static Date asDate(LocalDateTime localDateTime) {
    return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
  }

  public static LocalDate asLocalDate(Date date) {
    return Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDate();
  }

  public static LocalDateTime asLocalDateTime(Date date) {
    return Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDateTime();
  }
}

@Oliv 의견을 기반으로 편집되었습니다.


ZoneId.systemDefault()시간대가 연중 변경되므로 문제 가되지 않습니다 . 따라서 1 월 1 일에 시간대 -05 : 00 (중앙)에 있고, 1 월 7 월에 시간대에 -06 : 00 (중앙 일광)에 있으면 일광 절약으로 인해 부정확 한 결과가 발생하지 않습니다 시각?
jhilden

94

java.sql.Date.valueOf()방법을 다음과 같이 사용할 수 있습니다 .

Date date = java.sql.Date.valueOf(localDate);

여기에는 표준 시간대 정보가 암시 적으로 사용되므로 여기에 표준 시간대 정보를 추가 할 필요가 없습니다. LocalDate에서 java.util.Date로 또는 그 반대로 변환을
참조하십시오 .


LocalDate를 SQL로 전달해야했기 때문에 이것은 나에게 완벽했습니다. 그러나 날짜 포맷터가 날짜를 포맷하기 전에 시간대 이동에 대해 무언가를 수행하려는 경우 현지 시간대에 따라 하루가 너무 일찍 나타날 수 있습니다.이 경우 위의 옵션 중 하나를 원할 것입니다.
Tom Dibble

7
java.sql.Date데이터베이스 계층, JDBC, JPA를 의미합니다. 웹 계층 (또는 모든 클라이언트 응용 프로그램)에는의 종속성이 없어야합니다 java.sql.*.
Tiny

2
@Tiny java.sql.Date는 rt.jar에 있습니다. 외부 종속성이 없습니다. 언어 기능 만 사용하십시오.
조지

2
java.sql.Date그냥 java.util.Date그것의 시간 설정으로 00:00:00만 디자인 관점에서의 포인트는 즉 java.sql.*서블릿 / JSP와 같은 상호 작용 전면 층에있는 고객을 의미하지 않는다. java.util.DateJava 측 java.sql.Timestamp또는 java.sql.*JDBC 측에서 적용 가능한 모든 것 .
Tiny

5
이것은 java.time. * 저자 : stackoverflow.com/questions/33066904/… 에 따른 "끔찍한 핵" 입니다. Java 9 java.sql.*클래스 에서는 별도의 종속성이 있습니다.
Dherik

16

java.time에는 대부분의 시간 클래스에서 Instant 객체를 만드는 데 사용할 수있는 Temporal 인터페이스가 있습니다. Instant는 Epoch의 타임 라인에서 밀리 초를 나타냅니다. 다른 모든 날짜와 시간의 기본 참조입니다.

변환을 수행하려면 날짜와 시간을 사용하여 ZonedDateTime으로 변환해야합니다.

LocalDate ldate = ...;
Instant instant = Instant.from(ldate.atStartOfDay(ZoneId.of("GMT")));
Date date = Date.from(instant);

12

java.time.LocalDate 에서 java.util.Date 를 작성 하려면 다음을 수행해야합니다.

  • LocalDate에 시간을 추가
  • 시간대 내의 날짜와 시간을 해석
  • 에포크 이후 초 / 밀리 초를 얻습니다.
  • java.util.Date를 작성하십시오.

코드는 다음과 같습니다.

LocalDate localDate = LocalDate.now();
Date date = new Date(localDate.atStartOfDay(ZoneId.of("America/New_York")).toEpochSecond() * 1000);

1
지역 id의 오타 (ZoneIf)
assylias

localDate.atStartOfDay ()는 ZonedDateTime을 작성하지만 ZonedDateTime에 대한 toEpochSecond () 메소드는 없습니다.
Kevin Sadler

@KevinSadler :이 메소드 toEpochSecond는에서 상속되었습니다 java.time.chrono.ChronoZonedDateTime. docs.oracle.com/javase/8/docs/api/java/time/chrono/…
nosid를

@nosid 수정 해 주셔서 감사합니다. Eclipse에서 코드 완성을 사용하면 옵션 (및 toInstance)이 옵션으로 표시되지 않습니다. 그러나 전체를 입력하면 허용되는 것 같습니다. 나는이 사실 때문에 메소드가 아니라고 결론을 내렸다. ZonedDateTime의 Javadoc 에서이 메소드가 상속 된 메소드로 나열되어 있기 때문에 그것을 보지 못했다고 잘못 결론을 내렸다. 죄송합니다 upclick : 동의하십시오
케빈 새들러

11

이것은 나를 위해 작동합니다 :

java.util.Date d = new SimpleDateFormat("yyyy-MM-dd").parse(localDate.toString());

https://docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html#toString--


6
이것은 상당히 비효율적입니다
AndresQ

1
Instant로 변환하는 것은 장황 할 수 있지만 문자열을 만들고 파싱하는 것은 도쿄를 통해 뉴욕에서 멕시코 시티로가는 것과 같습니다 ...
ehecatl

1
예, 그렇게 효율적이지는 않지만 대부분의 솔루션은 매우 장황합니다. 이것은 장황하고 읽기 쉽고 이해하기 쉽습니다.
ceklock

2
@ehecatl 조심하십시오 ... 앞으로 NY-> 도쿄-> 멕시코 시티는 몇 시간 내에 완료 될 수 있습니다;)
Stephan

3

코 틀린 솔루션 :

1)이 확장 기능을 어딘가에 붙여 넣습니다.

fun LocalDate.toDate(): Date = Date.from(this.atStartOfDay(ZoneId.systemDefault()).toInstant())

2) 사용하고 다시는 Google을 사용하지 마십시오.

val myDate = myLocalDate.toDate()

11
"Kotlin으로의 전환"은 어떻게 간단합니까? 이것은 Java 질문입니다.
ehecatl

1
Java LocalDate를 Date로 변환하는 것은 모든 JVM 개발자에게 일반적이고 성가신 문제입니다. 이것은 Kotlin 개발자를위한 솔루션입니다.
gyoder

-1
public static Date convertToTimeZone(Date date, String tzFrom, String tzTo) {
    return Date.from(LocalDateTime.ofInstant(date.toInstant(), ZoneId.of(tzTo)).atZone(ZoneId.of(tzFrom)).toInstant());
} 

2
솔루션을 설명하십시오.
Martin Zabel


-3
java.util.Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());

귀하의 답변이 4 년 후 수락 된 답변과 어떻게 다른가요? 평판을 높이기위한 복사-붙여 넣기?
stinger
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.