Joda Time: primo giorno della settimana?
Domanda
Come si ottiene il primo giorno della settimana con un Locale utilizzando Joda-Time ?
Punto: la maggior parte dei paesi utilizza lo standard internazionale lunedì come primo giorno della settimana (!). Molti altri usano la domenica (in particolare gli Stati Uniti). Altri apparentemente sabato. Alcuni apparentemente mercoledì ?!
Soluzione
Joda-Time utilizza lo standard ISO dal lunedì alla domenica settimana.
Non ha la possibilità di ottenere il primo giorno della settimana, né di restituire l'indice del giorno della settimana in base a un giorno diverso dal lunedì standard. Infine, le settimane vengono sempre calcolate in base alle regole ISO.
Altri suggerimenti
Non vi è alcun motivo per cui non è possibile utilizzare il JDK almeno per trovare il "consueto inizio della settimana" per le impostazioni internazionali indicate. L'unica parte difficile è tradurre le costanti per i giorni feriali, dove entrambi sono compresi tra 1 e 7, ma java.util.Calendar viene spostato di uno, con Calendar.MONDAY = 2 vs. DateTimeConstants.MONDAY = 1.
Comunque, usa questa funzione:
/**
* Gets the first day of the week, in the default locale.
*
* @return a value in the range of {@link DateTimeConstants#MONDAY} to
* {@link DateTimeConstants#SUNDAY}.
*/
private static final int getFirstDayOfWeek() {
return ((Calendar.getInstance().getFirstDayOfWeek() + 5) % 7) + 1;
}
Aggiungi un'impostazione internazionale a Calendar.getInstance () per ottenere un risultato per alcune impostazioni internazionali diverso da quello predefinito.
Ecco come si potrebbe aggirare il tempo di Joda per ottenere il primo giorno della settimana negli Stati Uniti:
DateTime getFirstDayOfWeek(DateTime other) {
if(other.dayOfWeek.get == 7)
return other;
else
return other.minusWeeks(1).withDayOfWeek(7);
}
O in Scala
def getFirstDayOfWeek(other: DateTime) = other.dayOfWeek.get match {
case 7 => other
case _ => other.minusWeeks(1).withDayOfWeek(7)
}
Sembra che tu sia sfortunato, sembra che tutte le cronologie fornite ereditino l'implementazione da baseChronology, che supporta solo definizioni ISO, cioè lunedì = 1 ... domenica = 7.
Dovresti definire la tua LocaleChronology, possibilmente modellata su StrictChronology o LenientChronology, aggiungere un metodo di fabbrica:
public static LocaleChronology getInstance(Chronology base, Locale locale)
e sovrascrive l'implementazione di
public final DateTimeField dayOfWeek()
con una reimplementazione di java.util.Calendar.setWeekCountData (Locale desiderataLocale) che si basa su sun.util.resources.LocaleData..getCalendarData (desiderataLocale).
Quindi la tua domanda è: come ottenere DayOfWeek da un oggetto Joda DateTime? Che dire di questo:
DateTime dt = new DateTime().withYear(2009).plusDays(111);
dt.toGregorianCalendar().getFirstDayOfWeek();
Ho usato il seguente stub in Scala
per ottenere il primo e l'ultimo giorno della settimana da Joda
DateTime
val today: DateTime = new DateTime()
val dayOfWeek: DateTime.Property = today.dayOfWeek()
val firstDayOfWeek: DateTime = dayOfWeek.withMinimumValue().minusDays(1)
val lastDayOfWeek: DateTime = dayOfWeek.withMaximumValue().minusDays(1)
Nota : minusDays (1)
ha lo scopo di rendere la durata della settimana da domenica a sabato (anziché il lunedì predefinito a Domenica nota a Joda
). Per gli locali statunitensi (e altri simili), puoi ignorare questa parte