Pergunta

Como você começa o primeiro dia da semana dado um Local usando Joda-Time ?

Point: maioria dos países usa o padrão internacional segunda-feira como primeiro dia da semana (!). Um grupo outros usam domingo (nomeadamente EUA). Outros aparentemente sábado. Alguns aparentemente quarta-feira?!

Wikipedia "semana de sete dias" #Week_number

Foi útil?

Solução

Joda-Time usa o padrão ISO de segunda a domingo semana.

Ele não tem a capacidade de obter o primeiro dia da semana, nem para voltar no dia do índice de semana com base em qualquer dia que não segunda-feira standard. Finalmente, semanas são sempre calculados wrt normas ISO.

Outras dicas

Não há nenhuma razão você não pode fazer uso do JDK, pelo menos, para encontrar o "start habitual da semana" para a determinado local. A única parte complicada é traduzindo constantes para dias da semana, em que ambos são de 1 a 7, mas Java.Util.Calendar é deslocado por um, com Calendar.MONDAY = 2 vs. DateTimeConstants.MONDAY = 1.

De qualquer forma, utilizar esta função:

/**
 * 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;
}

Adicionar um Locale para Calendar.getInstance () para obter um resultado por algum Locale diferente do padrão.

Aqui está como se poderia trabalhar em torno do tempo Joda para obter o primeiro dia EUA da semana:

DateTime getFirstDayOfWeek(DateTime other) {
  if(other.dayOfWeek.get == 7)
    return other;
  else
    return other.minusWeeks(1).withDayOfWeek(7);
}

Ou em Scala

def getFirstDayOfWeek(other: DateTime) = other.dayOfWeek.get match {
    case 7 => other
    case _ => other.minusWeeks(1).withDayOfWeek(7)
}

Parece que você está sem sorte, parece que todos os Chronologies fornecidos herdar a implementação de baseChronology, que suporta apenas definições ISO, ou seja, segunda-feira = 1 ... Domingo = 7.

Você teria que definir o seu próprio LocaleChronology, possivelmente inspirado no StrictChronology ou LenientChronology, adicione um método de fábrica:

public static LocaleChronology getInstance(Chronology base, Locale locale)

e substituir a implementação de

public final DateTimeField dayOfWeek()

com uma re-implementação de java.util.Calendar.setWeekCountData (Locale desiredLocale) que se baseia em sun.util.resources.LocaleData..getCalendarData (desiredLocale).

Então, a pergunta é, como obter o DayOfWeek de um objeto Joda DateTime? E quanto a isto:

DateTime dt = new DateTime().withYear(2009).plusDays(111);
dt.toGregorianCalendar().getFirstDayOfWeek();

Eu usei o seguinte rascunho em Scala obter primeiro e último dias da semana de 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 : O minusDays(1) serve apenas para fazer o semana período de domingo a sábado (em vez do padrão de segunda a domingo conhecido por Joda). Para os EUA (e outros semelhantes) localidades , você pode ignorar esta parte

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top