3

Необходимо работа с датами, например такие операции как:

  • определить количество недель охватывающих 2 даты (например 03.11.2019 и 04.11.2019 - 2 недели)
  • Дату среды на 15 неделе от даты и т.д.

Не подскажите, а то самому не охота реализовывать. На python использовал relativedelta, может есть что-то подобное на Kotlin. Будет применяться на Android

Попробовал Joda Time, как советовали.

fun differentDatesInWeek(startDate: DateTime, endDate: DateTime) : Int{

        return Weeks.weeksBetween(startDate, endDate).weeks
    }

Собственно вопрос, почему при выборе дат 03.11.2019 и 04.11.2019 он показывает 0, а не 2 (или хотя бы 1)?

Или вот так. Решение 2:

var start = DateTime.parse("2019-11-08")
        var end = DateTime.parse("2019-11-09")
        Log.d("Разница 1", Weeks.weeksBetween(start, end).weeks.toString())

        start = DateTime.parse("2019-11-08")
        end = DateTime.parse("2019-11-10")
        Log.d("Разница 2", Weeks.weeksBetween(start, end).weeks.toString())

Ответ:

2019-11-01 16:36:25.325 22728-22728/ru.ddstudio.schedule D/Разница 1: 0
2019-11-01 16:36:25.327 22728-22728/ru.ddstudio.schedule D/Разница 2: 0

Собственно ответ должен быть разный, так как они лежат в разных неделях. Взял именно эти данные, чтобы показать что неделя "Американская"

Посмотрел решение с Calendar

Вот код

        var calendar = Calendar.getInstance()
    calendar.set(2019, 11, 2)
    val c1 = calendar.get(Calendar.WEEK_OF_YEAR)
    calendar.set(2019, 11, 3)
    val c2 = calendar.get(Calendar.WEEK_OF_YEAR)
    Log.d("Количество недель с1", (c1).toString())
    Log.d("Количество недель с2", (c2).toString())
    Log.d("Количество недель", (c2 - c1).toString())

    ////////////
    calendar = Calendar.getInstance()
    calendar.set(2019, 11, 3)
    val c3 = calendar.get(Calendar.WEEK_OF_YEAR)
    calendar.set(2019, 11, 4)
    val c4 = calendar.get(Calendar.WEEK_OF_YEAR)
    Log.d("Количество недель с3", (c3).toString())
    Log.d("Количество недель с4", (c4).toString())
    Log.d("Количество недель", (c4 - c3).toString())

Результат:

    2019-11-01 16:18:51.726 21282-21282/ru.ddstudio.schedule D/Количество недель с1: 49
2019-11-01 16:18:51.726 21282-21282/ru.ddstudio.schedule D/Количество недель с2: 49
2019-11-01 16:18:51.726 21282-21282/ru.ddstudio.schedule D/Количество недель: 0
2019-11-01 16:18:51.726 21282-21282/ru.ddstudio.schedule D/Количество недель с3: 49
2019-11-01 16:18:51.726 21282-21282/ru.ddstudio.schedule D/Количество недель с4: 49
2019-11-01 16:18:51.726 21282-21282/ru.ddstudio.schedule D/Количество недель: 0

Почему ответ для этих дат одинаков? хотя они находятся в разных неделях

danilshik
  • 3,077
  • Американцы и многие другие нации не согласятся с вами в том, что 3 и 4 ноября 2019 находятся в разных неделях. – Эникейщик Nov 01 '19 at 13:17
  • @Эникейщик обновил ответ Calendar – danilshik Nov 01 '19 at 13:20
  • Узнать первый день недели - getFirstDayOfWeek() Наверняка там окажется воскресенье. – Эникейщик Nov 01 '19 at 13:22
  • @Эникейщик это я знаю, что у них все с ВСК, данные одинаковые? Я думал, может что-то не так передавал от Фрагмента, поэтому в самом методе ввел, результат один и тот же, ходя эти даты должны иметь разное значение, Добавил в решение 2 – danilshik Nov 01 '19 at 13:38

2 Answers2

2
  • Берете календарь, устанавливаете дату 1, определяете номер недели 1-ой даты и также для 2-ой даты, если они попадают в 1 год, то разница недель+1.
  • Берете дату, добавляете 15 недель - получится искомая дата.
Calendar calendar = Calendar.getInstance();
calendar.set( Calendar.MONTH, month1 );
calendar.set( Calendar.DATE, date1 );
calendar.set( Calendar.YEAR, year1 );

calendar.get( Calendar.WEEK_OF_YEAR );    

calendar.add( Calendar.WEEK, 15 );
insolor
  • 49,104
Style-7
  • 1,551
2

Сейчас стандартом де-факто для работы с датами является либа Joda Time

В вашем случае, количество недель между двумя датами в термина Joda будет такая:

var weeks = Weeks.weeksBetween(dateTime1, dateTime2).getWeeks()
Barmaley
  • 81,300
  • добавил вопрос в шапку – danilshik Nov 01 '19 at 12:41
  • @danilshik, если возник новый вопрос, лучше задавать его отдельно, а не изменять старый – insolor Nov 01 '19 at 12:55
  • @insolor с чего решили что я задаю новый вопрос? Мне предложили решение, я показываю и спрашиваю, почему данное решение показывает не тот результат, который мы ожидали. Если вас смущает Android - часть, то я ее удалил – danilshik Nov 01 '19 at 13:03
  • @danilshik, уточнение по ответу - это новый вопрос. Если изменить исходный вопрос, то это автоматически делает другие ответы невалидными. – insolor Nov 01 '19 at 15:21