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.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 (레거시 및 현대) 및 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.