Рассуждения о времени недели Joda - PullRequest
4 голосов
/ 07 февраля 2010

Приведенный ниже код демонстрирует проблемную реализацию недельного расчета времени. Это поведение не ошибка, а проектное решение Joda-Time использует стандарт ISO с понедельника по воскресенье недели. (возможно, должно быть ошибкой?)

Учитывая дату, когда мне нужно вычислить номер недели, этот расчет должен быть i18n по своей природе. Значение Я должен принять во внимание правильную нумерацию недели на основе региональных настроек пользователя.

Приведенный ниже демонстрационный код показывает неправильные вычисления Joda-Time и правильные вычисления JDK, в приложении мы стараемся придерживаться Joda-Time, который является превосходным решением для манипуляций с датами. Итак, я должен смешивать две библиотеки расчета времени? Я бы, очевидно, предпочел бы не делать этого, даже если это безопасная вещь, или я бы попал в угловые дела (имея опыт работы с датой, календарем, я точно знаю, что это болезненная проблема для Java).

Итог: какова рекомендуемая наилучшая практика для описанного требования?

Код демонстрации проблемы

Пожалуйста, посмотрите этот онлайн календарь с номерами недель для правильного примера расчета недели.

public class JodaTest {
 static DateTimeFormatter formatter = DateTimeFormat.forPattern("ww yyyy");
 static SimpleDateFormat jdkFormatter = new SimpleDateFormat("ww yyyy");

 public static void main(String[] args) {
  DateTime time = new DateTime(/*year*/2009, /*monthOfYear*/12, /*dayOfMonth*/6, /*hourOfDay*/23, /*minuteOfHour*/0, /*secondOfMinute*/0, /*millisOfSecond*/0);

  StringBuilder buffer = new StringBuilder()
   .append("Testing date ").append(time.toString()).append("\n")
   .append("Joda-Time timezone is ").append(DateTimeZone.getDefault()).append(" yet joda wrongly thinks week is ").append(formatter.print(time)).append("\n")
   .append("JDK timezone is ").append(TimeZone.getDefault().getID()).append(" yet jdk rightfully thinks week is ").append(jdkFormatter.format(time.toDate())).append(" (jdk got it right ?!?!)");

  System.out.println(buffer.toString());
 }
}

Выход:

Testing date 2009-12-06T23:00:00.000+02:00
Joda-Time timezone is Asia/Jerusalem yet joda wrongly thinks week is 49 2009
JDK time zone is Asia/Jerusalem yet jdk rightfully thinks week is 50 2009 (jdk got it right ?!?!)

1 Ответ

2 голосов
/ 16 февраля 2010

Лучшее доступное решение - написать реализацию DateTimeField, которая оборачивает логику для извлечения необходимого значения на основе локали. Внутренне вы, вероятно, все еще будете полагаться на данные JDK. Цель состоит в том, чтобы обернуть весь код JDK в один повторно используемый класс. Затем вы используете это так:

int value = dateTime.get(new LocaleAwareWeekField("en_GB"));
...