java.time.LocalDateをjava.util.Dateタイプに変換します


372

タイプに変換java.time.LocalDateしたいjava.util.Date。日付をに設定したいのでJDateChooser。または、日付をサポートする日付選択機能はありjava.timeますか?



2
LGoodDatePickerは、ネイティブのJava 8時間、または別名(java.timeパッケージを使用してJSR-310具体的には、LGoodDatePickerは、日付の値を保存するために「java.time.LocalDate」を使用しスクリーンショットとデモである。。プロジェクトのホームページ
BlakeTNC

回答:


560
Date date = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());

これは、日付チューザーがシステムのデフォルトのタイムゾーンを使用して日付を文字列に変換することを前提としています。


JB NizetはおそらくJava 8が開発/リリースの初期段階にあり、@ user3509494がなんとかそれをテストしていました。
russellhoff 2015

2
atStartOfDay()私が理解しているように、日付の値を変更するため、を回避することは可能ですか?
yegor256 2017年

1
@JBNizetあなたの答えは私にはあまり意味をなさないので、明確にすることにしました。無駄なコメントをする代わりに、それを明確にしてみませんか?
yegor256 2017年

12
どうして、なぜそれが明確化を必要とするのか、私にはわからないからです。232人がこの回答に賛成しました。あなたはatStartOfDayが日付の値を変更すると言います。それは意味がありません。atStartOfDayは、javadocが言うことを実行します。同じ日付で、その日の開始時にLocalDateをLocalDateTimeに変換します。
JB Nizet 2017年

2
@cornz結果が正しくないことを確信していますか?ドイツにいる場合は、1893年4月にドイツで発生した6分の32秒の問題が原因である可能性があります。詳細については、timeanddate.com / time / zone / germany / berlin?syear = 1850を参照してください。 。
Dawood ibnカリーム

104

以下は、新しいjava.timeクラスをjava.util.Dateオブジェクトに、またはその逆に変換するために使用するユーティリティクラスです。

import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Date;

public class DateUtils {

  public static Date asDate(LocalDate localDate) {
    return Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());
  }

  public static Date asDate(LocalDateTime localDateTime) {
    return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
  }

  public static LocalDate asLocalDate(Date date) {
    return Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDate();
  }

  public static LocalDateTime asLocalDateTime(Date date) {
    return Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDateTime();
  }
}

@Olivコメントに基づいて編集。


ZoneId.systemDefault()タイムゾーンは年間を通じて変化するため、問題はありません。つまり、1月1日のタイムゾーンが-05:00(中央)であるのに、7月1日のタイムゾーンが-06:00(中央の夏時間)である場合、夏時間のために結果が不正確になることはありません。時間?
jhilden 2018

95

java.sql.Date.valueOf()メソッドは次のように使用できます。

Date date = java.sql.Date.valueOf(localDate);

時間とタイムゾーン情報は暗黙的に取得されるため、ここに追加する必要はありません。LocalDateからjava.util.Dateへ、およびその逆の最も単純な変換を
参照してください


LocalDateをSQLに渡す必要があったので、これは私にとって完璧でした。ただし、日付のフォーマッタが日付をフォーマットする前にタイムゾーンのシフトについて何かを行う場合、ローカルタイムゾーンによっては1日が早すぎる可能性があります。その場合は、上記のオプションのいずれかが必要になります。
Tom Dibble、2015年

7
java.sql.Dateデータベース層、JDBC、JPA用です。Webレイヤー(または任意のクライアントアプリケーション)には、絶対にからの依存関係がないはずjava.sql.*です。
タイニー

2
@Tiny java.sql.Dateはrt.jarにあります。外部依存関係はありません。言語機能を使用するだけです。
ジョージ

2
java.sql.Dateちょうどあるjava.util.Dateまでその時間設定で00:00:00はなく、デザインの視点でのポイントは、それがあるjava.sql.*サーブレット/ JSP等とやり取りフロント層にどのクライアントを意味するものではありません。java.util.DateJava側、java.sql.Timestampまたはjava.sql.*JDBC側から適用できるもの
小さな

