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


453

java.util.Date입력 으로 사용하고 쿼리를 사용하여 쿼리를 작성 하려고 하므로 java.sql.Date.

암시 적 또는 명시 적으로 변환을 수행 할 수 없다는 사실에 놀랐습니다. 그러나 Java API는 여전히 나에게 새롭기 때문에 어떻게 할 것인지조차 모릅니다.


비슷한 문제를 여기서 찾을 수 있습니다 stackoverflow.com/questions/12131068/…
Lem

나를 위해, 나는 변환 할 필요가 없다는 것이 밝혀졌습니다. 가 발생했습니다 import java.sql.*후자하지만 첫 번째되지 괜찮했다 날짜 값을 할당 할 때 문제를 일으키는 따라서 java.util.date을 무시하고, 내 코드에서. HTH
HumanInDisguise

1
@DavidAckerman java.util.Date는 날짜 시간이지만 java.sql.Date는 시간이 없는 날짜 일 뿐이라는 것을 알고 있습니까? (실제로 시간이 있지만 클래스 디자인의 나쁜 해킹은 무시됩니다) SQL에서 DATE날짜 만 의미합니다.
Basil Bourque

2
나는 실제로 '09 년의 뉘앙스에 대해 알지 못했고이 질문이 매우 인기가 있기 때문에 받아 들여진 대답을보다 현대적이고 완전한 답변으로 변경했습니다. 입력 해 주셔서 감사합니다.
David Ackerman

답변:


89

tl; dr

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

하지마 두 클래스 모두 낡았습니다.

  • 사용 java.time의 대신 기존의 클래스 java.util.Datejava.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 (레거시 및 현대) 및 SQL 표준의 날짜-시간 유형 테이블.

java.time

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

SQL 데이터 유형은 DATE 짧은 시간 일-의없이 시간대와 날짜 전용하기위한 것입니다. Java java.time.LocalDate8에서는 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통해 setObjectA의 PreparedStatement는 SQL DATE 필드에 저장합니다.

myPreparedStatement.setObject( 1 , localDate );

마찬가지로 ResultSet::getObjectSQL 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로 표시되는 순간을 나타내는 수업 을 진행합니다 . 는 InstantA와 생각이 비슷하다 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 클래스는 어디서 구할 수 있습니까?

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

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


478

신경 쓰지 마....

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 입니다 .


34
이것은 명백한 전환이 아닙니다! Javadoc에서 : "주어진 밀리 초 값에 시간 정보가 포함되어 있으면 드라이버는 시간 구성 요소를 기본 시간대 (응용 프로그램을 실행하는 Java 가상 머신의 시간대)에서 GMT가 0 인 시간으로 설정합니다." 따라서 java.util.Date의 시간에 관계없이 데이터 유형이 DATE로 설정된 열에 00:00:00으로 삽입됩니다.

1
@David Ackerman ....이 메소드는 epochseconds이후의 밀리 초를 반환합니다 1,JAN,1970. 그러나이 날짜 이전에 사람의 날짜를 저장하려면 어떻게해야합니까? ... 또는 다음과 같은 것0000-00-00 as default
Arjun KP

31
필자의 경우 정답은 시간 필드를 유지하기 때문에 <code> java.sql.Timestamp sqlTimestamp = new java.sql.Timestamp (utilDate.getTime ()); </ code>입니다.
Alberto de Paola

2
@ wired00 그렇습니다 . 초기 버전의 Java와 번들로 제공되는 이전 날짜-시간 클래스 는 혼란 스럽고 일부 해킹을 포함하여 잘못 설계되었습니다. 가능하면 Java 8 이상에서 새로운 java.time 프레임 워크 를 사용하십시오 . 이 새로운 클래스는 이전 클래스를 대체합니다. java.time 클래스와 이전 클래스에는 앞뒤로 변환하는 편리한 방법이 있습니다. 새로운 java.time 유형을 직접 활용하기 위해 JDBC 드라이버가 업데이트되기를 기다리는 동안 유용합니다.
Basil Bourque

