Как лучше всего работать со временем в kotlin? - PullRequest
0 голосов
/ 21 января 2020

Я занимаюсь разработкой приложения Android с использованием Kotlin, и мне хотелось бы добиться следующего:

  1. Позволить пользователю выбрать время для предупреждения (чч : мм) от текущего времени до следующих 24 часов например, в 16:00 пользователь хочет поставить оповещение на завтра в 15:00.
  2. Как только пользователь установит оповещение, я хотите показать оставшееся время до активации оповещения (чч: мм) например, показать небольшой диалог с текстом: 3 часа: 15 минут осталось.

Что такое лучший способ справиться с операциями времени (вычесть текущее время из времени предупреждения) в Kotlin?

Ответы [ 2 ]

1 голос
/ 21 января 2020

Все ваши вопросы задавались и отвечали много раз на переполнение стека Так что я буду краток. Поиск, чтобы узнать больше.

Используйте только java .time классы, но не ужасные классы, такие как Date и Calendar.

Для Android до 26 см. Библиотеку ThreeTen-Backport и ее Android -specifi c оболочку ThreeTenABP .

Представляет время суток с LocalTime.

LocalTime targetLocalTime = LocalTime.of( 15 , 0 ) ;

Получить текущий момент. Требуется часовой пояс. 2-4 буквенные коды типа CST не являются зонами реального времени. Реальные зоны называются Continent/Region.

ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime now = ZonedDateTime.now( z ) ;

Сравнить порцию времени. Извлеките LocalTime для сравнения.

Boolean runToday = now.toLocalTime().isBefore( targetLocalTime ) ;

Определение следующего времени будильника.

ZonedDateTime zdt = now.with( targetLocalTime ) ; 

Или, если необходимо, на следующий день, завтра.

ZonedDateTime zdt = now.toLocalDate().plusDays( 1 ).atStartOfDay( z ).with( targetLocalTime ) ;

Рассчитать прошедшее время. Установите UT C, извлекая Instant.

Duration d = Duration.between( now.toInstant() , zdt.toInstant() ) ;

Генерация строки в стандартном формате ISO 8601.

String output = d.toString() ;

Или сгенерируйте строку в другом формате, вызвав методы Duration::to…Part.

Что касается срабатывания будильника, в прямой Java используйте структуру Executors , в частности ScheduledExecutorService. Эта структура упрощает запуск фонового потока, который запускает задачу Runnable в определенный момент. Что ж, почти наверняка - небольшие задержки могут возникнуть при сборке мусора или планировании потоков / процессов на процессоре, но достаточно для бизнес-приложений (недостаточно для NASA).

Android также может предоставлять некоторые функции настройки будильника. (Я не знаю)

Никогда не обращайтесь к своему пользовательскому интерфейсу и не манипулируйте им из фонового потока. Используйте любой хук Android, предоставляемый для обновления пользовательского интерфейса из другого потока, например, для обновления виджета пользовательского интерфейса или представления уведомления.

0 голосов
/ 22 января 2020

Согласно Василию Бурке , следующий код, который он предложил (в Java), преобразован в Kotlin, на случай, если кто-то заинтересован.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...