2014-12-19 2 views
0
номер

недели плохой в андроиде календаряНомер недели является неправильным в андроида календаря

В некоторых из устройства получать в неделе 53, но и в некоторых других устройствах получать, как 1-й недели на конец года

Календаря каландр = Calendar.getInstance(); int week = calender.get (Calendar.WEEK_OF_YEAR);

+2

Местное поведение в сочетании с использованием стандартного языка Locale? –

ответ

1

Первая неделя

Календарь определяет локализированных семь дней в неделю, используя два параметра: первый день недели и минимальные дни в первой недели (от 1 до 7) , Эти числа берутся из локального ресурса данных при построении Календаря. Они также могут быть указаны в с помощью методов для установки их значений.

При настройке или получении полей WEEK_OF_MONTH или WEEK_OF_YEAR Календарь должен определить первую неделю месяца или года как контрольную точку . Первая неделя месяца или года определяется как самый ранний семидневный период, начинающийся с getFirstDayOfWeek() и , содержащий как минимум getMinimalDaysInFirstWeek() дней этого месяца или год. Недели пронумерованы ..., -1, 0 предшествуют первой неделе; недели пронумерованы 2, 3, ... следуйте за ним. Обратите внимание, что нормализованная нумерация, возвращаемая get(), может быть разной. Например, определенный подкласс Календа может обозначать неделю до недели 1 года как неделю n предыдущего года.

От Java документации (https://docs.oracle.com/javase/7/docs/api/java/util/Calendar.html)

+0

Вы, кажется, цитируете что-то ... но откуда? – jtheletter

+0

Это из 'java.util.Calendar', теперь, когда я прочитал его снова, не совсем ясно, что я указываю« специфичный для локали »и как была рассчитана первая неделя. Должно быть, был напряженный день ... –

+0

Спасибо за добавление ссылки. Приветствия. – jtheletter

0

ТЛ; др

LocalDate.of(2018 , Month.DECEMBER , 31) 
     .get(IsoFields.WEEK_OF_WEEK_BASED_YEAR) 

Locale

Не уверен, что прямого ответа на ваш вопрос, но, как чтобы быть отличным Locale значения в игре. В Calendar определение недели зависит от локали.

Но это спорный. Вы должны использовать классы java.time, которые заменили класс Calendar.

java.time

Calendar является частью проблемных старых классов даты и времени, которые в настоящее время наследие, вытесняется java.time классов. Для более ранних Android см. Последние пули ниже.

Вы должны определить, что вы подразумеваете под номером недели. Существуют разные способы определения номера недели и недели.

По умолчанию java.классы времени используют стандарт ISO 8601 definition: Неделя № 1 имеет первый четверг календарного года и начинается в понедельник (как вы просили). Таким образом, годы имеют 52 или 53 недели. Первый и последний несколько дней календарного года могут приземляться в предыдущем/последующем недельном году.

Класс LocalDate представляет собой значение только для даты без времени суток и без часового пояса.

LocalDate ld = LocalDate.of(2012 , Month.AUGUST , 7) ; 

Опрос на стандартный номер недели. Вы можете задать для любого из этих объектов TemporalField: IsoFields.WEEK_BASED_YEAR & IsoFields.WEEK_OF_WEEK_BASED_YEAR

int weekOfWeekBasedYear = ld.get(IsoFields.WEEK_OF_WEEK_BASED_YEAR) ; 
int yearOfWeekBasedYear = ld.get(IsoFields.WEEK_BASED_YEAR) ; 

Dump утешать с использованием стандартного ISO 8601 format of YYYY-Www-D.

String isoOutput = yearOfWeekBasedYear + "-W" + String.format("%02d", weekOfWeekBasedYear) + "-" + dayOfWeekNumber ; 
System.out.println(ld + " is ISO 8601 week: " + isoOutput) ; 

См. Это code run live at IdeOne.com.

2012-08-07 является ISO 8601 неделя: 2012-W32-2

Кстати, если Андроид когда-либо в состоянии запустить ThreeTen-Extra библиотеку, вы найдете его YearWeek класс полезен ,


О java.time

java.time каркас встроен в Java 8 и более поздних версий. Эти классы вытесняют трудные старые классы времени java.util.Date, Calendar, & SimpleDateFormat.

Проект Joda-Time, в настоящее время в maintenance mode, советует перейти на классы java.time.

Чтобы узнать больше, см. Oracle Tutorial. И поиск Stack Overflow для многих примеров и объяснений. Спецификация: JSR 310.

Где получить классы java.time?

  • Java SE 8, Java SE 9, а затем
    • Встроенный.
    • Часть стандартного Java API с объединенной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и Java SE 7
    • Большая часть функциональности java.time будет обратно портирован на Java 6 & 7 в ThreeTen-Backport.
  • Android
    • Более поздние версии Android реализаций пачке классов java.time.
    • Для более ранних Android, проект ThreeTenABP адаптируется ThreeTen-Backport (упомянутый выше). См. How to use ThreeTenABP….