Время джоды: первый день недели?
Как вы получаете первый день недели, учитывая Locale используя Joda Времени?
точка: большинство стран используют международный стандарт понедельник как первый день недели (!). Куча других используют воскресенье (особенно США). Другие, видимо, в субботу. Какая-то, видимо, среда?!
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
получить первый и последний дни недели с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)
Примечание: The
minusDays(1)
только для того, чтобы сделать неделя с воскресенья по субботу (вместо по умолчанию с понедельника по воскресенье, как известно,Joda
). Для нас (и других подобных) locales, вы можете игнорировать эту часть