2012-02-05 21 views
40

Desidero creare un intervallo tra l'inizio della settimana e la fine della settimana corrente.Inizio giorno Jodatime e fine giornata

Ho il codice seguente, preso in prestito da 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); 
} 

Ma ora voglio il Lunedi LocalDateTime di essere alle 00:00:00, e la Domenica LocalDateTime alle 23:59:59. Come lo farei?

risposta

20

ne dite:

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' per convenzione ha alcun tipo di ritorno in Java quindi non consentirebbe concatenamento. Questo qui ricorda il modello di builder (che originariamente non avrebbe funzionato su un oggetto esistente). –

+1

Infatti. Questo ti consente di mettere insieme le chiamate, anziché averle tutte su linee diverse, e ti offre tutti i vantaggi degli oggetti immutabili. –

+0

Penso che il "pattern" sia chiamato "Fluent interface" http://martinfowler.com/bliki/FluentInterface.html - a mio parere offre molti vantaggi in termini di leggibilità e chiarezza. –

127

È possibile utilizzare il metodo withTime:

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

Stessa risposta di Pietro, ma più breve.

+39

L'inizio della giornata può anche essere ottenuto con _d.withTimeAtStartOfDay() _ – Touko

+12

'withTimeAtStartOfDay()' non è disponibile per 'LocalDateTime', ma è disponibile per [' DateTime'] (http: //joda-time.sourceforge .net/apidocs/org/joda/time/DateTime.html # withTimeAtStartOfDay()) – Abdull

+0

+1. Una nota: 'LocalDateTime è immutabile, quindi non ci sono metodi impostati. Invece, questo metodo restituisce una nuova istanza con il valore di millis del giorno cambiato. Quindi devi assegnare il risultato a qualche variabile. – informatik01

65

anche un modo semplice è

d.millisOfDay().withMaximumValue();

+10

Questa dovrebbe essere la risposta accettata, in confronto alle altre risposte è la migliore in termini di prestazioni (meno oggetti creati come DateTime è immodificabile). Il metodo con MaximunValue Documentation dice anche che è il modo migliore per realizzare ciò che la domanda sta ponendo – le0diaz

+0

Qual è la differenza con 'getMaximumValueOverall'? –

Problemi correlati