Получите локализованный номер недели с помощью JodaTime

Я пытаюсь получить номер текущей недели с JodaTime.

Во Франции недели определяются следующим образом:

  • Неделя начинается с Понедельник (в то время как недели начинаются с Sunday в США).
  • Первая неделя года - это неделя, которая содержит 4 января (в то время как ИМО, это неделя, которая содержит 1 января в США. Правильно? Я это подтвердил здесь).

Пример: 1 января 2012 года - воскресенье. Следовательно,

  • Согласно французскому календарю, он относится к неделе 52 2011.
  • Согласно календарю США, он относится к неделе 1 2012

С JodaTime я обнаружил, что могу получить номер недели со следующим методом DateTime#getWeekOfWeekyear().

Я думал, что, указав правильный TimeZone, я бы получил локализованный результат:

DateTime dtFr = new DateTime(2012, 1, 1, 11,11, DateTimeZone.forTimeZone(TimeZone.getTimeZone("Europe/Paris")));
DateTime dtUS = new DateTime(2012, 1, 1, 11,11, DateTimeZone.forTimeZone(TimeZone.getTimeZone("US/Arizona")));
LOGGER.info("weekYear (FR) : " + dtFr.weekyear().get());
LOGGER.info("weekOfWeekYear (FR) : " + dtFr.getWeekOfWeekyear());
LOGGER.info("weekYear (US) : " + dtUS.weekyear().get());
LOGGER.info("weekOfWeekYear (US) : " + dtUS.getWeekOfWeekyear());

Вывод:

2014-03-05 11:28:08,708 - INFO - c.g.s.u.JodaTest - weekYear (FR) : 2011
2014-03-05 11:28:08,709 - INFO - c.g.s.u.JodaTest - weekOfWeekYear (FR) : 52
2014-03-05 11:28:08,709 - INFO - c.g.s.u.JodaTest - weekYear (US) : 2011
2014-03-05 11:28:08,709 - INFO - c.g.s.u.JodaTest - weekOfWeekYear (US) : 52

Я ожидал:

  • weekYear (US): 2012
  • weekOfWeekYear (US): 1

Что-то не так в моем коде?

Ответ 1

Грустный ответ на ваш вопрос по локализованному номеру недели: JodaTime не поддерживает его, только определение недельных номеров ISO-8601. Я знаю, что для многих пользователей это похоже на пробную пробку. Здесь старый java.util. * - материал явно лучше.

Единственный способ реализовать эту функцию в JodaTime - это ввести специализированное поле даты и времени, но это, конечно же, непросто реализовать, поскольку сам проект признался. Это уже было замечено в 2007 году, но с тех пор ничего не произошло.

Кстати, часовые пояса не имеют никакого отношения к вопросу о локализованных числах недель, поэтому вы не можете вылечить эту старую проблему Joda с любой конфигурацией часового пояса.

Ответ 2

Я знаю, что этот вопрос 3 года, но с java.time классы, встроенные в Java 8 и более поздние версии, эта проблема теперь может быть быть разрешен с изящным коротким кодом без Joda-Time:

import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.temporal.WeekFields;

public class USWeek {

    public static final WeekFields US_WEEK_FIELDS = WeekFields.of(DayOfWeek.SUNDAY, 4);
    // equivalent to: public static final WeekFields US_WEEK_FIELDS = WeekFields.SUNDAY_START;
    // equivalent to: public static final WeekFields US_WEEK_FIELDS = WeekFields.of(Locale.US);

    public static int getWeek(LocalDate date) {
        return date.get(US_WEEK_FIELDS.weekOfWeekBasedYear());
    }

    public static int getYear(LocalDate date) {
        return date.get(US_WEEK_FIELDS.weekBasedYear());
    }
}

Примечание: в этом коде определение недель в неделю жестко запрограммировано. Объект WeekFields также может быть определен из Locale, вызывая WeekFields.of(Locale).

Ответ 3

Согласно Joda Time Описание этого метода -

Joda Time

Описание -

public int getWeekOfWeekyear()
Get the week of weekyear field value.
This field is associated with the "weekyear" via getWeekyear(). In the standard ISO8601 week algorithm, the first week of the year is that in which at least 4 days are in the year. As a result of this definition, day 1 of the first week may be in the previous year.

Specified by:
getWeekOfWeekyear in interface ReadableDateTime
Returns:
the week of a week based year

В коде нет ничего плохого.