질문 : 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.Date
및java.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
클래스를 사용하십시오.
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 SE 8 , Java SE 9 , Java SE 10 , Java SE 11 이상 -번들로 구현 된 표준 Java API의 일부입니다.Java 9
- 에는 몇 가지 사소한 기능과 수정 사항이 있습니다.
- Java 9 에는 몇 가지 사소한 기능과 수정 사항이 있습니다.
- Java SE 6 및 Java SE 7
- 대부분의
- Android
- 최신 버전의 Android (26+)는java.time 클래스의 구현을 번들로 제공합니다.
- 이전 Android (<26)의 경우 API desugaring으로알려진 프로세스는 원래 Android에 내장되지 않은 java.time 기능의 하위 집합을 가져옵니다.
- 탈당 기능이 필요한 기능을 제공하지 않는 경우ThreeTenABP프로젝트는 ThreeTen-Backport (위에서 언급)를 Android에 맞게 조정합니다.ThreeTenABP 사용 방법…을 참조하십시오.
ThreeTen-Extra 프로젝트는 추가 클래스로 java.time을 확장합니다. 이 프로젝트는 java.time에 향후 추가 될 수있는 가능성을 입증하는 기반입니다. 당신은 여기에 몇 가지 유용한 클래스를 찾을 수 있습니다 Interval
, YearWeek
, YearQuarter
, 그리고 더 .
출처 : https://stackoverflow.com/questions/530012/how-to-convert-java-util-date-to-java-sql-date
'프로그래밍 언어 > JAVA' 카테고리의 다른 글
JS 객체를 JSON 문자열로 변환 (0) | 2021.08.25 |
---|---|
자바에서 List<Integer>를 int[]로 변환하는 방법? (0) | 2021.08.23 |
DEX를 Java 소스 코드로 디컴파일 (0) | 2021.08.20 |
Java에서 String을 long으로 변환하는 방법 (0) | 2021.08.12 |
자바 8 List<V>를 Map<K, V>로 변환 하는 방법 (0) | 2021.08.12 |