프로그래밍 언어/JAVA

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

Rateye 2021. 8. 20. 10:32
728x90
반응형
질문 : java.util.Date를 java.sql.Date로 변환하는 방법?

java.util.Date 를 입력으로 사용하고 쿼리를 생성하려고합니다. java.sql.Date

암시 적으로 또는 명시 적으로 변환을 수행 할 수 없다는 사실에 놀랐습니다.하지만 Java API가 여전히 나에게 상당히 새롭기 때문에 어떻게 해야할지 모르겠습니다.

답변

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

하지마. 두 클래스 모두 구식입니다.

  • JDBC 4.2 이상에서 레거시 java.util.Datejava.sql.Date대신 java.time 클래스를 사용하십시오.
  • 아직 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.
)

교체 :

  • java.util.Date 대신 Instant
    둘 다 UTC의 순간을 나타냅니다. 하지만 이제는 밀리 초 대신 나노초를 사용합니다.
  • java.sql.Date 대신 LocalDate
    둘 다 시간 및 시간대없이 날짜 전용 값을 나타냅니다.

세부 사항

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

자바 (레거시 및 최신 버전 모두) 및 SQL 표준의 날짜-시간 유형 표.

java.time

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

SQL 데이터 유형 DATE 는 시간 및 시간대가없는 날짜 전용입니다. java.time.LocalDate 까지는 정확히 그런 클래스가 없었습니다 †. 특정 시간대에 따라 오늘 날짜를 가져 와서 이러한 값을 만들어 보겠습니다 (파리에서 새 날이 일찍 시작될 때 시간대는 날짜를 결정하는 데 중요합니다. 예를 들어 몬트리올보다).

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 사양을 준수하는 경우 PreparedStatement setObject 를 통해 LocalDate 를 전달하여 SQL DATE 필드에 저장할 수 있어야합니다.

myPreparedStatement.setObject( 1 , localDate );

마찬가지로 ResultSet::getObject 를 사용하여 SQL DATE 열에서 Java LocalDate 객체로 페치합니다. 두 번째 인수에 클래스를 지정하면 코드 유형이 안전 합니다.

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

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

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

Convert to java.sql.Date

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

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

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

LocalDate localDate = sqlDate.toLocalDate();

Converting from java.util.Date

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

UTC로 타임 라인의 순간을 나타내는 Instant 클래스를 살펴보십시오. Instant 는 아이디어가 java.util.Date 와 유사합니다. 그러나 Instant 의 해상도는 최대 나노초 인 반면 java.util.Date 해상도는 밀리 초 입니다.

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

Instant instant = myUtilDate.toInstant();

날짜를 결정하려면 시간대 컨텍스트가 필요합니다. 특정 순간에 날짜는 시간대에 따라 전 세계적으로 다릅니다. ZoneId 를 적용하여 ZonedDateTime을 가져 ZonedDateTime .

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

† java.sql.Date 클래스는 시간이없는 날짜 전용 인 척하지만 실제로 자정 시간으로 조정 된 시간을 수행합니다. 혼란스러워? 예, 이전 날짜 시간 수업은 엉망입니다.


About java.time

java.time 프레임 워크는 Java 8 이상에 빌드됩니다. java.util.Date , Calendar , & SimpleDateFormat 과 같은 귀찮은 오래된 레거시 날짜-시간 클래스를 대체합니다.

자세한 내용은 Oracle Tutorial을 참조하십시오. 그리고 많은 예제와 설명을 위해 Stack Overflow를 검색하십시오. 사양은 JSR 310 입니다.

현재 유지 보수 모드 인 Joda-Time 프로젝트는 java.time 클래스로의 마이그레이션을 권장합니다.

java.time 객체를 데이터베이스와 직접 교환 할 수 있습니다. JDBC 4.2 이상을 준수 하는 JDBC 드라이버를 사용하십시오. java.sql.* 클래스가 필요하지 않습니다. Hibernate 5 및 JPA 2.2는 java.time을 지원합니다.

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

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

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

출처 : https://stackoverflow.com/questions/530012/how-to-convert-java-util-date-to-java-sql-date
728x90
반응형