Localdatetime для эпохи / calendar.getTimeInMillis () для аварийного менеджера - PullRequest
0 голосов
/ 22 мая 2018

Я получаю миллисекунды для диспетчера тревог, чтобы установить повторяющуюся тревогу, и я получаю странные результаты -

Я установил тревогу в 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 earliestDay = LocalDateTime.of(
        now.getYear(), now.getMonth().getValue(), now.getDayOfMonth(),
        localTime.getHour(), localTime.getMinute(), localTime.getSecond());

Затем я получаю его для преобразования в Мгновенное и использует ZoneOffset - UTC -

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

Я не уверен, почему toEpochMilliseconds isnне работает, как задумано?

Календарь ввода -

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

1 Ответ

0 голосов
/ 23 мая 2018
    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 в Америке / Чикаго и запустил этот код.Затем он напечатал:

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

Разница составляет 0,8 секунды.И это Calendar, что является неточным, поскольку у него не были очищены миллисекунды.

Если вы хотите сигнал тревоги в 08:55 в часовом поясе Америки / Чикаго, вы должны указать это и не использовать ZoneOffset.UTCдля определения Instant.

Пока ваш часовой пояс - Америка / Чикаго, вы можете рассмотреть возможность использования ZoneId.systemDefault() для этой зоны.Значение по умолчанию может быть изменено в любое время для других частей вашей программы или других программ, работающих в той же JVM, что может привести к неожиданностям.

...