web-dev-qa-db-ja.com

JavaのJoda日付/時刻ライブラリを使用して、「今日」の日付/時刻範囲を取得するにはどうすればよいですか。

これが現在の時刻を取得する方法であると仮定すると Joda time

DateTime now = new DateTime();

変数dateTimeAtStartOfTodaydateTimeAtEndOfTodayの値をどのように計算しますか?

私がやろうとしていることは、startOfTodayendOfTodayの間で発生したすべてのトランザクションのルックアップを実行するSQLを生成することです。

22
Morris

私は使うだろう:

LocalDate today = now.toLocalDate();
LocalDate tomorrow = today.plusDays(1);

DateTime startOfToday = today.toDateTimeAtStartOfDay(now.getZone());
DateTime startOfTomorrow = tomorrow.toDateTimeAtStartOfDay(now.getZone());

次に、startOfToday <= time < startOfTomorrow特定の時間。

もちろん、それはデータベースに何が格納されているか、そしてどのタイムゾーンに関心があるかによって部分的に異なります。

37
Jon Skeet

これはより適切に機能します。DateTimeにはtoIntervalというメソッドがあり、これを正確に実行します(真夜中から真夜中までを計算します)。私のテストでは、DSTの移行に問題がないようです。

DateTime now = new DateTime();
DateTime startOfToday = now.toDateMidnight().toInterval().getStart();
DateTime endOfToday = now.toDateMidnight().toInterval().getEnd();
System.out.println( "\n" + now + "\n" + startOfToday + "\n" + endOfToday + "\n" );

JODAは非常によく考えられているようです。

5
Bob Kuhar
if((sinceDate.getDayOfYear() == now.getDayOfYear())  && (sinceDate.year() == now.year()))
   //yep, do something today;

私のために働きます。

1
Prakash Nadar
import org.joda.time.DateTime;
import org.joda.time.DateTimeMidnight;

DateTime dateTimeAtStartOfToday = new DateTime(new DateTimeMidnight());  
DateTime dateTimeAtEndOfToday = new DateTime((new DateTimeMidnight()).plusDays(1));
0
Eric Normand

Kotlin拡張関数としては、次のようになります。

fun DateTime.isOnSameDay(timeOnDayToCheck: DateTime) =
  timeOnDayToCheck.toLocalDate().toInterval(this.zone).contains(this)

これには、その日のend(開始が含まれる)に等しい時間が含まれていないため、interval.getEnd().isEqual(this))を使用して「または」ケースを追加することができます。

0
hardysim

これは機能します...

DateTime dt = new DateTime();
DateMidnight dtStartDate = dt.toDateMidnight();
DateMidnight dtEndDate = dt.plusDays( 1 ).toDateMidnight();
System.out.println( dt + "\n" + dtStartDate + "\n" + dtEndDate );

...しかし、SQLに関しては、>や<=を実行するのではなく、where句としてBETWEENを使用する傾向があります。

0
Bob Kuhar