5
これは、java.time。*作者によると、「恐ろしいハック」です:stackoverflow.com/questions/33066904/…。Java 9では、java.sql.*クラスは別の依存関係になります。
Dherik

16

java.timeには、ほとんどの時間クラスからInstantオブジェクトを作成するために使用できるTemporalインターフェースがあります。Instantは、エポックのタイムライン上のミリ秒を表します。これは、他のすべての日付と時刻の基本参照です。

変換を行うには、DateをTimedとZoneを持つZonedDateTimeに変換する必要があります。

LocalDate ldate = ...;
Instant instant = Instant.from(ldate.atStartOfDay(ZoneId.of("GMT")));
Date date = Date.from(instant);

12

java.time.LocalDateからjava.util.Dateを作成するには、

  • LocalDateに時間を追加する
  • タイムゾーン内の日付と時刻を解釈する
  • エポック以降の秒数/ミリ秒数を取得します
  • java.util.Dateを作成する

コードは次のようになります。

LocalDate localDate = LocalDate.now();
Date date = new Date(localDate.atStartOfDay(ZoneId.of("America/New_York")).toEpochSecond() * 1000);

1
ゾーンIDの誤植(ZoneIf)
アッシリア14

localDate.atStartOfDay()はZonedDateTimeを作成しますが、ZonedDateTimeのtoEpochSecond()メソッドはありません。
Kevin Sadler、2014

@KevinSadler:メソッドtoEpochSecondはから継承されjava.time.chrono.ChronoZonedDateTimeます。docs.oracle.com/javase/8/docs/api/java/time/chrono/…を
nosid

@nosid訂正ありがとうございます。Eclipseでコード補完を使用すると、それ(およびtoInstance)がオプションとして表示されません。しかし、私が完全にそれをタイプすれば、それは受け入れられるようです。あなたが言うように、継承されたメソッドとしてリストされているため、これはメソッドではないという誤った結論を出し、ZonedDateTimeのJavadocには表示されていませんでした。アップクリックを承認してください:)
Kevin Sadler

11

これは私にとってはうまくいきます:

java.util.Date d = new SimpleDateFormat("yyyy-MM-dd").parse(localDate.toString());

https://docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html#toString--


6
これはかなり非効率的です
AndresQ 2017年

1
Instantへの変換は冗長かもしれませんが、文字列の作成と解析は、ニューヨークからメキシコシティへ東京経由で行くようなものです...
ehecatl

1
はい、それほど効率的ではありませんが、ほとんどのソリューションは非常に冗長です。これは単なる冗長であり、読みやすく理解しやすいです。
ceklock

2
@ehecatl注意してください...将来的にはニューヨーク->東京->メキシコシティは1時間以内に完了する可能性があります;)
ステファン

3

Kotlinソリューション:

1)この拡張機能をどこかに貼り付けます。

fun LocalDate.toDate(): Date = Date.from(this.atStartOfDay(ZoneId.systemDefault()).toInstant())

2)それを使用し、これを再度グーグルすることはありません。

val myDate = myLocalDate.toDate()

11
「Kotlinへの切り替え」はどのように簡単ですか。これはJavaの質問です。
ehecatl 2018

1
Java LocalDateをDateに変換することは、JVM開発者にとって一般的な厄介な問題です。これはKotlin開発者向けのソリューションです。
gyoder

-1
public static Date convertToTimeZone(Date date, String tzFrom, String tzTo) {
    return Date.from(LocalDateTime.ofInstant(date.toInstant(), ZoneId.of(tzTo)).atZone(ZoneId.of(tzFrom)).toInstant());
} 

2
解決策を説明してください。
Martin Zabel


-3
java.util.Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());

あなたの答えは4年後に受け入れられたものとどう違いますか?評判を高めるためにコピーして貼り付けますか?
スティンガー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.