Создание объектов 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

Избегайте устаревших классов даты и времени

Унаследованные классы, такие как 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.

Это работает для вас?

Instant.fromEpochSeconds(<number>)
Другие вопросы по тегам