Вопрос

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

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

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

Это было полезно?

Решение

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top