Это удивительно сложнее, чем частично недействительные ожидания ОП и большинство ответов.
Прежде всего, нужно сказать: очень важно определить правильный порядок действий, основанных на недельных манипуляциях. OP впервые применил дневные манипуляции, а затем манипулирование на основе года. Правильный подход обратный! Я покажу правильную реализацию методы хелперов:
public static void main(String... args) {
System.out.println(
getDateFromWeekAndYear("53", "2015")); // 2015-12-28, NOT 2014-12-28
System.out.println(
getDateFromWeekAndYear("53", "2015").get(WeekFields.ISO.weekOfWeekBasedYear())); // 53
System.out.println(
getDateFromWeekAndYear("53", "2014")); // 2014-12-29
System.out.println(
getDateFromWeekAndYear("53", "2014").get(WeekFields.ISO.weekOfWeekBasedYear())); // 1
}
private static LocalDate getDateFromWeekAndYear(final String week,final String year) {
int y = Integer.parseInt(year);
LocalDate date = LocalDate.of(y, 7, 1); // safer than choosing current date
// date = date.with(WeekFields.ISO.weekBasedYear(), y); // no longer necessary
date = date.with(WeekFields.ISO.weekOfWeekBasedYear(), Long.parseLong(week));
date = date.with(WeekFields.ISO.dayOfWeek(), 1);
return date;
}
Если вы не уважаете этот конкретный заказ, то вы действительно получите иногда в 2014-дату для ввода 2015-W53 (в зависимости от текущей даты).
Вторая проблема: Я также избегаю начинать с текущей даты, чтобы быть не ближе к началу или концу календарного года (календарный год! = Неделя по году), а вместо этого выбрана в середине года в качестве отправной точки ,
Третья проблема заключается в мягкой обработке недели 53 в неделю (неделя) 2014 года. Этого не существует, потому что 2014 года было всего 52 недели !!! Строгий алгоритм должен распознавать и отклонять такой ввод. Поэтому я советую не использовать YearWeek.of(2014, 53)
(во внешней библиотеке Threeten-Extra), что приводит к первой неделе 2015 года, см. Также ее javadoc. Лучше, чем такое снисходительное обращение было бы
YearWeek yw = YearWeek.of(2014, 52);
if (yw.is53WeekYear()) {
yw = YearWeek.of(2014, 53);
}
или используя этот код из моей библиотеки времени Time4J (чей класс CalendarWeek имеет дополнительные i18n-функции и дополнительные недели арифметику по сравнению с YearWeek
):
CalendarWeek.of(2014, 53); // throws an exception
System.out.println(CalendarWeek.of(2014, 1).withLastWeekOfYear()); // 2014-W52
только с помощью java.time
-package:
Использование таких внешних библиотек, по крайней мере, помогли решить первую пробл em прозрачным способом.Если вы не хотите добавлять дополнительную зависимость, вы можете сделать это, чтобы обработать неделю 53, если это недействительно:
Если выражение WeekFields.ISO.weekOfWeekBasedYear()
, примененное к результату вашего вспомогательного метода, дает значение 1, тогда вы знаете, что неделя 53 была недействительной , И тогда вы можете решить, хотите ли вы принять мягкую обработку или выбросить исключение. Но тихая настройка такого недопустимого ввода - это плохой дизайн IMHO.
Вы имеете в виду получение текущей даты с использованием YearMonth.of (int year, int month)? –
29/12/2014 был понедельник - почему вы ожидаете 28/12/2014? Также обратите внимание, что было бы более понятным использовать 'DayOfWeek.MONDAY.getValue()' вместо '1'. – assylias
Вам не нужна информация текущей даты, нет необходимости начинать с этого. Вы можете установить неделю и год с помощью 'YearMonth.of (int year, int month)', а затем установить день недели. – Aaron