これが現在の時刻を取得する方法であると仮定すると Joda time :
DateTime now = new DateTime();
変数dateTimeAtStartOfToday
とdateTimeAtEndOfToday
の値をどのように計算しますか?
私がやろうとしていることは、startOfToday
とendOfToday
の間で発生したすべてのトランザクションのルックアップを実行するSQLを生成することです。
私は使うだろう:
LocalDate today = now.toLocalDate();
LocalDate tomorrow = today.plusDays(1);
DateTime startOfToday = today.toDateTimeAtStartOfDay(now.getZone());
DateTime startOfTomorrow = tomorrow.toDateTimeAtStartOfDay(now.getZone());
次に、startOfToday <= time < startOfTomorrow
特定の時間。
もちろん、それはデータベースに何が格納されているか、そしてどのタイムゾーンに関心があるかによって部分的に異なります。
これはより適切に機能します。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は非常によく考えられているようです。
if((sinceDate.getDayOfYear() == now.getDayOfYear()) && (sinceDate.year() == now.year()))
//yep, do something today;
私のために働きます。
import org.joda.time.DateTime;
import org.joda.time.DateTimeMidnight;
DateTime dateTimeAtStartOfToday = new DateTime(new DateTimeMidnight());
DateTime dateTimeAtEndOfToday = new DateTime((new DateTimeMidnight()).plusDays(1));
Kotlin拡張関数としては、次のようになります。
fun DateTime.isOnSameDay(timeOnDayToCheck: DateTime) =
timeOnDayToCheck.toLocalDate().toInterval(this.zone).contains(this)
これには、その日のend(開始が含まれる)に等しい時間が含まれていないため、interval.getEnd().isEqual(this))
を使用して「または」ケースを追加することができます。
これは機能します...
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を使用する傾向があります。