Время Джоды: первый день недели?
Как вы получаете первый день недели с Locale, используя Joda-Time?
Точка. Большинство стран используют международный стандарт в понедельник в качестве первого дня недели (!). Куча других используют воскресенье (в частности, США). Другие, видимо, субботу. Некоторые, видимо, в среду?!
Википедия "Семидневная неделя" #Week_number
Ответы
Ответ 1
Joda-Time использует стандарт ISO понедельника по воскресенье.
У него нет возможности получить первый день недели или не вернуть индекс недели в день, отличный от стандартного понедельника. Наконец, недели всегда вычисляются по правилам ISO.
Ответ 2
Нет причин, по которым вы не можете использовать JDK, по крайней мере, для поиска "обычного начала недели" для данного Locale. Единственная сложная часть - перевод констант в будние дни, где оба с 1 по 7, но java.util.Calendar сдвинут на один, с Calendar.MONDAY = 2 против DateTimeConstants.MONDAY = 1.
В любом случае, используйте эту функцию:
/**
* 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;
}
Добавьте Locale в Calendar.getInstance(), чтобы получить результат для некоторого Locale, отличного от значения по умолчанию.
Ответ 3
Вот как можно обойти время Джоды, чтобы получить первый день недели в США:
DateTime getFirstDayOfWeek(DateTime other) {
if(other.dayOfWeek.get == 7)
return other;
else
return other.minusWeeks(1).withDayOfWeek(7);
}
Или в Scala
def getFirstDayOfWeek(other: DateTime) = other.dayOfWeek.get match {
case 7 => other
case _ => other.minusWeeks(1).withDayOfWeek(7)
}
Ответ 4
Похоже, вам не повезло, похоже, что все предоставленные хронологии наследуют реализацию от baseChronology, которая поддерживает только определения ISO,
то есть понедельник = 1... воскресенье = 7.
Вам нужно будет определить свою собственную LocaleChronology, возможно, смоделированную по StrictChronology или LenientChronology, добавьте метод factory:
public static LocaleChronology getInstance(Chronology base, Locale locale)
и переопределить реализацию
public final DateTimeField dayOfWeek()
с повторной реализацией java.util.Calendar.setWeekCountData(Locale wishLocale), который полагается на sun.util.resources.LocaleData..getCalendarData(желательноLocale).
Ответ 5
Итак, ваш вопрос: как получить DayOfWeek из объекта Joda DateTime? Что об этом:
DateTime dt = new DateTime().withYear(2009).plusDays(111);
dt.toGregorianCalendar().getFirstDayOfWeek();
Ответ 6
Я использовал следующую заглушку в Scala
для получения первого и последнего дней недели из 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)
Примечание: minusDays(1)
предназначен только для того, чтобы сделать период недели с воскресенья по субботу (вместо понедельника по воскресенье, известного Joda
). Для США (и других подобных) мест вы можете игнорировать эту часть