Подтвердить что ты не робот

Время Джоды: первый день недели?

Как вы получаете первый день недели с Locale, используя Joda-Time?

Точка. Большинство стран используют международный стандарт в понедельник в качестве первого дня недели (!). Куча других используют воскресенье (в частности, США). Другие, видимо, субботу. Некоторые, видимо, в среду?!

Википедия "Семидневная неделя" #Week_number

4b9b3361

Ответ 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). Для США (и других подобных) мест вы можете игнорировать эту часть