Получить дату указанной c недели - PullRequest
0 голосов
/ 25 мая 2020

Я пытаюсь получить дату начала и окончания указанной c недели месяца. Однако дата неверна. Кто-нибудь может определить, в чем проблема?

public class DateUtils
{
   getWeeklyDateList(2020,5, 3);

  public static void getWeeklyDateList(int year, int month, int week)
  {
      Calendar calendar = Calendar.getInstance(Locale.getDefault());
      // setting year, month, week
      calendar.set(Calendar.YEAR, year);
      calendar.set(Calendar.MONTH, month);
      calendar.set(Calendar.WEEK_OF_MONTH,week);

    // setting day of week to first --> Sunday
    calendar.set(Calendar.DAY_OF_WEEK, 1);

    int year1 = calendar.get(Calendar.YEAR);
    int month1 = calendar.get(Calendar.MONTH);
    int day1 = calendar.get(Calendar.DAY_OF_MONTH);

    // setting day of week to last --> Saturday
    calendar.set(Calendar.DAY_OF_WEEK, 7);

    int year7 = calendar.get(Calendar.YEAR);
    int month7 = calendar.get(Calendar.MONTH);
    int day7 = calendar.get(Calendar.DAY_OF_MONTH);

    Log.e("date_start", String.valueOf(year1) + "-" + String.valueOf(month1) + "-" + String.valueOf(day1));
    Log.e("date_end", String.valueOf(year7) + "-" + String.valueOf(month7) + "-" + String.valueOf(day7));
} }

Ответы [ 2 ]

3 голосов
/ 25 мая 2020

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 с подпакетами.

Ссылки

0 голосов
/ 25 мая 2020

Это из-за этой строки calendar.set (Calendar.DAY_OF_WEEK, 1);

это может перенести месяц на предыдущий месяц, если неделя начинается в предыдущем. Если разница в месяцах, то проблема в этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...