他の回答、特にarganzhengによるjava.timeの回答は正解です。一部の人が述べたように、古いjava.util.Date/.Calendarクラスは設計が不十分で、混乱し、面倒なので、避ける必要があります。それらは、java.timeクラスに取って代わられました。
真夜中と時間帯の取り扱いに関する戦略についてのメモを追加しましょう。
半開き
日時作業では、多くの場合、期間は「ハーフオープン」アプローチを使用して定義されます。このアプローチでは、開始は包括的であり、終了は排他的です。これにより問題が解決され、一貫して使用すると、日時の処理に関する推論がはるかに容易になります。
解決される1つの問題は、一日の終わりを定義することです。その日の最後の瞬間23:59:59.999
(ミリ秒)ですか?おそらく、java.util.Dateクラス(最も初期のJavaから、問題が多い-このクラスを避けてください!)と、非常に成功したJoda-Timeライブラリで。しかし、Postgresなどのデータベースなどの他のソフトウェアでは、最後の瞬間は23:59:59.999999
(マイクロ秒)になります。しかし、java.timeフレームワーク(Java 8以降に組み込まれ、Joda -Timeの後継)などの他のソフトウェアや、H2データベースなどの一部のデータベースでは、最後の瞬間が23:59.59.999999999
(ナノ秒)になる場合があります。髪を分割するのではなく、最初の瞬間だけを考え、最後の瞬間は考えないでください。
ハーフオープンでは、1日は1日の最初の瞬間から始まり、次の日の最初の瞬間まで含まれません。したがって、このように考えるのではなく、
…今日から午前00:00(今朝の真夜中)から午後12:00(今夜の真夜中)まで。
…こう考えて…
今日の最初の瞬間から実行されますが、明日の最初の瞬間は含まれません:
(> = 00:00:00.0
今日AND < 00:00:00.0
明日)
データベースの作業では、このアプローチはSQLで演算子を使用しないことを意味します。BETWEEN
一日の始まり
さらに、その日の最初の瞬間が常に時刻であるとは限りません00:00:00.0
。一部のタイムゾーンの夏時間(DST)、および場合によっては他の異常により、別の時間が1日の始まりになることがあります。
したがって、java.timeクラスが、への呼び出しで1日の始まりを決定する作業を行うようにしLocalDate::atStartOfDay( ZoneId )
ます。したがって、このサンプルコードでわかるように、迂回しLocalDate
て戻るZonedDateTime
必要があります。
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime now = ZonedDateTime.now( zoneId );
ZonedDateTime todayStart = now.toLocalDate().atStartOfDay( zoneId );
ZonedDateTime tomorrowStart = todayStart.plusDays( 1 );
オプションのの渡しに注意してくださいZoneId
。省略すると、JVMの現在のデフォルトのタイムゾーンが暗黙的に適用されます。明確にするのが良いでしょう。
タイムゾーンは日付時刻の作業に不可欠です。質問と他のいくつかの回答は、意識的にタイムゾーンを処理しないため、潜在的に欠陥があります。
変換
あなたがいる場合必要があります java.util.Dateまたは.Calendarを使用し、それらの古いクラスに追加された新しい変換方法を探してください。
java.util.Date utilDate = java.util.Date.from( todayStart.toInstant() );
java.util.GregorianCalendar gregCal = java.util.GregorianCalendar.from( todayStart );
一定の期間
ちなみに、時間をかけて多くの作業を行っている場合は、以下をご覧ください。
Duration
Period
Interval
このInterval
クラスは、java.timeフレームワークの拡張であるThreeTen-Extraプロジェクトにあります。このプロジェクトは、java.timeに将来追加される可能性があることの証明の場です。
Interval todayMontreal = Interval.of( todayStart.toInstant() , tomorrowStart.toInstant() );
java.timeについて
java.timeのフレームワークは、Java 8に組み込まれており、後にされています。これらのクラスは面倒古い取って代わるレガシーのような日付時刻クラスをjava.util.Date
、Calendar
、& SimpleDateFormat
。
ジョダタイムプロジェクトは、今でメンテナンスモードへの移行をアドバイスjava.timeのクラス。
詳細については、Oracleチュートリアルを参照してください。また、スタックオーバーフローで多くの例と説明を検索してください。仕様はJSR 310です。
java.timeオブジェクトをデータベースと直接交換することができます。JDBC 4.2以降に準拠したJDBCドライバーを使用します。文字列もクラスも必要ありません。java.sql.*
java.timeクラスはどこで入手できますか?
ThreeTen-エクストラプロジェクトでは、追加のクラスでjava.timeを拡張します。このプロジェクトは、java.timeに将来追加される可能性があることを証明する場です。あなたはここにいくつかの有用なクラスのような見つけることがInterval
、YearWeek
、YearQuarter
、および多くを。