web-dev-qa-db-ja.com

LocalDateをLocalDateTimeまたはJava.sql.Timestampに変換します

JodaTime 1.6.2を使用しています。

私はLocalDateを持っているので、それを(Joda)LocalDateTimeまたはormapping用のJava.sqlTimestampに変換する必要があります。

その理由は、LocalDateTimeJava.sql.Timestampの間の変換方法を見つけたからです。

LocalDateTime ldt = new LocalDateTime();
DateTimeFormatter dtf = DateTimeFormatter.forPattern("yyyy-MM-dd HH:mm:ss");
Timestamp ts = Timestamp.valueOf(ldt.toString(dtf));

したがって、LocalDateLocalDateTimeの間で変換できる場合は、Java.sql.Timestampへの継続的な変換を行うことができます。正しい方向へのナッジをありがとう!

104
IAmYourFaja

JodaTime

JodaTimeの org.joda.time.LocalDateJava.sql.Timestamp に変換するには、単に

Timestamp timestamp = new Timestamp(localDate.toDateTimeAtStartOfDay().getMillis());

JodaTimeの org.joda.time.LocalDateTimeJava.sql.Timestamp に変換するには、単に

Timestamp timestamp = new Timestamp(localDateTime.toDateTime().getMillis());

JavaTime

Java8の Java.time.LocalDateJava.sql.Timestamp に変換するには、単に

Timestamp timestamp = Timestamp.valueOf(localDate.atStartOfDay());

Java8の Java.time.LocalDateTimeJava.sql.Timestamp に変換するには、単に

Timestamp timestamp = Timestamp.valueOf(localDateTime);
233
BalusC

最良の方法はJava 8時間APIを使用します:

  LocalDateTime ldt = timeStamp.toLocalDateTime();
  Timestamp ts = Timestamp.valueOf(ldt);

