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


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

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

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

6 56

6 ответов:

Joda-Time использует стандарт ISO с понедельника по воскресенье неделю.

Он не имеет возможности получить первый день недели, ни вернуть индекс дня недели на основе любого дня, кроме стандартного понедельника. Наконец, недели всегда рассчитываются по правилам WRT ISO.

нет причин, по которым вы не можете использовать JDK, по крайней мере, чтобы найти "обычное начало недели" для данной локали. Единственная сложная часть-это перевод констант для будних дней, где оба являются от 1 до 7, но java.утиль.Календарь сдвигается на один, с календарем.Понедельник = 2 против DateTimeConstants.Понедельник = 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;
}

добавить локаль в календарь.getInstance (), чтобы получить результат для некоторой локали, отличной от значения по умолчанию.

вот как можно было бы обойти время Джоды, чтобы получить США в первый день недели:

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.

вы должны были бы определить свою собственную локальную хронологию, возможно, смоделированную на строгой хронологии или снисходительной хронологии, добавить заводской метод:

public static LocaleChronology getInstance(Chronology base, Locale locale)

и переопределить реализацию

public final DateTimeField dayOfWeek()

С повторной реализацией Ява.утиль.Календарь.setWeekCountData (Locale desiredLocale), который полагается на солнце.утиль.ресурсы.LocaleData..getCalendarData (desiredLocale).

Итак, ваш вопрос: Как получить DayOfWeek из объекта Joda DateTime? Как насчет этого:

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

я использовал следующие заглушки на Scala получить первый и последний дни недели с JodaDateTime

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)

Примечание: The minusDays(1) только для того, чтобы сделать неделя с воскресенья по субботу (вместо по умолчанию с понедельника по воскресенье, как известно,Joda). Для нас (и других подобных) locales, вы можете игнорировать эту часть