Я не являюсь разработчиком Android, но то, как я читаю документацию, безо всякой необходимости делать что-то особенное.Когда вы устанавливаете будильник, вы указываете количество миллисекунд с начала эпохи, когда оно должно сработать.Эпоха определяется независимо от часовых поясов.Поэтому, если вы просто передадите одно и то же значение triggerAtMillis
на всех устройствах, будильник сработает в одно и то же время на всех устройствах независимо от их часовых поясов.
AlarmManager
имеет метод setTimeZone
тоже, но (1) он вам не нужен, и (2) он установит часовой пояс для всей системы, который вашим пользователям, вероятно, не нужен.
Редактировать: Получение четко определенноговремя, используя java.time
Поскольку вы получаете миллисекунды от calendar.getTimeInMillis()
, если вы получаете неправильное время, проблема в календаре.
Возможно, вы захотите решитьдобавив ThreeTenABP в ваш проект Android, чтобы вы могли использовать java.time, современный Java-интерфейс даты и времени, для вычисления миллисекунд.Смотрите ссылки внизу.Класс Calendar
плохо спроектирован и давно устарел, а современный API гораздо приятнее в работе и в целом дает более четкий код.Например:
ZoneId alarmZone = ZoneId.of("America/Argentina/Salta");
ZonedDateTime alarmDateTime = ZonedDateTime.of(2019, 4, 10, 14, 30, 0, 0, alarmZone);
long triggerAtMillis = alarmDateTime.toInstant().toEpochMilli();
System.out.println(triggerAtMillis);
Выходное значение само по себе не очень интересно:
1554917400000
Дело в том, что, поскольку мы жестко закодироваличасовой пояс в фрагменте кода, значение будет одинаковым независимо от часового пояса устройства, и, следовательно, ваш будильник будет срабатывать одновременно на всех устройствах (при условии, что их часы установлены правильно).
Вопрос: Могу ли я использовать java.time на моей версии Android?Нужно ли мне ThreeTenABP?
java.time прекрасно работает на старых и новых устройствах Android.Для этого требуется как минимум Java 6 .
- В Java 8 и более поздних версиях и на более новых устройствах Android (от уровня API 26) современный API поставляется встроенным.
- В Java 6 и 7 получают ThreeTen Backport, бэкпорт современных классов (ThreeTen для JSR 310; см. Ссылки внизу).
- На (более старых) Android используется версия ThreeTen для AndroidBackport.Это называется ThreeTenABP.И убедитесь, что вы импортируете классы даты и времени из
org.threeten.bp
с подпакетами.
Ссылки