1
@ wired00 java.time 사용법에 대해서는 이 질문에 대한 새로운 답변 을 참조하십시오 . 더 많은 예제를 보려면 StackOverflow를 검색하십시오.
Basil Bourque

39

다른 답변으로 시간 정보에 문제가있을 수 있습니다 (예기치 않은 결과와 날짜를 비교하십시오!)

나는 제안한다 :

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);

5
데이터베이스의 Date 열에 java.sql.Date를 사용하는 경우 해당 시간 정보가 잘립니다. 내 의견으로는 솔루션을 과도하게 설계했습니다.
darioo

4
예, 어쩌면 내가 할 수 있습니다. 때로는 java.sql.Data를 현재 날짜와 비교해야하며 이것이 가장 좋은 방법입니다. 도움이 되길 바랍니다.
mauretto

참고로, 같은 몹시 귀찮은 된 날짜 - 시간 수업 java.util.Date, java.util.Calendar그리고 java.text.SimpleDateFormat지금 기존 에 의해 대체, java.time의 나중에 자바 8에 내장 된 클래스. Oracle의 Tutorial 참조하십시오 .
Basil Bourque

물론,이 주제는 약 10 년 전에 자바 8 이전이었다.
mauretto

26

이 함수는 java 날짜 오브젝트에서 변환 된 SQL 날짜를 리턴합니다.

public java.sql.Date convertJavaDateToSqlDate(java.util.Date date) {
    return new java.sql.Date(date.getTime());
}

18

로 변환 java.util.Data하면 java.sql.Data시, 분 및 초가 느슨해집니다. 가능하다면 다음 java.sql.Timestamp과 같이 사용하는 것이 좋습니다 .

prepareStatement.setTimestamp(1, new Timestamp(utilDate.getTime()));

자세한 내용은 이 질문을 확인 하십시오 .


16

JXDatePicker (java calender)에서 날짜를 선택하여 데이터베이스에 SQL 날짜 유형으로 저장하는 경우 아래에서 잘 작동합니다.

java.sql.Date date = new java.sql.Date(pickedDate.getDate().getTime());

pickedDate는 JXDatePicker의 객체입니다.


5

이 함수는 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;
    }

3

java.util.Date를 먼저 형식화하십시오. 그런 다음 형식화 된 날짜를 사용하여 java.sql.Date의 날짜를 가져 오십시오.

java.util.Date utilDate = "Your date"
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
final String stringDate= dateFormat.format(utilDate);
final java.sql.Date sqlDate=  java.sql.Date.valueOf(stringDate);

2

여기에 Util Date를 Sql date로 변환하는 예와 나중에 이것은 내 프로젝트에서 사용중인 것 중 하나입니다.

java.util.Date utilStartDate = table_Login.getDob();(orwhat ever date your give form obj)
java.sql.Date sqlStartDate = new java.sql.Date(utilStartDate.getTime());(converting date)

2

나는 초보자입니다. 생각이 도움이 될 수 있습니다

     String bufDt =  bDOB.getText();  //data from form
     DateFormat dF = new SimpleDateFormat("dd-MM-yyyy"); //data in form is in this format
     Date bbdt = (Date)dF.parse(bufDt);  // string data is converted into java util date
     DateFormat dsF = new SimpleDateFormat("yyyy-MM-dd"); //converted date is reformatted for conversion to sql.date
     String ndt = dsF.format(bbdt); // java util date is converted to compatible java sql date
     java.sql.Date sqlDate=  java.sql.Date.valueOf(ndt);  // finally data from the form is convered to java sql. date for placing in database

참고로, 같은 몹시 귀찮은 된 날짜 - 시간 수업 java.util.Date, java.util.Calendar그리고 java.text.SimpleDateFormat지금 기존 에 의해 대체, java.time의 나중에 자바 8에 내장 된 클래스. Oracle의 Tutorial 참조하십시오 .
Basil Bourque

2
java.sql.Date sqlDate = new java.sql.Date(javaDate.getTime());

여기에서 javaDate는 java.util.Date의 인스턴스입니다.


