2011-06-29 12 views

Odpowiedz

32

użyłbym:

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

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

startOfToday <= time < startOfTomorrow Następnie sprawdzić, czy dla danego czasu.

oczywiście, częściowo zależy od dokładnie, co przechowywane w bazie danych. - i co strefa czasowa jesteś zainteresowany

+0

Myślę, że masz tam literówkę. Używasz 'today' dwa razy, aby przeczytać początek dnia ... – nfechner

+0

@nfechner: Naprawiono, dziękuję. –

+0

Zwróć uwagę na użycie "<=" kontra "<" w powyższym kodzie w tej odpowiedzi. Jest to tak zwane podejście "Half-Open", w którym początkiem jest * włącznie *, a zakończenie * wyłącznym *. Takie podejście jest mądrym sposobem na zdefiniowanie czasu. Również klasa "' Interval' "(http://www.joda.org/joda-time/apidocs/org/joda/time/Interval.html) w Joda-Time może być używana do śledzenia pary obiektów DateTime zdefiniowane w tym kodzie odpowiedzi. Klasa Interval używa podejścia Half-Open podczas dokonywania porównań ('zawiera',' overlap', 'gap', &' abuts'). –

0
import org.joda.time.DateTime; 
import org.joda.time.DateTimeMidnight; 

DateTime dateTimeAtStartOfToday = new DateTime(new DateTimeMidnight()); 
DateTime dateTimeAtEndOfToday = new DateTime((new DateTimeMidnight()).plusDays(1)); 
+3

Sugerowałbym * nie * użycie 'DateTimeMidnight' ponieważ tam * nie jest * zawsze północ, z powodu zmian czasu letniego. –

+0

@JonSkeet Nigdy nie widziałem, żeby nie było północy. Nie zawsze jest to 2:00 - 3:00, ale zawsze jest północ. A może to tylko amerykańska rzecz? –

+2

@ Bob: To tylko amerykańska rzecz. Zmiana czasu letniego może nastąpić w dowolnym momencie, zgodnie z lokalnymi przepisami. Dowiedziałem się na własnej skórze. –

0

To działa ...

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

... ale o ile jak SQL, staram się używać MIĘDZY jak klauzula WHERE, zamiast zrobić to> i < = rzeczy

+0

Spowoduje to zgłoszenie wyjątku, jeśli jedna z dwóch dat nie zawiera północy z powodu zmian czasu letniego. toDateTimeAtStartOfDay jest lepszym IMO. –

+0

Wiesz, nie mogę odtworzyć wyjątku, o którym mówisz. W tym przypadku praca z DateMidnight jest lepsza niż wszystkie powyższe, ponieważ ma metodę toInterval(), która z łatwością uwzględnia przejścia DST. Dodaję to rozwiązanie jako osobną odpowiedź. –

+1

Znajdź strefę czasową, która przeskoczy do przodu o północy. IIRC, gdzieś w Ameryce Południowej to robi - jak się dowiedziałem na własnej skórze ... –

3

to działa lepiej, okazuje się DateTime ma metodę zwaną toInterval który robi dokładnie to rzecz (dane z północy do północy). W moich testach wydaje się, że nie ma problemu z przejściami 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 wygląda na bardzo dobrze przemyślaną.

+5

DateMidnight był [przestarzały] (http: //www.joda.org/joda-time/apidocs/org/joda/time/DateMidnight.html) ze względu na problemy z północy. Sugerujemy użycie metody [withTimeAtStartOfDay] (http://www.joda.org/joda-time/apidocs/org/joda/time/DateTime.html#withTimeAtStartOfDay()) –

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

działa dla mnie.

Powiązane problemy