モデルで使用するJPAで使用する場合( https://weblogs.Java.net/blog/montanajava/archive/2014/06/17/using-Java-8-datetime-classes-jpa ):

@Converter(autoApply = true)
public class LocalDateTimeConverter implements AttributeConverter<LocalDateTime, Timestamp> {
    @Override
    public Timestamp convertToDatabaseColumn(LocalDateTime ldt) {
        return Timestamp.valueOf(ldt);
    }

    @Override
    public LocalDateTime convertToEntityAttribute(Timestamp ts) {
        return ts.toLocalDateTime();
    }
}

したがって、現在は相対的なタイムゾーンに依存しない時間です。さらに、簡単です:

  LocalDate ld = ldt.toLocalDate();
  LocalTime lt = ldt.toLocalTime();

書式設定:

 DateTimeFormatter DATE_TME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")
 String str = ldt.format(DATE_TME_FORMATTER);
 ldt = LocalDateTime.parse(str, DATE_TME_FORMATTER);

更新:postgres 9.4.1208、HSQLDB 2.4.0などは、会話なしでJava 8 Time APIを理解します!

50
GKislin

tl; dr

Joda-Time プロジェクトはメンテナンスモードで、現在はJava.timeクラスに取って代わりました。

  • 単に Java.time.Instantクラスを使用します。
  • 必要ありません:
    • LocalDateTime
    • Java.sql.Timestamp
    • ひも

UTCで現在の瞬間をキャプチャします。

Instant.now()  

その瞬間をデータベースに保存するには:

myPreparedStatement.setObject( … , Instant.now() )  // Writes an `Instant` to database.

Datbaseからその瞬間を取得するには:

myResultSet.getObject( … , Instant.class )  // Instantiates a `Instant`

壁時計の時刻を特定のタイムゾーンの時刻に合わせます。

instant.atZone( z )  // Instantiates a `ZonedDateTime`

LocalDateTimeは間違ったクラスです

他の回答は正しいですが、LocalDateTimeが目的にとって間違ったクラスであると指摘するのに失敗します。

Java.timeJoda-Timeの両方で、 LocalDateTime には意図的にタイムゾーンまたはUTCからのオフセットの概念がありません。そのため、それはではなく瞬間を表し、ではなくタイムライン上のポイントです。 LocalDateTimeは、約26〜27時間の範囲にある潜在的なモーメントに関する大まかなアイデアを表します。

LocalDateTimeは、ゾーン/オフセットが不明な場合(良い状況ではない場合)、またはゾーンオフセットが不確定な場合に使用します。たとえば、「クリスマスは2018年12月25の最初の瞬間に開始します」はLocalDateTimeとして表されます。

特定のタイムゾーンでの瞬間を表すには、ZonedDateTimeを使用します。たとえば、Pacific/AucklandAmerica/Montrealなどの特定のゾーンで始まるクリスマスは、 ZonedDateTime オブジェクトで表されます。

しばらくの間は常にUTCで、Instantを使用します。

Instant instant = Instant.now() ;  // Capture the current moment in UTC.

タイムゾーンを適用します。タイムライン上の同じ瞬間、同じポイントですが、異なる壁時計時間で表示されます。

ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;  // Same moment, different wall-clock time.

したがって、LocalDateとLocalDateTimeの間で変換できる場合は、

いいえ、間違った戦略です。日付のみの値があり、日付と時刻の値が必要な場合は、時刻を指定する必要があります。その時刻は特定のゾーンのその日付では有効ではない可能性があります。この場合、ZonedDateTimeクラスは必要に応じて時刻を自動的に調整します。

LocalDate ld = LocalDate.of( 2018 , Month.JANUARY , 23 ) ;
LocalTime lt = LocalTime.of( 14 , 0 ) ;  // 14:00 = 2 PM.
ZonedDateTime zdt = ZonedDateTime.of( ld , lt , z ) ;

時刻を1日の最初の瞬間にしたい場合は、Java.timeでその瞬間を決定します。日が00:00:00から始まると想定しないでください。夏時間(DST)などの異常は、その日が01:00:00などの別の時間に始まることを意味します。

ZonedDateTime zdt = ld.atStartOfDay( z ) ;

Java.sql.Timestampは間違ったクラスです

Java.sql.Timestamp は、面倒な古いdate-timeクラスの一部であり、現在はレガシーであり、Java.timeクラスによって完全に置き換えられています。このクラスは、 ナノ秒 の解像度で UTC の瞬間を表すために使用されました。その目的は、現在 Java.time.Instant で提供されています。

JDBC 4.2 with getObjectsetObject

JDBC 4.2 以降では、 JDBCドライバー は以下を呼び出してデータベースとJava.timeオブジェクトを直接交換できます。

例えば:

myPreparedStatement.setObject( … , instant ) ;

…および…

Instant instant = myResultSet.getObject( … , Instant.class ) ;

レガシー⬌モダンを変換

まだ_/Java.timeに​​更新されていない古いコードとインターフェイスする必要がある場合は、古いクラスに追加された新しいメソッドを使用して前後に変換します。

Instant instant = myJavaSqlTimestamp.toInstant() ;  // Going from legacy class to modern class.

…そして…

Java.sql.Timestamp myJavaSqlTimestamp = Java.sql.Timestamp.from( instant ) ;  // Going from modern class to legacy class.

Java.timeに​​ついて

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

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

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

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

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

  • Java SE 8Java SE 9 以降、
    • ビルトイン。
    • 実装がバンドルされた標準Java APIの一部。
    • Java 9は、いくつかのマイナーな機能と修正を追加します。
  • Java SE 6 および Java SE 7
    • Java.time機能の多くは、 ThreeTen-Backport でJava 6および7にバックポートされています。
  • Android

ThreeTen-Extra プロジェクトは、クラスを追加してJava.timeを拡張します。このプロジェクトは、Java.timeに将来追加される可能性のある証明の場です。 IntervalYearWeekYearQuarter 、および more

8
Basil Bourque

タイムゾーンによっては、数分遅れる場合があります(1650-01-01 00:00:00は1649-12-31 23:52:58になります)

それを避けるには、次のコードを使用します

new Timestamp(localDateTime.getYear() - 1900, localDateTime.getMonthOfYear() - 1, localDateTime.getDayOfMonth(), localDateTime.getHourOfDay(), localDateTime.getMinuteOfHour(), localDateTime.getSecondOfMinute(), fractional);
5
user1302021

Jodaは色あせているので、誰かがJava 8.でLocaltDateLocalDateTimeに変換したいと思うかもしれません。Java 8 LocalDateTimeでは、LocalDateTimeLocalDateを使用してLocalTimeインスタンスを作成できます。チェック ここ

public LocalLocalTime of(LocalDate date、LocalTime time)

サンプルは、

    // just to create a sample LocalDate
    DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyyMMdd");
    LocalDate ld = LocalDate.parse("20180306", dtf);

    // convert ld into a LocalDateTime
    // We need to specify the LocalTime component here as well, it can be any accepted value
    LocalDateTime ldt = LocalDateTime.of(ld, LocalTime.of(0,0)); // 2018-03-06T00:00

参考までに、以下のエポック秒を取得するには、

    ZoneId zoneId = ZoneId.systemDefault();
    long Epoch = ldt.atZone(zoneId).toEpochSecond(); 

    // If you only care about UTC
    long epochUTC = ldt.toEpochSecond(ZoneOffset.UTC);
2
prime

Java8 +

import Java.time.Instant;
Instant.now().getEpochSecond(); //timestamp in seconds format (int)
Instant.now().toEpochMilli(); // timestamp in milliseconds format (long)
0
Mohamed.Abdo

Java.time.LocalDateオブジェクトのasStartOfDay()関数呼び出しはJava.time.LocalDateTimeオブジェクトを返します

0
Ahmad sibai