tl; dr
java.util.Date를 java.sql.Date로 변환하는 방법?
하지마 두 클래스 모두 낡았습니다.
- 사용 java.time의 대신 기존의 클래스
java.util.Date
및 java.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.time
Java 8 이상에서 초기 버전의 Java와 함께 번들로 제공되는 번거로운 이전 날짜-시간 클래스는 새로운 java.time 패키지 로 대체되었습니다 . Oracle Tutorial을 참조하십시오 . 대부분의 기능은 자바 6 7 백 포팅 된 ThreeTen - 백 포트 및 상기 안드로이드 적응 ThreeTenABP .
SQL 데이터 유형은 DATE
짧은 시간 일-의없이 시간대와 날짜 전용하기위한 것입니다. Java java.time.LocalDate
8에서는 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
통해 setObject
A의 PreparedStatement
는 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 유형으로 변환해야합니다.
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로 표시되는 순간을 나타내는 수업 을 진행합니다 . 는 Instant
A와 생각이 비슷하다 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 클래스는 어디서 구할 수 있습니까?
ThreeTen - 추가 프로젝트 추가 클래스와 java.time를 확장합니다. 이 프로젝트는 향후 java.time에 추가 될 수있는 입증 된 근거입니다. 당신은 여기에 몇 가지 유용한 클래스와 같은 찾을 수 있습니다 Interval
, YearWeek
, YearQuarter
, 그리고 더 .