Время Joda: первый день недели?
Решение
Joda-Time использует стандарт ISO с понедельника по воскресенье.
Он не может ни получить первый день недели, ни вернуть индекс дня недели на основе любого другого дня, кроме стандартного понедельника. Наконец, недели всегда рассчитываются по правилам ISO.
Другие советы
Нет причин, по которым вы не можете использовать JDK, по крайней мере, для нахождения "обычного начала недели" " для данной локали. Единственная сложная часть - это перевод констант для будних дней, где оба значения от 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;
}
Добавьте языковой стандарт в Calendar.getInstance (), чтобы получить результат для некоторого языкового стандарта, отличного от заданного по умолчанию.
Вот как можно поработать во время Joda, чтобы получить первый день недели в США:
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)
}
Похоже, вам не повезло, похоже, что все предоставленные хронологии наследуют реализацию от baseChronology, которая поддерживает только определения ISO, т.е. понедельник = 1 ... воскресенье = 7.
Вы должны будете определить свою собственную LocaleChronology, возможно, смоделированную по StrictChronology или LenientChronology, добавить фабричный метод:
public static LocaleChronology getInstance(Chronology base, Locale locale)
и переопределить реализацию
public final DateTimeField dayOfWeek()
с повторной реализацией java.util.Calendar.setWeekCountData (Locale requiredLocale), которая опирается на sun.util.resources.LocaleData..getCalendarData (requiredLocale).
Итак, ваш вопрос: как получить DayOfWeek из объекта Joda DateTime? Как насчет этого:
DateTime dt = new DateTime().withYear(2009).plusDays(111);
dt.toGregorianCalendar().getFirstDayOfWeek();
Я использовал следующую заглушку в 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)
предназначен только для того, чтобы сделать интервал недели с воскресенья по субботу (вместо значения по умолчанию с понедельника по Воскресенье известно Йоде
). Для США (и других подобных) локалей вы можете игнорировать эту часть