Страницы

Поиск по вопросам

среда, 26 февраля 2020 г.

Библиотека для работы с датами Kotlin

#kotlin


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


определить количество недель охватывающих 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


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


Ответы

Ответ 1



Берете календарь, устанавливаете дату 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 );

Ответ 2



Сейчас стандартом де-факто для работы с датами является либа Joda Time В вашем случае, количество недель между двумя датами в термина Joda будет такая: var weeks = Weeks.weeksBetween(dateTime1, dateTime2).getWeeks()

Комментариев нет:

Отправить комментарий