Все ваши вопросы задавались и отвечали много раз на переполнение стека Так что я буду краток. Поиск, чтобы узнать больше.
Используйте только 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, предоставляемый для обновления пользовательского интерфейса из другого потока, например, для обновления виджета пользовательского интерфейса или представления уведомления.