java.util.Dateをjava.sql.Dateに変換する方法


453

java.util.Date入力として使用し、それを使用してクエリを作成しようとしています-したがって、が必要java.sql.Dateです。

暗黙的または明示的に変換を実行できないことを知って驚きましたが、Java APIはまだかなり新しいため、どのように変換するかもわかりません。


あなたはここに同様の問題を見つけることができます stackoverflow.com/questions/12131068/...
レム

私にとっては、変換する必要がないことがわかりました。import java.sql.*私のコードにはがあり、java.util.dateをオーバーライドしているため、後者では問題なく最初の日付ではない日付値を割り当てるときに問題が発生しました。HTH
HumanInDisguise 2015

1
@DavidAckerman java.util.Dateは日付時刻ですが、java.sql.Dateは時刻のない日付に過ぎないことを理解していますか?(実際には時刻がありますが、無視されます。クラス設計の悪いハックです)SQLでは、DATE日付のみを意味します。
バジルブルク2015

2
私は確かに09年のニュアンスを認識していませんでした。この質問は非常に人気があるため、受け入れられた回答をよりモダンで完全なものに変更しました。皆様のご意見ありがとうございます!
David Ackerman

回答:


89

tl; dr

java.util.Dateをjava.sql.Dateに変換する方法

しないでください。どちらのクラスも時代遅れです。

  • レガシー&JDBC 4.2以降ではなくjava.timeクラスを使用します。java.util.Datejava.sql.Date
  • 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の瞬間を表します。しかし今ではミリ秒ではなくナノ秒になっています。
  • LocalDatejava.sql.Date
    Bothの代わりに、時刻とタイムゾーンのない日付のみの値を表します。

細部

日付のみの値(時刻なし、タイムゾーンなし)を操作する場合は、LocalDateではなくクラスを使用してくださいjava.util.Date

Java(レガシーとモダンの両方)およびSQL標準の日時タイプの表。

java.time

Java 8以降では、Javaの初期バージョンにバンドルされていた厄介な古い日時クラスは、新しいjava.timeパッケージに取って代わられました。Oracleチュートリアルを参照してください。機能の多くは、ThreeTen-BackportでJava 6および7にバックポートされ、さらにThreeTenABPで Androidに適合されています

SQLのデータ型は、 DATE時間がない日の時間がないゾーンで、日付のみであることを意味します。Javaではjava.time.LocalDate、Java 8 まで正確にそのようなクラスはありませんでした。特定のタイムゾーンに従って今日の日付を取得して、そのような値を作成しましょう(タイムゾーンは、モントリオールよりもパリの早い日の夜の日付を決定するために重要です。例)。

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仕様に準拠している場合、SQLのDATEフィールドに格納するためにLocalDatevia を渡すことができるはずです。setObjectPreparedStatement

myPreparedStatement.setObject( 1 , localDate );

同様に、ResultSet::getObjectSQL DATE列からJava LocalDateオブジェクトにフェッチするために使用します。2番目の引数でクラスを指定すると、コードがタイプセーフになります。

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との間で変換できます。

通過InstantUTCでタイムライン上の瞬間を表すクラス、。はのInstantアイデアと似てい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のフレームワークは、Java 8に組み込まれており、後にされています。これらのクラスは面倒古い取って代わるレガシーのような日付時刻クラスをjava.util.DateCalendar、& SimpleDateFormat

ジョダタイムプロジェクトは、今でメンテナンスモードへの移行をアドバイスjava.timeのクラス。

詳細については、Oracleチュートリアルを参照してください。スタックオーバーフローで多くの例と説明を検索してください。仕様はJSR 310です。

java.timeオブジェクトをデータベースと直接交換することができます。JDBC 4.2以降に準拠したJDBCドライバーを使用します。文字列もクラスも必要ありません。java.sql.*

java.timeクラスはどこで入手できますか?

JavaまたはAndroidのどのバージョンで使用するjava.timeライブラリの表

ThreeTen-エクストラプロジェクトでは、追加のクラスでjava.timeを拡張します。このプロジェクトは、java.timeに将来追加される可能性があることを証明する場です。あなたはここにいくつかの有用なクラスのような見つけることがIntervalYearWeekYearQuarter、および多くを


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仮想マシンのタイムゾーン)の時間に設定します。したがって、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 2012

2
@ wired00はい、Javaの初期バージョンにバンドルされている古い日時クラスは混乱しており、粗雑なハックを含めて設計が不適切です。可能な限り、Java 8以降で新しいjava.timeフレームワークを使用してください。これらの新しいクラスは古いクラスに取って代わります。java.timeクラスと古いクラスには、相互に変換するための便利なメソッドがいくつかあります。JDBCドライバーが更新されて新しいjava.timeタイプを直接利用するのを待つ間、便利です。
バジルブルク2015

1
@ wired00 java.timeの使用方法については、この質問の新しい回答を参照しください。StackOverflowでさらに多くの例を検索してください。
バジルブルク2015

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
データベースの日付列にjava.sql.Dateを使用している場合、その時間情報は切り捨てられます。私の意見では、ソリューションは過剰設計されています。
darioo 2010年

4
はい、多分私はそれをしました。java.sql.Dataを現在の日付と比較する必要がある場合がありますが、これが最善の方法です。お役に立てれば幸いです。
mauretto、

以下のようなFYI、ひどく面倒な古い日付時刻クラスjava.util.Datejava.util.Calendarjava.text.SimpleDateFormat今のレガシーに取って代わられ、java.timeの Javaの8に、後に内蔵されたクラス。Oracleによるチュートリアル参照してください。
バジルブルク2018

もちろん、このトピックはプレjavaの8、10歳ほど前だった
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カレンダー)から日付を選択し、それを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に変換する例を示します。これは、私のプロジェクトで使用しているものの1つで、参考になるかもしれません。

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

以下のようなFYI、ひどく面倒な古い日付時刻クラスjava.util.Datejava.util.Calendarjava.text.SimpleDateFormat今のレガシーに取って代わられ、java.timeの Javaの8に、後に内蔵されたクラス。Oracleによるチュートリアル参照してください。
バジルブルク2018

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

ここでjavaDateはjava.util.Dateのインスタンスです


1
それは、デビッド・アッカーマン、チェタン、タンメイ・クマール・ショウの答えと比較して、実際に新しいものを追加するようには見えませんか?
Ole VV

1

2つの日付を比較する方法(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 dateをsql dateに変換できます。

DateUtilities.convertUtilDateToSql(java.util.Date)

標準のJavaライブラリにはDateUtilitiesクラスはありません(Googleのクイック検索では、このメソッドをどこにも見つけることができません)。これが特定のライブラリからのものである場合は、できるだけ多く言って、ドキュメントへのリンクを含めることができます。
Bernhard Barker

-4

私はうまくいった次のコーディングを試みました。

java.util.Date utilDate = new java.util.Date();
java.sql.Date sqlDate = new java.sql.Date(utilDate);


-8

あなたがMysqlを使用している場合、日付列にこの日付の文字列表現を渡すことができます

そのため、DateFormatterクラスを使用してフォーマットし、SQLステートメントまたは準備されたステートメントで文字列として設定します

ここにコードのイラストがあります:

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.