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ì ?!

Wikipedia " Settimana di sette giorni " #Week_number

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top