JodaTime 1.6.2を使用しています。
私はLocalDate
を持っているので、それを(Joda)LocalDateTime
またはormapping用のJava.sqlTimestamp
に変換する必要があります。
その理由は、LocalDateTime
とJava.sql.Timestamp
の間の変換方法を見つけたからです。
LocalDateTime ldt = new LocalDateTime();
DateTimeFormatter dtf = DateTimeFormatter.forPattern("yyyy-MM-dd HH:mm:ss");
Timestamp ts = Timestamp.valueOf(ldt.toString(dtf));
したがって、LocalDate
とLocalDateTime
の間で変換できる場合は、Java.sql.Timestamp
への継続的な変換を行うことができます。正しい方向へのナッジをありがとう!
JodaTimeの org.joda.time.LocalDate
を Java.sql.Timestamp
に変換するには、単に
Timestamp timestamp = new Timestamp(localDate.toDateTimeAtStartOfDay().getMillis());
JodaTimeの org.joda.time.LocalDateTime
を Java.sql.Timestamp
に変換するには、単に
Timestamp timestamp = new Timestamp(localDateTime.toDateTime().getMillis());
Java8の Java.time.LocalDate
を Java.sql.Timestamp
に変換するには、単に
Timestamp timestamp = Timestamp.valueOf(localDate.atStartOfDay());
Java8の Java.time.LocalDateTime
を Java.sql.Timestamp
に変換するには、単に
Timestamp timestamp = Timestamp.valueOf(localDateTime);
最良の方法は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を理解します!
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.timeとJoda-Timeの両方で、 LocalDateTime
には意図的にタイムゾーンまたはUTCからのオフセットの概念がありません。そのため、それはではなく瞬間を表し、ではなくタイムライン上のポイントです。 LocalDateTime
は、約26〜27時間の範囲にある潜在的なモーメントに関する大まかなアイデアを表します。
LocalDateTime
は、ゾーン/オフセットが不明な場合(良い状況ではない場合)、またはゾーンオフセットが不確定な場合に使用します。たとえば、「クリスマスは2018年12月25の最初の瞬間に開始します」はLocalDateTime
として表されます。
特定のタイムゾーンでの瞬間を表すには、ZonedDateTime
を使用します。たとえば、Pacific/Auckland
やAmerica/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
で提供されています。
getObject
setObject
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 8以降に組み込まれています。これらのクラスは、 Java.util.Date
、 Calendar
、& SimpleDateFormat
などの厄介な古い legacy date-timeクラスに取って代わります。
メンテナンスモード になった 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に将来追加される可能性のある証明の場です。 Interval
、 YearWeek
、 YearQuarter
、および more 。
タイムゾーンによっては、数分遅れる場合があります(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);
Jodaは色あせているので、誰かがJava 8.でLocaltDate
をLocalDateTime
に変換したいと思うかもしれません。Java 8 LocalDateTime
では、LocalDateTime
とLocalDate
を使用して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);
Java8 +
import Java.time.Instant;
Instant.now().getEpochSecond(); //timestamp in seconds format (int)
Instant.now().toEpochMilli(); // timestamp in milliseconds format (long)
Java.time.LocalDate
オブジェクトのasStartOfDay()
関数呼び出しはJava.time.LocalDateTime
オブジェクトを返します