0

我得到了警报管理器设置重复警报的毫秒数,我得到了奇怪的结果-

我定了早上 8 点 55 分的闹钟

LocalDateTime Earliest Day : 2018-05-22T08:55
Instant : 2018-05-22T08:55:00Z

然后我使用这种方法来获取自纪元(1970)以来的毫秒数 -

LogUtils.LOGD(TAG, instant.toEpochMilli() + " : instant.toEpochMilli()");

我立即收到警报,所以我检查了从日历与 Java 时间获取毫秒的旧方法 -

1526996659862 : System.currentTimeMillis() : 
1526979300000 : instant.toEpochMilli()
1526997319862 : calendar.getTimeInMillis()

我得到了由此建立的localdatetime -

LocalDateTime earliestDay = LocalDateTime.of(
        now.getYear(), now.getMonth().getValue(), now.getDayOfMonth(),
        localTime.getHour(), localTime.getMinute(), localTime.getSecond());

然后我将其转换为 Instant 并使用 ZoneOffset - UTC -

Instant instant = earliestDay.toInstant(ZoneOffset.UTC);

我不确定为什么 toEpochMilliseconds 没有按预期工作?

日历输入 -

Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, earliestDay.getHour());
calendar.set(Calendar.MINUTE, earliestDay.getMinute());
4

1 回答 1

0
    ZoneId zone = ZoneId.of("America/Chicago");
    LocalTime alarmTime = LocalTime.of(8, 55);

    LocalDate today = LocalDate.now(zone);
    LocalDateTime earliestDay = today.atTime(alarmTime);
    Instant instant = earliestDay.atZone(zone).toInstant();

    System.out.println(instant.toEpochMilli() + " : instant.toEpochMilli()");

    Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(System.currentTimeMillis());
    calendar.set(Calendar.HOUR_OF_DAY, earliestDay.getHour());
    calendar.set(Calendar.MINUTE, earliestDay.getMinute());

    System.out.println(calendar.getTimeInMillis() + " : calendar.getTimeInMillis()");

我也将 JVM 的时区设置为 America/Chicago 并运行此代码。然后它打印:

1527083700000 : instant.toEpochMilli()
1527083700796 : calendar.getTimeInMillis()

相差0.8秒。这Calendar是不准确的,因为它还没有清除它的毫秒数。

当您想在美国/芝加哥时区的 08:55 发出警报时,您应该说明这一点,而不是ZoneOffset.UTC用于定义Instant.

只要您的时区是美国/芝加哥,您就可以考虑使用ZoneId.systemDefault()时区。您的程序的其他部分或在同一 JVM 中运行的其他程序可能随时更改默认设置,这可能会导致意外。

于 2018-05-23T16:23:28.413 回答