В старой Яве я могу это сделать таким образом:Как разобрать дату из строки с годом и неделей, используя java.time
System.out.println(new SimpleDateFormat("yyyy w", Locale.UK).parse("2015 1"));
// shows Mon Dec 29 00:00:00 CET 2014
System.out.println(new SimpleDateFormat("yyyy w", Locale.US).parse("2015 1"));
// shows Mon Dec 28 00:00:00 CET 2014
Я хотел бы использовать java.time в Java 8.
System.out.println(LocalDate.parse("2015 1", DateTimeFormatter.ofPattern("yyyy w", Locale.US)));
Результат:
java.time.format.DateTimeParseException: Текст '2015 1' не может быть разобран: Невозможно получить LocalDate из TemporalAccessor: {WeekOfWeekBasedYear [WeekFields [вОСКРЕСЕНЬЕ, 1]] = 1, год = 2015}, ISO типа java.time.format . Размещено
Как это сделать в java.time?
Кроме того, я не удовлетворен тем, что должен пройти Локаль, чтобы определить первый день недели: понедельник против воскресенья. Это не функция страны, а функция календаря. Я хотел бы использовать что-то вроде java.time.temporal.WeekFields.ISO, чтобы показать миру, что недели начинаются с понедельника
Я нашел подобный случай: https://stackoverflow.com/questions/3941700/how-to-get-dates-of-a-week-i-know-week-number
но не java.time в Java 8. Кроме того , решение, которое сначала создало объект даты, а позже установило правильную неделю, не изящно. Я хочу создать окончательную дату одним выстрелом.
объявления c) Я не был точным. Я имел в виду, что, когда я хочу использовать пользовательские настройки понедельника/воскресенья, я не должен использовать Locale, где день недели определен как я хочу, но explicite определяет, что такое первый день недели. Предложенный ответ (с Locale.ROOT) составляет 100%, что я спросил – michaldo
я применил решение 2016 года:. System.out.println ( LocalDate.parse ("2016 1", новый DateTimeFormatterBuilder() appendPattern (» ГГГГ w ") .parseDefaulting (ChronoField.DAY_OF_WEEK, 1) .toFormatter() .Locale (Locale.ROOT))); // выпуск: 2015-12-28 Почему я получил 2015-12-28? Я ожидаю получить 2016-01-04, потому что первая неделя 2016 года 4-10 января – michaldo
@michaldo Большое спасибо за ваши отзывы. Я изменил свой ответ, предпочитая второе решение. которые все еще работают для '2016-1', что дает результат' 2016-01-04'. Похоже, мы поразили некоторую странность в JSR-310-API. –