2010-11-09 20 views
38

Non ho mai utilizzato JodaTime prima, ma rispondendo a questa domanda, How to get ordinal Weekdays in a Month.Equivalente JodaTime di DateUtils.truncate()

ho provato e si avvicinò con questo codice brutto per disinserire tutti i campi sottostanti giorno:

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

Qualora il Commons/Lang equivalente utilizzando DateUtils sarebbe

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

Qual è il linguaggio preferito per farlo in JodaTime?

risposta

39

È possibile utilizzare roundFloorCopy() di imitare 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

Di gran lunga il migliore secondo me. Avevo bisogno che la data venisse "arrotondata" da qualcosa selezionato dall'utente. Utilizzando [code] input.property (). RoundFloorCopy() [/ code] ha salvato un sacco di codice personalizzato. – DeezCashews

17

Dai uno sguardo allo DateMidnight.

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

Aggiornamento: 2013/08/16 da JodaStephen: la versione 2.3 di Joda Time disapprova DateMidnight come è stata una pessima idea di una classe.

in modo da utilizzare:

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

quindi suppongo che intendi questo: 'nuovo DateMidnight (new DateTime())' –

+1

@Erick true, ma IMHO non è un motivo per un downvote. Questa è ancora una buona risposta –

+2

Non capisco perché questa sia una risposta migliore dell'uso di 'withMillisOfDay (0)'. Un oggetto 'DateMidnight' non è un oggetto' DateTime', quindi un oggetto extra deve essere creato in questo modo. –

38

utilizzare il metodo withMillisOfDay() per accorciare la sintassi.

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

La risposta di Bozho è probabilmente la soluzione "ufficiale", ma mi piace di più questa. Grazie. –

+0

Perché lo pensi? Non capisco Mi piace anche questo, perché richiede il numero minimo di oggetti da creare. –

+0

Perché dovrei pensarlo? Perché esiste una classe dedicata per questo esatto tipo di problema. –

1

Joda Ora supporta anche il metodo withFields nel tipo DateTime. Questo può anche essere usato per creare un breve sintassi:

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

Nel codice di produzione l'argomento withFields dovrebbe essere fattorizzato ad una costante.

Problemi correlati