java - 在 kotlin 中操作时间的最佳方式是什么?

标签 java android kotlin

我正在使用 Kotlin 开发 Android 应用,我希望实现以下目标:

  1. 让用户选择从当前时间到接下来的 24 小时之间的提醒时间 (hh:mm) 例如16:00 用户希望在明天 15:00 发出提醒。
  2. 用户设置警报后,我想显示警报激活之前的剩余时间 (hh:mm) 例如显示一个小对话框,其中包含文本:剩余 3 小时:15 分钟。

在 Kotlin 中处理时间操作(将当前时间减去警报时间)的最佳方法是什么?

最佳答案

您的所有问题已在 Stack Overflow 上多次被提出和解答。所以我会简短地说。搜索以了解更多信息。

仅使用java.time类,切勿使用可怕的遗留类,例如DateCalendar

对于 26 之前的 Android,请参阅 ThreeTen-Backport 库及其 Android 特定包装器 ThreeTenABP

LocalTime 表示一天中的时间。

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

获取当前时刻。需要时区。 CST 等 2-4 个字母代码不是实时时区。真实区域被命名为大陆/地区

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 提供的任何钩子(Hook)从另一个线程更新 UI,例如刷新 UI 小部件或呈现通知。

关于java - 在 kotlin 中操作时间的最佳方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59846004/

相关文章:

android - 在手机(android/ios)上生成没有跟踪器的增强现实对象

android - 将度/分/秒转换为有效的 EXIF 接口(interface)字符串

kotlin - 根据另一个 JSON 键的值将 JSON 解码为类

java - 有人使用 Vertx.io 和 PostgreSQL 吗?

java - 无类型的列表实现

java - 使用 "patern' 和 "matcher"我怎样才能返回所有元素而不仅仅是第一个元素

android - 我可以从名称中获取图像文件的 Uri 吗?

kotlin - 如何告诉 jOOQ KotlinGenerator 不要使所有数据类属性可为空?

java - recyclerview 有滚动结束事件吗?

java - 使用 JSON 和 Jackson 库将 JSON 映射回 POJO