Joda Time: Primeiro dia da semana?
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 ??strong>: 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