Создание объектов Date в Kotlin для уровня API меньше или равного 16
Это может показаться очень забавным и простым, но я изо всех сил пытаюсь создать объект типа DateTime в Kotlin, передав количество секунд от эпохи к ней.
Либо примеры, которые я получаю, относятся к библиотекам, требующим уровня API 26, либо просто говорят о преобразовании формата из строки DD-MM-YYYY в какую-то другую.
Я пробовал "LocalDateTime", "Timestamp", "Date" до сих пор, но Kotlin либо отказывается их распознавать, либо не соглашается с параметрами функции, либо не может разрешить конфликт пространства имен. Или примеры относятся к Java, которые не работают в Kotlin или не имеют эквивалента в Kotlin.
При использовании Date() я получаю сообщение об ошибке "Нет доступа": это закрыто в Date()"
С LocalDate, LocalDateTime я получаю ошибку уровня API
При использовании отметки времени я получаю сообщение об ошибке "Ни одна из следующих функций не может быть вызвана с указанными аргументами". Я передаю Long в качестве параметра, как указано в документации. Но ожидается "Посылка" или "Дата".
Может кто-нибудь помочь?
3 ответа
Я использую Календарь для Котлина
val date = Calendar.getInstance()
date.timeInMillis = 5000000
txtDate.text = date.time.toString()
tl;dr
- Используйте классы java.time.
Никогда не использоватьDate
,Calendar
, илиSimpleDateFormat
. - Добавьте в свой проект библиотеку ThreeTenABP.
- См. Как использовать ThreeTenABP в Android Project.
Избегайте устаревших классов даты и времени
Унаследованные классы, такие как Date
& Calendar
это ужасно, созданные людьми, которые не понимают обработки даты и времени. Эти классы были вытеснены много лет назад современными классами java.time, определенными в JSR 310.
java.time
В Instant
класс заменяет Date
, оба представляют момент в формате UTC (смещение нуля часов-минут-секунд).
Instant instant = Instant.now() ; // Capture the current moment in UTC.
В Calendar
класс, а точнее, его наиболее часто используемый конкретный подкласс GregorianCalendar
заменяется на ZonedDateTime
.
ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = ZonedDateTime.now( z ) ; // Capture the current moment as seen in the wall-clock time used by the people of a particular region (a time zone).
Перерабатывать
Лучше всего полностью избегать устаревших классов даты и времени. Но иногда вам может потребоваться взаимодействие со старым кодом, который еще не обновлен доjava.time. В этом случае конвертируйте. Посмотрите на новыеto…
/from…
методы преобразования добавлены в старые классы.
Calendar calendar = GregorianCalendar.from( zdt ) ;
â € ¦andâ € ¦
ZonedDateTime zdt = ( ( GregorianCalendar ) calendar ).toZonedDateTime() ;
Бэк-порт
Вjava.time классы встроены в Java 8, а затем и Android 26 и позже.
Для Java 6 и 7 используйте бэк-порт из проекта ThreeTen-Backport.Там находится большая часть функциональностиjava.time. Этим проектом руководит тот же человек, который руководит проектомjava.time и JSR 310, JodaStephen.
Для Android до 26, используйте адаптацию этого бэк-порта для Android, проект ThreeTenABP.