[java] java.util.Date를 java.sql.Date로 변환하는 방법?

java.util.Date입력 으로 사용하고 쿼리를 사용하여 쿼리를 작성 하려고 하므로 java.sql.Date.

암시 적 또는 명시 적으로 변환을 수행 할 수 없다는 사실에 놀랐습니다. 그러나 Java API는 여전히 나에게 새롭기 때문에 어떻게 할 것인지조차 모릅니다.



답변

tl; dr

java.util.Date를 java.sql.Date로 변환하는 방법?

하지마 두 클래스 모두 낡았습니다.

  • 사용 java.time의 대신 기존의 클래스 java.util.Datejava.sql.Date나중에 JDBC 4.2 이상으로한다.
  • java.time으로 아직 업데이트되지 않은 코드와 상호 운용되는 경우 java.time으로 /에서 변환합니다.

을 사용한 쿼리 예 PreparedStatement.

myPreparedStatement.setObject(
     ,                                         // Specify the ordinal number of which argument in SQL statement.
    myJavaUtilDate.toInstant()                  // Convert from legacy class `java.util.Date` (a moment in UTC) to a modern `java.time.Instant` (a moment in UTC).
        .atZone( ZoneId.of( "Africa/Tunis" ) )  // Adjust from UTC to a particular time zone, to determine a date. Instantiating a `ZonedDateTime`.
        .toLocalDate()                          // Extract a date-only `java.time.LocalDate` object from the date-time `ZonedDateTime` object.
)

교체 :

  • Instant대신 java.util.Date
    에 UTC를 나타내는 순간을 나타냅니다. 그러나 이제는 밀리 초가 아닌 나노초로 표시됩니다.
  • LocalDate대신에 java.sql.Date
    둘 다 시간이없고 시간대가없는 날짜 전용 값을 나타냅니다.

세부

날짜 전용 값 (시간, 시간대 없음)으로 작업하려는 경우 LocalDate대신 클래스를 사용하십시오 java.util.Date.

Java (레거시 및 현대) 및 SQL 표준의 날짜-시간 유형 테이블.

java.time

Java 8 이상에서 초기 버전의 Java와 함께 번들로 제공되는 번거로운 이전 날짜-시간 클래스는 새로운 java.time 패키지 로 대체되었습니다 . Oracle Tutorial을 참조하십시오 . 대부분의 기능은 자바 6 7 백 포팅 된 ThreeTen – 백 포트 및 상기 안드로이드 적응 ThreeTenABP .

SQL 데이터 유형은 DATE 짧은 시간 일-의없이 시간대와 날짜 전용하기위한 것입니다. Java java.time.LocalDate8에서는 Java 와 같은 클래스 †가 없었습니다 . 특정 시간대에 따라 오늘 날짜를 가져 와서 그러한 가치를 만들어 봅시다. 예).

LocalDate todayLocalDate = LocalDate.now( ZoneId.of( "America/Montreal" ) );  // Use proper "continent/region" time zone names; never use 3-4 letter codes like "EST" or "IST".

이 시점에서 완료 될 수 있습니다. 귀하의 경우 JDBC 드라이버 와 준수 JDBC 4.2 스펙 , 당신은을 통과 할 수 있어야 LocalDate통해 setObjectA의 PreparedStatement는 SQL DATE 필드에 저장합니다.

myPreparedStatement.setObject( 1 , localDate );

마찬가지로 ResultSet::getObjectSQL DATE 열에서 Java LocalDate오브젝트 로 페치 하는 데 사용하십시오 . 두 번째 인수에 클래스를 지정하면 코드 가 안전 합니다.

LocalDate localDate = ResultSet.getObject( 1 , LocalDate.class );

즉, 이 전체 질문은 JDBC 4.2 이상 에서는 관련이 없습니다 .

JDBC 드라이버가이 방식으로 수행되지 않으면 java.sql 유형으로 변환해야합니다.

java.sql.Date로 변환

변환하려면 이전 날짜-시간 클래스에 추가 된 새 메소드를 사용하십시오. java.sql.Date.valueOf(…)를 변환하기 위해 호출 할 수 있습니다 LocalDate.

java.sql.Date sqlDate = java.sql.Date.valueOf( todayLocalDate );

그리고 다른 방향으로갑니다.

LocalDate localDate = sqlDate.toLocalDate();

에서 변환 java.util.Date

이전 날짜-시간 클래스를 사용하지 말아야하지만 기존 코드로 작업 할 때 강요 될 수 있습니다. 그렇다면 java.time으로 /에서 변환 할 수 있습니다.

