#java #android #android-6.0-marshmallow
#java #Android #android-6.0-marshmallow
Вопрос:
Мне нужно установить календарь на понедельник на следующей неделе. Мой код работает на Android 9.0, но на Android 6.0 он работает только во время отладки.
Проблема с функциями Calendar.set (..), они просто не работают. Например, calendar.set(Календарь.WEEK_OF_YEAR, 17) не изменит календарную неделю на 17, но при отладке она изменит ее на 17.
Вот мой код:
Calendar mcurrentTime = Calendar.getInstance(Locale.GERMANY);
if(AppHelper.getInstance().getNextWeek() != 0){
mcurrentTime.set(Calendar.WEEK_OF_YEAR,
AppHelper.getInstance().getNextWeek());
mcurrentTime.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
}
weekNumberTv.setText(mcurrentTime.get(Calendar.WEEK_OF_YEAR) "");
Android 9.0 weekNumberTv показывает 17
Android 6.0 weekNumberTv показывает 16
Если запустить режим отладки
Android 6.0 weekNumberTv показывает 17
Комментарии:
1. Звучит как разные схемы недели по умолчанию. Вы всегда получаете 1 неделю слишком рано?
Calendar
Класс плохо разработан и давно устарел. Используйте java.time, современный Java API даты и времени, для более простого и естественного кода или поведения, которое легче предсказать.
Ответ №1:
К сожалению, для выполнения расчетов времени в версиях до 7.0 вам придется использовать пакет JavaTime или его бэкпорт.
Реализовать ThreeTen Android Backport library:
implementation 'com.jakewharton.threetenabp:threetenabp:1.2.0'
https://github.com/JakeWharton/ThreeTenABP
Затем инициализируйте его в методе onCreate.
AndroidThreeTen.init(this)
Убедитесь, что включены эти библиотеки, а не Java 8.
import org.threeten.bp.LocalDate
import org.threeten.bp.temporal.ChronoUnit
import org.threeten.bp.temporal.WeekFields
import com.jakewharton.threetenabp.AndroidThreeTen
Код для завершения работы
var mCurrentTime = LocalDate.now()
val weekFields = WeekFields.of(Locale.GERMANY)
val currentDayOfWeek = mCurrentTime.get(weekFields.dayOfWeek())
//subtract day of week to monday
mCurrentTime=mCurrentTime.minus((currentDayOfWeek.toLong()-1),ChronoUnit.DAYS)
//add week starting from monday
mCurrentTime=mCurrentTime.plus(1,ChronoUnit.WEEKS)
//get weekOfYear
val weekOfCurrentTime=mCurrentTime.get(weekFields.weekOfYear())
show_week_in_year.text=weekOfCurrentTime.toString()
Извините за Kotlin. Java находится в отпуске.