java.util.Date
입력 으로 사용하고 쿼리를 사용하여 쿼리를 작성 하려고 하므로 java.sql.Date
.
암시 적 또는 명시 적으로 변환을 수행 할 수 없다는 사실에 놀랐습니다. 그러나 Java API는 여전히 나에게 새롭기 때문에 어떻게 할 것인지조차 모릅니다.
답변
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 클래스는 어디서 구할 수 있습니까?
- 자바 SE 8 , 자바 SE 9 , 자바 SE (10) , 그리고 나중에
- 내장.
- 번들로 구현 된 표준 Java API의 일부입니다.
- Java 9에는 몇 가지 사소한 기능과 수정 사항이 추가되었습니다.
- Java SE 6 및 Java SE 7
- 대부분의 java.time 기능은 ThreeTen-Backport의 Java 6 & 7로 백 포트됩니다 .
- 기계적 인조 인간
- java.time 클래스 의 최신 버전의 Android 번들 구현 .
- 이전 Android (<26)의 경우 ThreeTenABP 프로젝트 는 위에서 언급 한 ThreeTen-Backport를 채택합니다 . ThreeTenABP 사용 방법…을 참조하십시오 .
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;
}