2012-02-05 6 views
40

Chcę utworzyć interwał między początkiem tygodnia a końcem bieżącego tygodnia.Jodobime początek dnia i koniec dnia

Mam następujący kod, pożyczone od this answer:

private LocalDateTime calcNextSunday(LocalDateTime d) { 
    if (d.getDayOfWeek() > DateTimeConstants.SUNDAY) { 
     d = d.plusWeeks(1); 
    } 
    return d.withDayOfWeek(DateTimeConstants.SUNDAY); 
} 

private LocalDateTime calcPreviousMonday(LocalDateTime d) { 
    if (d.getDayOfWeek() < DateTimeConstants.MONDAY) { 
     d = d.minusWeeks(1); 
    } 
    return d.withDayOfWeek(DateTimeConstants.MONDAY); 
} 

Ale teraz chcę Poniedziałek LocalDateTime być na 00:00:00 i niedziela LocalDateTime godzinie 23:59:59. Jak to zrobić?

Odpowiedz

20

Jak o:

private LocalDateTime calcNextSunday(LocalDateTime d) { 
    return d.withHourOfDay(23).withMinuteOfHour(59).withSecondOfMinute(59).withDayOfWeek(DateTimeConstants.SUNDAY); 
} 

private LocalDateTime calcPreviousMonday(final LocalDateTime d) { 
    return d.withHourOfDay(0).withMinuteOfHour(0).withSecondOfMinute(0).withDayOfWeek(DateTimeConstants.MONDAY); 
} 
+4

'setXxx' umownie ma typ zwracany w Javie, więc nie pozwoliłby łańcuchowym. To tutaj przypomina wzór konstruktora (który pierwotnie nie działałby na istniejącym obiekcie). –

+1

Rzeczywiście. Dzięki temu możesz połączyć wszystkie połączenia, zamiast mieć je wszystkie w różnych liniach i uzyskać wszystkie korzyści z niezmiennych obiektów. –

+0

Myślę, że "wzór" nazywa się "Fluent interface" http://martinfowler.com/bliki/FluentInterface.html - daje wiele korzyści w czytelności i jasności w mojej opinii. –

127

Można użyć metody withTime:

d.withTime(0, 0, 0, 0); 
d.withTime(23, 59, 59, 999); 

samo jak odpowiedź Piotra, ale krótszy.

+39

Początek dnia można również uzyskać za pomocą _d.withTimeAtStartOfDay() _ – Touko

+12

'withTimeAtStartOfDay()' nie jest dostępne dla 'LocalDateTime', ale jest dostępne dla [' DateTime'] (http: //joda-time.sourceforge .net/apidocs/org/joda/time/DateTime.html # withTimeAtStartOfDay()) – Abdull

+0

+1. Jedna uwaga: 'LocalDateTime jest niezmienny, więc nie ma ustalonych metod. Zamiast tego, ta metoda zwraca nową instancję z wartością millis dnia zmienionego. "Więc musisz przypisać wynik do pewnej zmiennej. – informatik01

65

również prostym sposobem jest

d.millisOfDay().withMaximumValue();

+10

Powinna to być akceptowana odpowiedź, w porównaniu z innymi odpowiedziami jest najlepsza pod względem wydajności (mniej obiektów utworzonych jako DateTime jest niewyprawialnych). Metoda zMaximunValue Documentation mówi nawet, że jest najlepszym sposobem na to, o co pyta. – le0diaz

+0

Jaka jest różnica z 'getMaximumValueOverall'? –