2010-11-09 19 views
38

Nunca antes he usado JodaTime, pero al responder a esta pregunta, How to get ordinal Weekdays in a Month.JodaTime equivalente a DateUtils.truncate()

Lo he probado y se acercó con este código feo para desarmar todos los campos siguientes días:

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

Cuando el Commons/Lang equivalente utilizando DateUtils habría

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

¿Cuál es el idioma preferido para hacer eso en JodaTime?

Respuesta

39

Puede utilizar roundFloorCopy() para imitar 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

De lejos, el mejor en mi opinión. Necesitaba que la fecha fuera "redondeada" por algo seleccionado por el usuario. Usando [code] input.property (). RoundFloorCopy() [/ code] guardó una gran cantidad de códigos personalizados. – DeezCashews

17

Eche un vistazo a DateMidnight.

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

Actualización: 16/08/2013 por jodastephen: Versión 2.3 de Joda-Time deprecates DateMidnight ya que era una muy mala idea de una clase.

a fin de utilizar:

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

así que supongo que te refieres a esto: 'new DateMidnight (new DateTime())' –

+1

@Erick cierto, pero en mi humilde opinión no es motivo para un voto a favor. Esta sigue siendo una buena respuesta –

+2

No entiendo por qué esta es una mejor respuesta que usar 'withMillisOfDay (0)'. Un objeto 'DateMidnight' no es un objeto' DateTime', por lo que un objeto adicional debe crearse de esta forma. –

38

utilizar el método de withMillisOfDay() para acortar la sintaxis.

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

La respuesta de Bozho es probablemente la solución "oficial", pero me gusta más esta. Gracias. –

+0

¿Por qué piensas eso? No lo entiendo También me gusta más, porque requiere el mínimo número de objetos para crear. –

+0

¿Por qué iba a pensar eso? Porque existe una clase dedicada para este tipo exacto de problema. –

1

Joda Time también es compatible con el método withFields en el tipo DateTime. Esto también puede ser usado para crear una sintaxis corta:

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

En el código de producción del argumento a withFields debe tenerse en cuenta a una constante.