Время Joda: первый день недели? - PullRequest
56 голосов
/ 26 ноября 2009

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

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

Википедия "Семидневная неделя" # Номер недели

Ответы [ 6 ]

44 голосов
/ 27 ноября 2009

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

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

14 голосов
/ 02 ноября 2012

Нет причин, по которым вы не можете использовать 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;
}

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

5 голосов
/ 23 октября 2014

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

DateTime getFirstDayOfWeek(DateTime other) {
  if(other.dayOfWeek.get == 7)
    return other;
  else
    return other.minusWeeks(1).withDayOfWeek(7);
}

Или в Скале

def getFirstDayOfWeek(other: DateTime) = other.dayOfWeek.get match {
    case 7 => other
    case _ => other.minusWeeks(1).withDayOfWeek(7)
}
2 голосов
/ 26 ноября 2009

Похоже, вам не повезло, похоже, что все предоставленные хронологии наследуют реализацию от 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).

0 голосов
/ 15 декабря 2017

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

0 голосов
/ 26 ноября 2009

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

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