2012-02-05 17 views
40

Quiero crear un intervalo entre el comienzo de la semana y el final de la semana actual.Jodatime inicio del día y fin del día

Tengo el siguiente código, tomado de 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); 
} 

pero ahora quiero el Lunes LocalDateTime sea a las 00:00:00 y el Domingo LocalDateTime a las 23:59:59. ¿Cómo haría esto?

Respuesta

20

¿Qué tal:

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' por convención tiene ningún tipo de retorno en Java, por lo que no permitiría el encadenamiento. Esto aquí recuerda el patrón del generador (que originalmente no funcionaría en un objeto existente). –

+1

De hecho. Esto le permite enrutar las llamadas juntas, en lugar de tenerlas todas en diferentes líneas, y le brinda todos los beneficios de los objetos inmutables. –

+0

Creo que el "patrón" se llama "interfaz fluida" http://martinfowler.com/bliki/FluentInterface.html - da muchos beneficios en legibilidad y claridad en mi opinión. –

127

Se puede utilizar el método de withTime:

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

Igual que la respuesta de Pedro, pero más corto.

+39

El comienzo del día también se puede obtener con _d.withTimeAtStartOfDay() _ – Touko

+12

'withTimeAtStartOfDay()' no está disponible para 'LocalDateTime', pero está disponible para [' DateTime'] (http: //joda-time.sourceforge .net/apidocs/org/joda/time/DateTime.html # withTimeAtStartOfDay()) – Abdull

+0

+1. Una nota: 'LocalDateTime es inmutable, por lo que no hay métodos establecidos. En cambio, este método devuelve una nueva instancia con el valor de millis of day changed. Entonces, debe asignar el resultado a alguna variable. – informatik01

65

también una manera sencilla es

d.millisOfDay().withMaximumValue();

+10

Esta debería ser la respuesta aceptada, en comparación con las otras respuestas es la mejor en términos de rendimiento (menos objetos creados cuando DateTime es inmutable). El método con la documentación de MaxximValue incluso dice que es la mejor manera de lograr lo que la pregunta está haciendo – le0diaz

+0

¿Cuál es la diferencia con 'getMaximumValueOverall'? –