Приведенный ниже код демонстрирует проблемную реализацию недельного расчета времени. Это поведение не ошибка, а проектное решение 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 ?!?!)