gpt4 book ai didi

java - 使用 Java LocalDateTime 设置警报管理器与使用日历

转载 作者:行者123 更新时间:2023-12-02 11:40:46 25 4
gpt4 key购买 nike

我正在编写一个警报调度类。我之前写的类都是用Calendar来设置闹钟的。

我已使用“三十反向移植”切换到新的 Java DateTime api。

我之前通过获取日历中的时间(以毫秒为单位)来设置单次警报,如下所示:

    // For the different versions of operating system set off a single shot alarm
if(Build.VERSION.SDK_INT >= 23) {
mAlarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP,
alarmCalander.getTimeInMillis(), pIntent);
} else if(Build.VERSION.SDK_INT >= 19) {
mAlarmManager.setExact(AlarmManager.RTC_WAKEUP, alarmCalander.getTimeInMillis(), pIntent);
} else {
mAlarmManager.set(AlarmManager.RTC_WAKEUP, alarmCalander.getTimeInMillis(), pIntent);
}

您可以看到我在日历上使用了以毫秒为单位的获取时间,如下所示:

alarmCalander.getTimeInMillis()

现在我有了 LocalDateTime 而不是日历

但我没有看到任何方法可以获取 LocalDateTime 的时间(以毫秒为单位),只有纳秒。

您是否会将其转换回毫秒还是有更好的方法吗?

谢谢

最佳答案

您必须先将 LocalDateTime (LDT) 转换为 Instant,然后才能从中读取时间戳相关信息。有多种方法可以实现这一目标:

  1. 在您的 LDT 实例中调用 toInstant(ZoneOffset)。请注意,您必须根据您的 LDT 传入匹配的 ZoneOffset,否则您可能会得到不正确的 Instant

    例如,假设您的 LDT 是在 UTC 计算的:

     LocalDateTime ldt = /* ... */
    Instant i = ldt.toInstant(ZoneOffset.UTC);
    Long millis = i.toEpochMilli();
  2. 将您的 LDT 实例转换为 ZonedDateTime 并传入正确的区域 ID,然后使用它生成 Instant,而无需 区域偏移:

     LocalDateTime ldt = /* ... */
    ZonedDateTime zdt = ZonedDateTime.of(ldt, ZoneId.of("UTC"));
    Instant i = zdt.toInstant().toEpochMilli();
    Long millis = i.toEpochMilli();

关于java - 使用 Java LocalDateTime 设置警报管理器与使用日历,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48578775/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com