Localdatetime для эпохи /calendar.getTimeInMillis() для аварийного менеджера
Я получаю миллисекунды для диспетчера будильника, чтобы установить повторяющуюся тревогу, и я получаю странные результаты -
Я установил будильник в 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 не работает так, как задумано?
Календарные входы -
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, earliestDay.getHour());
calendar.set(Calendar.MINUTE, earliestDay.getMinute());
1 ответ
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, что может привести к неожиданностям.