2010-11-09 11 views
38

Ich habe nie zuvor JodaTime verwendet, aber diese Frage beantwortet, How to get ordinal Weekdays in a Month.JodaTime Entsprechung von DateUtils.truncate()

versuchte ich es und kam mit diesem hässlichen Code, um alle Felder Tag unset:

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

Wo die Commons/Lang äquivalent DateUtils mit

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

wäre Was das bevorzugte Idiom ist, das zu tun in JodaTime?

Antwort

39

können Sie verwenden roundFloorCopy() 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

Mit Abstand das beste meiner Meinung nach. Ich brauchte das Datum, um von etwas, das vom Benutzer ausgewählt wurde, "abgerundet" zu werden. Verwenden von [code] input.property (). RoundFloorCopy() [/ code] speicherte viel benutzerdefiniertes Coding. – DeezCashews

17

Werfen Sie einen Blick auf DateMidnight.

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

Update: 2013.08.16 von JodaStephen: Version 2.3 von Joda-Time deprecates DateMidnight, da es eine sehr schlechte Idee einer Klasse war.

So verwenden:

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

also denke ich, du meinst das: 'neue DateMidnight (neue DateTime())' –

+1

@Erick wahr, aber IMHO kein Grund für einen Downvote. Das ist immer noch eine gute Antwort –

+2

Ich verstehe nicht, warum dies eine bessere Antwort ist als die Verwendung von 'withMillisOfDay (0)'. Ein DateMidnight-Objekt ist kein DateTime-Objekt, daher muss ein zusätzliches Objekt auf diese Weise erstellt werden. –

38

die withMillisOfDay() Methode Verwenden Sie die Syntax zu verkürzen.

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

Bozhos Antwort ist wahrscheinlich die "offizielle" Lösung, aber mir gefällt diese besser. Vielen Dank. –

+0

Warum würden Sie das denken? Ich verstehe es nicht. Ich mag das auch besser, weil es die minimale Anzahl von zu erstellenden Objekten erfordert. –

+0

Warum sollte ich das denken? Weil eine dedizierte Klasse für genau diese Art von Problem existiert. –

1

Joda Zeit unterstützt auch die withFields Methode in der Art DateTime zu imitieren. Dies kann auch eine kurze Syntax erstellen verwendet werden:

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

In Produktionscode das Argument withFields auf eine Konstante ausgeklammert werden soll.

Verwandte Themen