2009-11-26 6 views
56

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

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

Wikipedia "Seven-day week"#Week_number

+1

Прочтите мой вопрос еще раз, пожалуйста. Я полагаю, что я на самом деле очень сильно нагнал точку дома, что было бы просто неправильно понять это по вопросу, который вы оба придумали. Удивительно, но я ошибся. Далее идет речь: некоторые локали (например, США) используют воскресенье в качестве первого дня недели. Другие используют стандарт ISO в качестве первого дня недели. Как я могу запросить Joda Time для этого? С Java, это просто прост: http://java.sun.com/javase/6/docs/api/java/util/Calendar.html#getFirstDayOfWeek() Итак: Calendar.getInstance (Locale.US) .getFirstDayOfWeek(). С Джодой? – stolsvik

+2

Почему бы просто не использовать Calendar.getInstance (Locale.US) .getFirstDayOfWeek()? –

+3

Потому что, если я хочу использовать Joda Time, я хочу использовать его «на всем пути», не смешивая две совершенно разные библиотеки. – stolsvik

ответ

44

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

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

+21

Тогда я должен спросить - разве это не должно рассматриваться как явный недостаток во времена Джоды? Серьезно, для «печатных календарей» (т. Е. Тех, кого вы вешаете на кухне, тех, которые вы выбираете в расписании-webapps), я нахожу это крайне раздражающим, когда календарь показывает воскресенье как первый день недели - я действительно из-за этого возникают проблемы. Поэтому я предполагаю, что для американцев это должно быть совершенно одинаково, когда они представлены с календарями, в которых начинаются недели в понедельник: все становится «на один день раньше», если можно так выразиться - когда смотришь на третий «ящик» недели, американец предполагает, что это вторник. – stolsvik

+1

@stolsvik Почему это должно быть недостатком? Это только определяет, какое число соответствует тому, что день недели. Например: 1 = ПОНЕДЕЛЬНИК. –

+11

Потому что @CristianVrabie делает работу с библиотекой сложнее, если вам нужно найти первый день недели на заданную дату. Для локалей с понедельником вы можете просто вызвать 'LocalDate.now(). WithDayOfWeek (DateTimeConstants.MONDAY)', но это не сработает, если вам действительно понадобится воскресенье вместо этого. Вам нужно проверить, уже ли это воскресенье, а если нет, перейдите в воскресенье и одну неделю назад. Это отстой. Однако обратите внимание, что календарь Java также отстой; еще хуже, это позволяет вам верить, что это работает, пока это не так, см. http://stackoverflow.com/a/7499264/505775 –

-1

Так что ваш вопрос, как получить DayOfWeek от объекта Joda DateTime? Что об этом:

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

Нет, это не мой вопрос. Мой вопрос: данный Locale.US (и NOTHING ELSE), каков первый день недели? И я хочу, чтобы Joda Time рассказывала мне, а не java std. библиотеки. Хронология Joda Time, похоже, утверждает, что понедельник - это первый день недели (это то, что говорит стандарт ISO8601). Разве это невозможно? Разве Joda Time не знает, что американцы предпочитают видеть свои календари с «воскресеньем» в первый день недели, в то время как (большинство из нас) европейцы действительно расстраиваются по этому поводу и хотят, чтобы «понедельник» начиналось неделю? Я нахожу это невероятным, так как время Джоды кажется полным. – stolsvik

+0

Почему вы не просто используете стандартные библиотеки Java? Возможно, они не реализовали его, потому что он уже существует. Я действительно не понимаю. –

+2

Знаете ли вы Время Джоды? Им не нужно было бы внедрять НИЧЕГО, поскольку все возможно в java std. ЛИЭС. Таким образом, мой вопрос все еще стоит: если это действительно невозможно с Joda Time, то Joda Time является неполным, лишенным. Мне трудно поверить, но это может быть правдой. – stolsvik

2

Похоже, вы не повезло, это выглядит как все предоставляемые хронологий наследуют реализацию от baseChronology, который поддерживает только определения ISO, т.е. понедельник = 1 ... воскресенье = 7.

Вы должны определить свой собственный LocaleChronology, возможно, смоделированный на StrictChronology или LenientChronology, добавьте фабричный метод:

public static LocaleChronology getInstance(Chronology base, Locale locale) 

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

public final DateTimeField dayOfWeek() 

с повторной реализации java.util.Calendar.setWeekCountData (Locale wishLocale), который полагается на sun.util.resources.LocaleData..getCalendarData (желательноLocale).

+0

Я не совсем понимаю это. Мы, норвежцы и их американцы, согласны с тем, что 2009-11-26 - четверг - это только то, что, когда мы показываем всю неделю - 7 дней подряд, мы, европейцы, начинаем с некоторого понедельника и заканчиваем со следующего воскресенья (т. Е. «Выходные» - суббота и воскресенье, правда?), В то время как американцы начинают с воскресенья и заканчивают в следующую субботу. Это точно так же, как норвежцы, пишущие 26/11 2009, Swedish 2009-11-26 (они логичны там!) И американцы 11/26 2009 (?!). Это просто проблема с отображением, а не вопрос расчета. – stolsvik

+0

Все хронологии покажут 2009-11-26 как четверг, и это должно показать как 48-ю неделю 53 в ISOChronology. Теперь, если мы должны были спросить, что это firstDayOfWeek (48), ответ будет зависеть от местности: США = ВС 2009-11-22 NO = Пн 2009-11-23 – crowne

+0

Проблема, кажется, похожа на разные языки программирования, которые используют разные значения для первой позиции в массиве, например java - это нулевой массив [0], тогда как pascal и cobol - 1 байт-массив [1]. Итак, если вам задан случайный элемент> 1 в массиве размером 7, то способ, которым вы определяете, как вернуться в первую позицию, будет зависеть от вашего языка программирования: java: fdow (day [3]) = день [3-3] cobol/pascal: fdow (день [3]) = день [3-2] – crowne

14

Нет причин, по которым вы не можете использовать 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 другой, чем по умолчанию.

+0

Это я написал в комментарии к вопросу 29. nov. 2009. – stolsvik

+1

Очень хороший ответ, который обеспечивает OP тем, что он говорит, что он ищет. Одно из предложений: указать имя пакета явно «java.util.Calendar», поэтому чистейшему не нужно, чтобы его сенситивы были нарушены с помощью нежелательного использования заявления в верхней части его кода. :-) – RenniePet

4

Вот как можно обойти 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) 
} 
-1

Я использовал следующие окурок в 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) 

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

Смежные вопросы