java .time и ThreeTenABP
Если вы хотите использовать java .time, современный Java API даты и времени, это можно сделать с помощью этого простого метода:
private static WeekFields wf = WeekFields.of(Locale.forLanguageTag("ne-NP"));
public static void getWeeklyDateList(int year, Month month, int week) {
LocalDate someDateInTheWeek = LocalDate.of(year, month, 10).with(wf.weekOfMonth(), week);
LocalDate start = someDateInTheWeek.with(wf.dayOfWeek(), 1);
LocalDate end = someDateInTheWeek.with(wf.dayOfWeek(), 7);
System.out.println("date_start: " + start);
System.out.println("date_end: " + end);
}
Попробуйте это с вашими примерами аргументов:
getWeeklyDateList(2020, Month.JUNE, 3);
Результат:
date_start: 2020-06-14
date_end: 2020-06-20
Как это работает:
Во-первых, недели в разных культурах определяются по-разному. В Непале (поскольку вы указываете Катманду, Непал в качестве вашего местоположения) недели начинаются в воскресенье и пронумерованы таким образом, что первое число месяца приходится на первую неделю месяца. Чтобы справиться со схемой этой недели, я инициализирую объект WeekFields
для непальской культуры.
LocalDate
- это класс java .time для даты без времени суток. Я не думаю, что имеет значение, какой день месяца я выберу в качестве отправной точки; Взял 10-ю. С этой даты я получаю дату на правильной неделе, используя объект WeekFields
и предоставленный номер недели. Оттуда, в свою очередь, я получаю первый и последний день недели, опять же согласно непальскому определению недель: с воскресенья 14 июня по субботу 20 июня 2020 года.
Что пошло не так в вашем коде, я не могу сказать . В любом случае используемый вами класс Calendar
плохо спроектирован и давно устарел. Он также по умолчанию использует локаль JVM по умолчанию для определения недели, что может дать вам другую схему недели, чем вы хотели. И последнее, что могло вас запутать: Calendar
неестественно исчисляет месяцы от 0 для января до 11 для декабря. Итак, когда вы указали 5, вы получили июнь (не май). Вы распечатали номера месяцев в датах результатов, которые, вероятно, снова напечатали 5 (а не 6) для июня.
Вопрос: Разве java .time не требует Android API уровня 26?
java .time прекрасно работает как на старых, так и на новых Android устройствах. Для этого просто требуется как минимум Java 6 .
- В Java 8 и более поздних версиях и на более новых Android устройствах (с уровня API 26) современный API построен -в.
- В не- Android Java 6 и 7 получите ThreeTen Backport, бэкпорт современных классов (ThreeTen для JSR 310; см. ссылки внизу).
- На (более ранней) Android используйте Android версию ThreeTen Backport. Это называется ThreeTenABP. И убедитесь, что вы импортируете классы даты и времени из
org.threeten.bp
с подпакетами.
Ссылки