假設這是你如何得到Joda time當前時間:如何使用Java中的Joda日期/時間庫獲取「今日」的日期/時間範圍?
DateTime now = new DateTime();
如何計算值的變量dateTimeAtStartOfToday
和dateTimeAtEndOfToday
?
我想要做的是生成一些SQL來查找在startOfToday
和endOfToday
之間發生的所有事務。
假設這是你如何得到Joda time當前時間:如何使用Java中的Joda日期/時間庫獲取「今日」的日期/時間範圍?
DateTime now = new DateTime();
如何計算值的變量dateTimeAtStartOfToday
和dateTimeAtEndOfToday
?
我想要做的是生成一些SQL來查找在startOfToday
和endOfToday
之間發生的所有事務。
我會用:
LocalDate today = now.toLocalDate();
LocalDate tomorrow = today.plusDays(1);
DateTime startOfToday = today.toDateTimeAtStartOfDay(now.getZone());
DateTime startOfTomorrow = tomorrow.toDateTimeAtStartOfDay(now.getZone());
如果startOfToday <= time < startOfTomorrow
然後檢查任何特定時間。
當然,它部分取決於究竟什麼是存儲在數據庫中 - 和什麼時候帶你感興趣的
import org.joda.time.DateTime;
import org.joda.time.DateTimeMidnight;
DateTime dateTimeAtStartOfToday = new DateTime(new DateTimeMidnight());
DateTime dateTimeAtEndOfToday = new DateTime((new DateTimeMidnight()).plusDays(1));
我會建議*不*使用'DateTimeMidnight'因爲*不是*總是午夜,因爲DST的變化。 –
@JonSkeet我從來沒有見過那裏沒有午夜。並不總是凌晨2點到3點,但總是有午夜。或者那只是美國的事情? –
@Bob:那只是美國的事情。根據當地規則,夏時制可能會隨時發生變化。我發現困難的方式。 –
這工作...
DateTime dt = new DateTime();
DateMidnight dtStartDate = dt.toDateMidnight();
DateMidnight dtEndDate = dt.plusDays(1).toDateMidnight();
System.out.println(dt + "\n" + dtStartDate + "\n" + dtEndDate);
...但據作爲SQL,我傾向於使用BETWEEN作爲where子句而不是> < = stuff
如果由於DST更改導致兩個日期中的某一個不包含午夜,則會引發異常。 toDateTimeAtStartOfDay是更好的IMO。 –
你知道,我無法重現你說的例外。在這個過程中,使用DateMidnight比上述所有方法都要好,因爲它有一個toInterval()方法,可以輕鬆地解釋DST轉換。我將這個解決方案作爲一個單獨的答案加入。 –
找到一個在午夜前跳過的時區。 IIRC,在南美洲的某個地方這樣做 - 因爲我已經發現了困難的方式... –
這樣做效果更好,事實證明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看起來很好的想法。
DateMidnight was [deprecated](http://www.joda。org/joda-time/apidocs/org/joda/time/DateMidnight.html)由於午夜問題。建議使用[withTimeAtStartOfDay](http://www.joda.org/joda-time/apidocs/org/joda/time/DateTime.html#withTimeAtStartOfDay())方法 –
if((sinceDate.getDayOfYear() == now.getDayOfYear()) && (sinceDate.year() == now.year()))
//yep, do something today;
適合我。
我想,你在那裏有一個錯字。你使用'今天'兩次來讀取一天的開始...... – nfechner
@nfechner:修正,謝謝。 –
注意本答案中上面代碼中「<=」與「<」的用法。這就是所謂的「半開放」方法,其中開始*包含*而結尾* *排除*。這種方法是定義一段時間的明智之舉。此外,Joda-Time中的['Interval'](http://www.joda.org/joda-time/apidocs/org/joda/time/Interval.html)類可用於跟蹤一對DateTime對象在本答案的代碼中定義。 Interval類在進行比較時使用Half-Open方法('contains','overlap','gap',&'abuts')。 –