[英]What is the best way to declare on UI component in android with Kotlin?
[英]What is the best way to operate with time in kotlin?
我正在使用Kotlin开发一个 Android 应用程序,我想实现以下目标:
在 Kotlin 中处理时间操作(将当前时间减去警报时间)的最佳方法是什么?
您的所有问题都已在 Stack Overflow 上被多次询问和回答。 所以我会很简短。 搜索以了解更多信息。
仅使用java.time类,绝不使用Date
和Calendar
等可怕的遗留类。
对于 26 之前的 Android,请参阅ThreeTen-Backport库及其特定于 Android 的包装程序ThreeTenABP 。
用LocalTime
表示一天中的时间。
LocalTime targetLocalTime = LocalTime.of( 15 , 0 ) ;
获取当前时刻。 需要一个时区。 像CST
这样的 2-4 字母代码不是实时时区。 真实区域被命名为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 ) ;
计算经过的时间。 通过提取Instant
调整为 UTC。
Duration d = Duration.between( now.toInstant() , zdt.toInstant() ) ;
以标准 ISO 8601 格式生成字符串。
String output = d.toString() ;
或者通过调用Duration::to…Part
方法生成另一种格式的字符串。
至于触发警报,在直接 Java 中使用Executors框架,特别是ScheduledExecutorService
。 这个框架使得运行在特定时刻触发任务Runnable
的后台线程变得简单。 好吧,几乎可以肯定——CPU 上的垃圾收集或线程/进程调度可能会出现轻微延迟,但对于商业应用程序来说已经足够好了(对于 NASA 来说还不够好)。
Android 还可以提供一些闹钟设置功能。 (我不知道)
永远不要从后台线程访问或操作您的用户界面。 使用 Android 提供的任何挂钩从另一个线程更新 UI,例如刷新 UI 小部件或显示通知。
根据Basil Bourque的说法,以下是他建议(用 Java)转换为 Kotlin 的代码,以防有人感兴趣。
// Credit to Basil Bourque Answer
// https://stackoverflow.com/questions/59846004/what-is-the-best-way-to-operate-with-time-in-kotlin/59846550#59846550
lateinit var zdt: ZonedDateTime
val targetLocaltime = LocalTime.of(21, 0)
val z = ZoneId.of("Europe/Madrid")
val now = ZonedDateTime.now(z)
val runToday = now.toLocalTime().isBefore(targetLocaltime)
zdt = if (runToday){
now.with(targetLocaltime)
}
else{
now.toLocalDate().plusDays(1).atStartOfDay(z).with(targetLocaltime)
}
val eta = Duration.between(now.toInstant(), zdt.toInstant()).toMinutes()
if(eta > 60){
val hours = eta / 60
val minutes = eta % 60
print("$hours:$minutes remaining")
}
else{
print("$eta minutes remaining")
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.