java.displaces를 클릭합니다.날짜 vs java.sql.날짜.
java.util.Date
»java.sql.Date
어, 어, 어, 어?
축하해, JDBC: 데이트 수업 처리로 내가 제일 좋아하는 짜증나게 했어.
기본적으로 데이터베이스는 일반적으로 날짜, 시간 및 타임스탬프의 최소 세 가지 형식의 날짜/시간 필드를 지원합니다.이들 각각은 JDBC에 대응하는 클래스를 가지며 각각을 확장합니다.이들 3개의 간단한 의미는 다음과 같습니다.
java.sql.Date
SQL DATE에 해당하므로 년, 월, 일, 시, 분, 초 및 밀리초가 무시됩니다.또한.sql.Date
타임존에 얽매이지 않아요java.sql.Time
는 SQL TIME에 대응하고 있으며 명백하게 시간, 분, 초 및 밀리초에 대한 정보만 포함되어 있습니다.java.sql.Timestamp
는 커스터마이즈 가능한 정밀도로 나노초(밀리초밖에 지원하지 않음)의 정확한 날짜인SQL TIMESTAMP에 대응합니다.
이들 3가지 타입과 관련하여 JDBC 드라이버를 사용할 때 발생하는 가장 일반적인 오류 중 하나는 타입이 잘못 처리된다는 것입니다.즉,sql.Date
따라 다릅니다.sql.Time
에는 현재 년도, 월도, 요일 등이 포함되어 있습니다.
마지막으로:어떤 걸로 할까요?
SQL을 사용하다 PreparedStatement
에는 세 값 에 대한 가 있습니다.#setDate()
의 일등공신인 모양sql.Date
,#setTime()
★★★★★★에sql.Time
★★★★★★★★★★★★★★★★★」#setTimestamp()
★★★★★★에sql.Timestamp
.
" " " 를 " " 를 합니다.ps.setObject(fieldIndex, utilDateObject);
으로 줄 수 요.util.Date
대부분의 JDBC 드라이버는 올바른 타입의 드라이버인 것처럼 기뻐하지만 나중에 데이터를 요청하면 실제로 데이터가 누락될 수 있습니다.
내 말은 어떤 날짜도 사용하지 말라는 거야.
즉, 밀리초/나노초를 일반 길이로 저장하고 사용 중인 개체로 변환합니다(필수 joda-time 플러그).하나의 해킹 방법은 날짜 구성요소를 하나의 긴 구성요소로 저장하고 다른 구성요소로 저장하는 것입니다. 예를 들어 현재 20100221과 154536123입니다.이러한 매직넘버는 SQL 쿼리에서 사용할 수 있으며 데이터베이스에서 다른 데이터베이스로 이동할 수 있으며 JDBC/Java Date API의 이 부분을 완전히 피할 수 있습니다.
Late Edit: Java 8부터는 둘 다 사용할 수 없습니다.java.util.Date
않다java.sql.Date
가능하면 피하고 패키지(Joda 베이스)를 사용하는 것이 좋습니다.Java 8을 사용하고 있지 않은 경우, 원래의 응답은 다음과 같습니다.
java.sql.Date
- 사용하는 라이브러리의 메서드/컨스트럭터(JDBC 등)를 호출할 때.그렇지 않다.JDBC를 명시적으로 처리하지 않는 응용 프로그램/모듈에 대해 데이터베이스 라이브러리에 종속성을 도입하고 싶지 않습니다.
java.util.Date
- 사용하는 라이브러리를 사용할 경우.그 이외의 경우는, 몇개의 이유로 가능한 한 적게 합니다.
변형이 가능하기 때문에 메서드에 전달하거나 메서드에서 반환할 때마다 복사본을 만들어야 합니다.
데이트를 잘 다루지 못하는데, 당신과 같은 거꾸로 된 사람들은 데이트를 다루는 수업을 들어야 한다고 생각해요.
왜냐하면 j.u. 때문에 j.u.u.. D는 그 일을 .
Calendar
도입되었습니다.그것들은 또한 변하기 쉽고 함께 일하기에 끔찍하며, 만약 선택의 여지가 없다면 피해야 한다.Joda Time API와 같은 더 나은 대안이 있다(
JodaTime API는Java 7에 들어가 새로운 공식 날짜 처리API가 될수도 있다- 빠른 검색에서는 그렇지 않을 것이라고 한다).
조다와 같은 새로운 의존관계를 도입하는 것이 지나치다고 느낀다면long
오브젝트의 타임스탬프 필드에 사용하는 것은 나쁘지 않습니다만, 저는 보통 j.u로 랩합니다.D, , d 、 d d 、 d d d d d 。
를 사용할 수 있는 java.sql.Date
PreparedStatement.setDate
않으면 을 사용합니다.java.util.Date
라고 있어요.ResultSet.getDate
를 반환하다java.sql.Date
직접 을 할 도 있어요.java.util.Date
.
dr;dr
둘 다 사용하지 마세요.
java.time.Instant
치환하다java.util.Date
java.time.LocalDate
치환하다java.sql.Date
둘 다 아니다.
java.displaces를 클릭합니다.날짜 vs java.sql.날짜: 언제, 왜 사용합니까?
이 수업들은 모두 형편없고 설계와 구현에 결함이 있습니다.다음과 같이 피하다
전염병 코로나 바이러스
대신 JSR 310에 정의되어 있는java.time 클래스를 사용합니다.이러한 클래스는 날짜/시간 처리 작업을 위한 업계 최고의 프레임워크입니다.이런 끔찍한 유산 계급은 완전히 대체한다.Date
,Calendar
,SimpleDateFormat
java.util.Date
java.util.Date
번째, ★★★★★★★★★★★★★★★★.java.util.Date
는 UTC 단위로의 순간을 나타냅니다.즉, UTC로부터의 오프셋은 0시간 분초입니다.
java.time.Instant
이것으로 대체하겠습니다.
Instant instant = Instant.now() ; // Capture the current moment as seen in UTC.
java.time.OffsetDateTime
Instant
는 java.time의 기본 빌딩 블록 클래스입니다.보다 유연하게 하려면 , UTC 로의 시간을 나타내는 것과 같은 목적으로 set to 를 사용합니다.
OffsetDateTime odt = OffsetDateTime.now( ZoneOffset.UTC ) ;
이 오브젝트는 JDBC 4.2 이후를 사용하여 데이터베이스로 전송할 수 있습니다.
myPreparedStatement.setObject( … , odt ) ;
취득하다.
OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;
java.sql.Date
java.sql.Date
그java.sql.Date
수업 또한 끔찍하고 구식이다.
이 클래스는 날짜만 나타내며 시간대 및 시간대는 표시하지 않습니다.불행하게도, 형편없는 디자인의 해킹에서, 이 클래스는 다음으로부터 물려받습니다.java.util.Date
이것은 모멘트를 나타냅니다(UTC 의 시각의 날짜).따라서 이 클래스는 날짜만 가장하고 실제로는 UTC의 시각 및 암묵적인 오프셋을 전송합니다.이것은 많은 혼란을 일으킨다.이 클래스는 사용하지 마십시오.
java.time.LocalDate
대신 시간, 시간대 또는 오프셋 없이 날짜(년, 월, 일)만 추적하는 데 사용합니다.
ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
LocalDate ld = LocalDate.now( z ) ; // Capture the current date as seen in the wall-clock time used by the people of a particular region (a time zone).
데이터베이스로 전송합니다.
myPreparedStatement.setObject( … , ld ) ;
취득하다.
LocalDate ld = myResultSet.getObject( … , LocalDate.class ) ;
java.time 정보
java.time 프레임워크는 Java 8 이후에 포함되어 있습니다.이러한 클래스는 , 및 등 문제가 많은 오래된 레거시 날짜 시간 클래스를 대체합니다.
자세한 내용은 Oracle 자습서를 참조하십시오.또한 Stack Overflow를 검색하여 많은 예와 설명을 확인하십시오.사양은 JSR 310입니다.
현재 유지보수 모드에 있는 조다 타임 프로젝트는 java.time 클래스로의 이행을 권장합니다.
java.time 객체를 데이터베이스와 직접 교환할 수 있습니다.JDBC 4.2 이후에 준거한JDBC 드라이버를 사용합니다.스트링도 필요 없고java.sql.*
반.
java.time 클래스는 어디서 얻을 수 있습니까?
- 자바 SE 8, 자바 SE 9, 자바 SE 10, 자바 SE 11 및 이후 - 표준 Java API의 일부이며 번들 구현이 포함되어 있습니다.
- Java 9에는 몇 가지 사소한 기능과 수정 사항이 추가되어 있습니다.
- 자바 SE 6 및 자바 SE 7
- java.time 기능의 대부분은 ThreeTen 백포트의 Java 6 및7로 백포트됩니다.
- 안드로이드
- 최신 버전의 Android 번들 구현 java.time 클래스.
- 이전의 Android(<26)에서는 쓰리텐ABP 프로젝트가 ThreeTen-Backport(상기)를 채택하고 있습니다.'쓰리텐ABP 사용방법'을 참조하십시오.
저도 같은 문제가 있었습니다만, 현재 날짜를 준비된 스테이트먼트에 삽입하는 가장 쉬운 방법은 다음과 같습니다.
preparedStatement.setDate(1, new java.sql.Date(new java.util.Date().getTime()));
java.util.Java의 날짜 클래스는 특정 시간(예: 2013년 11월 25일 16:30:45 ~ 밀리초)을 나타내지만 DB의 DATE 데이터 유형은 날짜(예: 2013년 11월 25일)만을 나타냅니다.java.util을 제공하지 않도록 합니다.실수로 DB에 대한 날짜 개체입니다. Java에서는 SQL 매개 변수를 java.util로 설정할 수 없습니다.직접 날짜:
PreparedStatement st = ...
java.util.Date d = ...
st.setDate(1, d); //will not work
그러나 여전히 강제/의도에 따라 이 작업을 수행할 수 있습니다(이 경우 DB 드라이버는 시간과 분을 무시합니다).이것은 java.sql을 사용하여 이루어집니다.날짜 클래스:
PreparedStatement st = ...
java.util.Date d = ...
st.setDate(1, new java.sql.Date(d.getTime())); //will work
java.sql.날짜 오브젝트는 시간을 저장할 수 있습니다(java.util에서 쉽게 구성할 수 있습니다).날짜) 단, 시간 동안 요청하려고 하면 예외가 발생합니다(날짜만 해당 개념 적용).DB 드라이버는 이 클래스를 인식하고 시간 동안 0을 사용해야 합니다.이것을 시험해 보세요.
public static void main(String[] args) {
java.util.Date d1 = new java.util.Date(12345);//ms since 1970 Jan 1 midnight
java.sql.Date d2 = new java.sql.Date(12345);
System.out.println(d1.getHours());
System.out.println(d2.getHours());
}
java.util.Date
밀리초의 정밀도로 특정 순간을 나타냅니다.타임존이 없는 날짜와 시각 정보를 나타냅니다.java.util.Date 클래스는 Serializable, Cloneable 및 Comparible 인터페이스를 구현합니다.에 의해 상속됩니다.java.sql.Date
,java.sql.Time
그리고.java.sql.Timestamp
인터페이스입니다.
java.sql.Date
를 확장합니다.시간 정보가 없는 날짜를 나타내는 날짜 클래스. 데이터베이스를 다룰 때만 사용해야 합니다.SQL DATE의 정의에 준거하기 위해 milliseconds 값은 a로 둘러싸여 있습니다.java.sql.Date
인스턴스가 관련되어 있는 특정 시간대에서 시간, 분, 초 및 밀리초를 0으로 설정하여 인스턴스를 '정규화'해야 합니다.
모든 공개 방법을 상속합니다.java.util.Date
예를 들어getHours()
,getMinutes()
,getSeconds()
,setHours()
,setMinutes()
,setSeconds()
.~하듯이java.sql.Date
시간 정보는 저장되지 않습니다.이것은, 다음의 모든 시간 조작을 덮어씁니다.java.util.Date
그리고 이 모든 방법들이java.lang.IllegalArgumentException
구현 세부사항에서 명확하게 호출된 경우.
언급URL : https://stackoverflow.com/questions/2305973/java-util-date-vs-java-sql-date
'programing' 카테고리의 다른 글
C의 파일 끝에 추가 (0) | 2022.08.30 |
---|---|
Vue 라우터 Auth-guard 함수가 Vuex 스토어 상태를 확인하지 않음 (0) | 2022.08.30 |
vue-cli를 사용하지 않고 typescript/vue-router/vuex/를 사용하여 vue.js3 앱을 생성하는 방법 (0) | 2022.08.30 |
Vuex "context" 개체는 무엇입니까? (0) | 2022.08.30 |
Vue.js - 원본 양식 데이터가 변경되지 않는 한 제출 버튼 비활성화 (0) | 2022.08.30 |