Instant타임 라인에서 UTC로 표시되는 순간을 나타내는 수업 을 진행합니다 . 는 InstantA와 생각이 비슷하다 java.util.Date. 그러나 참고 Instant로 해상도를 가지고 나노초 동안 java.util.Date만이 밀리 초 해상도를.

변환하려면 이전 클래스에 추가 된 새 메소드를 사용하십시오. 예를 들어, java.util.Date.from( Instant )java.util.Date::toInstant.

Instant instant = myUtilDate.toInstant();

날짜를 결정하려면 시간대 컨텍스트가 필요합니다. 주어진 순간마다 날짜는 시간대에 따라 다릅니다. 를 적용 ZoneId하려면을 적용하십시오 ZonedDateTime.

ZoneId zoneId = ZoneId.of ( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant ( instant , zoneId );
LocalDate localDate = zdt.toLocalDate();

† java.sql.Date 클래스는 시간없이 날짜 만 표시하지만 실제로 자정 시간으로 조정됩니다. 혼란 스러운가? 예, 오래된 날짜-시간 수업은 엉망입니다.


java.time에 대하여

java.time의 프레임 워크는 나중에 자바 8에 내장되어 있습니다. 이 클래스는 까다로운 기존에 대신 기존 과 같은 날짜 – 시간의 수업을 java.util.Date, Calendar,SimpleDateFormat .

Joda 타임 프로젝트는 지금에 유지 관리 모드 의로 마이그레이션을 조언 java.time의 클래스.

자세한 내용은 Oracle Tutorial을 참조하십시오 . 많은 예제와 설명을 보려면 스택 오버플로를 검색하십시오. 사양은 JSR 310 입니다.

java.time 객체를 데이터베이스와 직접 교환 할 수 있습니다 . JDBC 4.2 이상을 준수 하는 JDBC 드라이버를 사용하십시오 . 문자열이 필요없고 수업이 필요 없습니다 .java.sql.*

java.time 클래스는 어디서 구할 수 있습니까?

Java 또는 Android 버전과 함께 사용할 java.time 라이브러리 표

ThreeTen – 추가 프로젝트 추가 클래스와 java.time를 확장합니다. 이 프로젝트는 향후 java.time에 추가 될 수있는 입증 된 근거입니다. 당신은 여기에 몇 가지 유용한 클래스와 같은 찾을 수 있습니다 Interval, YearWeek, YearQuarter, 그리고 .


답변

신경 쓰지 마….

public class MainClass {

  public static void main(String[] args) {
    java.util.Date utilDate = new java.util.Date();
    java.sql.Date sqlDate = new java.sql.Date(utilDate.getTime());
    System.out.println("utilDate:" + utilDate);
    System.out.println("sqlDate:" + sqlDate);

  }

}

설명합니다. 링크는 http://www.java2s.com/Tutorial/Java/0040__Data-Type/ConvertfromajavautilDateObjecttoajavasqlDateObject.htm 입니다 .


답변

다른 답변으로 시간 정보에 문제가있을 수 있습니다 (예기치 않은 결과와 날짜를 비교하십시오!)

나는 제안한다 :

java.util.Calendar cal = Calendar.getInstance();
java.util.Date utilDate = new java.util.Date(); // your util date
cal.setTime(utilDate);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
java.sql.Date sqlDate = new java.sql.Date(cal.getTime().getTime()); // your sql date
System.out.println("utilDate:" + utilDate);
System.out.println("sqlDate:" + sqlDate);


답변

이 함수는 java 날짜 오브젝트에서 변환 된 SQL 날짜를 리턴합니다.

public java.sql.Date convertJavaDateToSqlDate(java.util.Date date) {
    return new java.sql.Date(date.getTime());
}


답변

로 변환 java.util.Data하면 java.sql.Data시, 분 및 초가 느슨해집니다. 가능하다면 다음 java.sql.Timestamp과 같이 사용하는 것이 좋습니다 .

prepareStatement.setTimestamp(1, new Timestamp(utilDate.getTime()));

자세한 내용은 이 질문을 확인 하십시오 .


답변

JXDatePicker (java calender)에서 날짜를 선택하여 데이터베이스에 SQL 날짜 유형으로 저장하는 경우 아래에서 잘 작동합니다.

java.sql.Date date = new java.sql.Date(pickedDate.getDate().getTime());

pickedDate는 JXDatePicker의 객체입니다.


답변

이 함수는 java 날짜 오브젝트에서 변환 된 SQL 날짜를 리턴합니다.

public static java.sql.Date convertFromJAVADateToSQLDate(
            java.util.Date javaDate) {
        java.sql.Date sqlDate = null;
        if (javaDate != null) {
            sqlDate = new Date(javaDate.getTime());
        }
        return sqlDate;
    }