web-dev-qa-db-ja.com

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

入力として Java.util.Date を使用してからそれを使用してクエリを作成しようとしているため、 Java.sql.Date が必要です。

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

413
David Ackerman

tl; dr

Java.util.DateをJava.sql.Dateに変換する方法は?

しないでください。両方のクラスは時代遅れです。

  • JDBC 4.2以降では、従来のJava.util.DateおよびJava.sql.Dateの代わりに Java.time クラスを使用します。
  • まだJava.timeに更新されていないコードと相互運用する場合は、Java.timeとの間で変換します。

PreparedStatementNAME_ を使用したクエリの例。

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

代替品:

  • InstantNAME_ の代わりにJava.util.Date
    両方ともUTCの瞬間を表します。しかし、現在はミリ秒ではなくナノ秒です。
  • LocalDateNAME_ の代わりにJava.sql.Date
    両方とも、時刻とタイムゾーンのない日付のみの値を表します。

詳細

日付のみの値(時刻なし、タイムゾーンなし)を使用する場合は、 Java.util.Date ではなく、 LocalDateNAME_ クラスを使用します。

Table of date-time types in Java (both legacy and modern) and in the SQL standard.

Java.time

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

SQLデータ型DATEname__は、日付のみであり、時刻とタイムゾーンがないことを意味します。 JavaJavaの Java.time.LocalDate まで正確にそのようなクラスはありませんでした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仕様 に準拠している場合、 LocalDateNAME_setObjectNAME_ を介してPreparedStatementname__を渡して、SQL DATEフィールドに格納できる必要があります。

myPreparedStatement.setObject( 1 , localDate );

同様に、 ResultSet::getObject を使用して、SQL DATE列からJavaLocalDatename__オブジェクトにフェッチします。 2番目の引数でクラスを指定すると、コードは type-safe に​​なります。

LocalDate localDate = ResultSet.getObject( 1 , LocalDate.class );

つまり、この質問全体はJDBC 4.2では無関係ですまたはそれ以降。

JDBCドライバーがこの方法で実行されない場合、Java.sql型への変換にフォールバックする必要があります。

Java.sql.Dateに変換

変換するには、古い日時クラスに追加された新しいメソッドを使用します。 Java.sql.Date.valueOf(…) を呼び出して、LocalDatename__を変換できます。

Java.sql.Date sqlDate = Java.sql.Date.valueOf( todayLocalDate );

そして、他の方向に向かっています。

LocalDate localDate = sqlDate.toLocalDate();

Java.util.Dateからの変換

古いdate-timeクラスの使用を避ける必要がありますが、既存のコードを使用する場合は強制される場合があります。その場合、Java.timeとの間で変換できます。

UTCのタイムライン上の瞬間を表すInstantname__クラスを調べます。 Instantname__は、Java.util.Dateと考え方が似ています。ただし、Instantname__の解像度は ナノ秒 までですが、Java.util.Dateの解像度は ミリ秒 のみです。

変換するには、古いクラスに追加された新しいメソッドを使用します。たとえば、 Java.util.Date.from( Instant ) および Java.util.Date::toInstant

Instant instant = myUtilDate.toInstant();

日付を決定するには、タイムゾーンのコンテキストが必要です。任意の瞬間について、日付はタイムゾーンによって世界中で異なります。 ZoneIdNAME_ を取得するには、 ZonedDateTimeNAME_ を適用します。

ZoneId zoneId = ZoneId.of ( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant ( instant , zoneId );
LocalDate localDate = zdt.toLocalDate();

†Java.sql.Dateクラスは、時刻のない日付のみのふりをしますが、実際には深夜に調整された時刻を dos します。紛らわしい?はい、古い日時クラスは混乱しています。


Java.timeについて

Java.time フレームワークは、Java8以降に組み込まれています。これらのクラスは、 Java.util.DateCalendarNAME_ 、& SimpleDateFormatNAME_ などの厄介な古い legacy 日時クラスに取って代わります。

Joda-Time プロジェクトは、現在 メンテナンスモード であり、 Java.time クラスへの移行を推奨しています。

詳細については、 Oracle Tutorial を参照してください。また、Stack Overflowで多くの例と説明を検索してください。仕様は JSR 31 です。

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

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

ThreeTen-Extra プロジェクトは、追加のクラスでJava.timeを拡張します。このプロジェクトは、Java.timeに将来追加される可能性のある証明の場です。 IntervalNAME_YearWeekNAME_YearQuarterNAME_more などの便利なクラスがあります。

60
Basil Bourque

気にしないで....

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

457
David Ackerman

他の答えでは時間情報に問題があるかもしれません(日付を予期しない結果と比較してください!)

私は提案します:

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

この関数は、Javaの日付オブジェクトから変換されたSQLの日付を返します。

public Java.sql.Date convertJavaDateToSqlDate(Java.util.Date date) {
    return new Java.sql.Date(date.getTime());
}
23
chetan

Java.util.DataJava.sql.Dataに変換することは、時、分、秒を失います。それでそれが可能であるならば、私はあなたがこのようにJava.sql.Timestampを使うことを勧めます:

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

詳細については、 この質問 を確認してください。

18
shellbye

JXDatePicker(Java calender)から日付を選び、それをSQLのDate型としてデータベースに格納するという私の場合、以下はうまくいきます。

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

pickedDateはJXDatePickerのオブジェクトです。

12
jack jay

この関数は、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;
    }
5

最初に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);
3
hackfield

ここでUtil DateをSql dateとyaに変換する例これは私が私のプロジェクトで使っているものの一例です。

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
Krishna

私は初心者です。考えが役に立つかもしれません

     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
2
PKSawmy

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;
}
1
Donovan Thomson
Java.sql.Date sqlDate = new Java.sql.Date(javaDate.getTime());

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

1
Rajeev Ranjan

これでやってみる

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;
}
0
kapil das