1
Chetan과 Tanmay kumar shaw 인 David Ackerman의 답변과 비교할 때 실제로 새로운 것을 추가하지 않는 것 같습니까?
Ole VV

1

두 날짜를 비교하는 방법 (util.date 또는 sql.date)

 public static boolean isSameDay(Date a, Date b) {
    Calendar calA = new GregorianCalendar();
    calA.setTime(a);

    Calendar calB = new GregorianCalendar();
    calB.setTime(b);

    final int yearA = calA.get(Calendar.YEAR);
    final int monthA = calA.get(Calendar.MONTH);
    final int dayA = calA.get(Calendar.DAY_OF_YEAR);

    final int yearB = calB.get(Calendar.YEAR);
    final int monthB = calB.get(Calendar.MONTH);
    final int dayB = calB.get(Calendar.DAY_OF_YEAR);

    return yearA == yearB && monthA == monthB && dayA == dayB;
}

0

이것으로 시도

public static String toMysqlDateStr(Date date) {
    String dateForMySql = "";
    if (date == null) {
        dateForMySql = null;
    } else {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        dateForMySql = sdf.format(date);
    }

    return dateForMySql;
}

-1

나는 변환하는 가장 좋은 방법은 다음과 같습니다.

static java.sql.Timestamp SQLDateTime(Long utilDate) {
    return new java.sql.Timestamp(utilDate);
}

Date date = new Date();
java.sql.Timestamp dt = SQLDateTime(date.getTime());

dt변수를 SQL 테이블 에 삽입하려면 다음을 수행하십시오.

insert into table (expireAt) values ('"+dt+"');

1
이것은 1 년 전 게시 된 이 답변 과 본질적으로 동일한 것으로 보입니다 .
Bernhard Barker

-3

다음 코드를 사용하고 있습니다. 시도하십시오.

DateFormat fm= new SimpleDateFormatter();

예를 들어 원하는 날짜 형식을 지정 "DD-MM_YYYY"하거나 'YYYY-mm-dd' 다음과 같이 java Date 데이터 유형을 사용하십시오.

fm.format("object of java.util.date");

그런 다음 날짜를 파싱합니다


-3

이 방법을 사용하여 util 날짜를 sql 날짜로 변환 할 수 있습니다.

DateUtilities.convertUtilDateToSql(java.util.Date)

표준 Java 라이브러리에는 DateUtilities 클래스가 없습니다 (빠른 Google 검색 에서이 방법을 찾을 수조차 없습니다). 특정 라이브러리에서 가져온 것이라면 말하고 문서에 대한 링크를 포함시킬 수 있습니다.
Bernhard Barker

-4

나는 잘 작동하는 다음 코딩을 시도하고있었습니다.

java.util.Date utilDate = 새로운 java.util.Date ();
java.sql.Date sqlDate = 새로운 java.sql.Date (utilDate);


-8

Mysql을 사용하는 경우 날짜 열에이 날짜의 문자열 표현이 전달 될 수 있습니다.

그래서 DateFormatter 클래스를 사용하여 형식을 지정한 다음 SQL 문 또는 준비된 문에서 String으로 설정하십시오.

다음은 코드 그림입니다.

private String converUtilDateToSqlDate(java.util.Date utilDate) {
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    String sqlDate = sdf.format(utilDate);
    return sqlDate;
}

문자열 날짜 = converUtilDateToSqlDate (otherTransaction.getTransDate ());

//이 날짜를 SQL 문에 전달하십시오.


14
stackoverflow에 오신 것을 환영합니다. 귀하의 답변에 몇 가지 의견이 있습니다. 문제는 "java.util.Date를 java.sql.Date로 변환하는 방법"이었습니다. 붙여 넣은 코드는 java.util.Date를 yyyy-MM-dd로 형식화합니다. java.sql.Date를 문자열로 사용하는 대신 jdbc 드라이버에 직접 전달해야하므로 실제로이 컨텍스트에서는 제한적으로 사용됩니다.
jontro
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.