2010-11-09 12 views
38

Nigdy wcześniej nie używałam JodaTime, ale odpowiadam na to pytanie, How to get ordinal Weekdays in a Month.Odpowiednik JodaTime dla DateUtils.truncate()

Próbowałem go i wyszedł z tego brzydkiego kodu Usuń wszystkie pola poniżej dzień:

DateTime startOfMonth = 
    input.withDayOfMonth(1) 
     .withHourOfDay(0)  // there 
     .withMinuteOfHour(0) // has got to 
     .withSecondOfMinute(0) // be a shorter way 
     .withMillisOfSecond(0); // to do this 

Jeżeli Commons/Lang równoważne użyciu DateUtils byłoby

Date startOfMonth = DateUtils.truncate(input, Calendar.MONTH); 

Jaka jest preferowana idiom to zrobić w JodaTime?

Odpowiedz

39

Można użyć roundFloorCopy() naśladować DateUtils.truncate

Date truncateMonth = DateUtils.truncate(input, Calendar.MONTH); 
-> DateTime truncateMonth = input.dayOfMonth().roundFloorCopy(); 

Date truncateMinute = DateUtils.truncate(input, Calendar.MINUTE); 
-> DateTime truncateMinute = input.minuteOfDay().roundFloorCopy(); 

Date truncateHourOfDay = DateUtils.truncate(input, Calendar.HOUR_OF_DAY); 
-> DateTime truncateHourOfDay = input.hourOfDay().roundFloorCopy() 
+1

Zdecydowanie najlepsze w moim odczuciu. Potrzebowałem daty "zaokrąglonej" przez coś wybranego przez użytkownika. Używając [code] input.property (). RoundFloorCopy() [/ code] zapisał dużo niestandardowego kodowania. – DeezCashews

17

Spójrz na DateMidnight.

DateTime startOfMonth = new DateTime(new DateMidnight(input.withDayOfMonth(1))); 

Aktualizacja: 16.08.2013 przez JodaStephen: Wersja 2.3 Joda-Time deprecates DateMidnight jak to był bardzo zły pomysł klasy.

więc używać:

DateTime startOfMonth = input.withDayOfMonth(1).withTimeAtStartOfDay(); 
+0

więc domyślam się, że masz na myśli to: 'new DateMidnight (new DateTime())' –

+1

@Erick true, ale IMHO nie jest powodem do odrzucenia. To nadal dobra odpowiedź. –

+2

Nie rozumiem, dlaczego jest to lepsza odpowiedź niż przy użyciu 'withMillisOfDay (0)'. Obiekt 'DateMidnight' nie jest obiektem' DateTime', więc dodatkowy obiekt musi zostać utworzony w ten sposób. –

38

Użyj metody withMillisOfDay() skrócić składnię.

 
DateTime startOfMonth = input.withDayOfMonth(1).withMillisOfDay(0); 
+0

Odpowiedź Bozho jest prawdopodobnie "oficjalnym" rozwiązaniem, ale lubię to lepiej. Dzięki. –

+0

Dlaczego tak uważasz? Nie rozumiem tego. Ten też lubię, bo wymaga minimalnej liczby obiektów do stworzenia. –

+0

Dlaczego miałbym tak myśleć? Ponieważ istnieje dedykowana klasa dla tego rodzaju problemu. –

1

Joda czas wspiera również metody w rodzaju DateTimewithFields. Może to być również wykorzystywane do tworzenia krótkich składnię:

new DateTime().withDayOfMonth(1).withFields(new LocalTime(0, 0)); 

W kodzie produkcyjnym argument do withFields należy uwzględnić się stała.