Я предлагаю следующее для получения строки для сохранения в ваших общих настройках:
String timestampToSave = Instant.now().toString();
Теперь, чтобы подсчитать секунды с момента, указанного в этой строке:
String timestampFromSharedPreferences = mySharedPrefs.getString(KEY, null);
long diffInSeconds = Duration.between(Instant.parse(timestampFromSharedPreferences),
Instant.now())
.getSeconds();
if (diffInSeconds < 120) {
System.out.println("Less than 120");
}
Instant
— это однозначный момент времени, не зависящий от часового пояса. Его строковое представление выглядит как 2018-04-16T09:26:27.929Z
(ISO 8601). Z
в конце означает UTC. Таким образом, вышеизложенное работает даже в том случае, если пользователь меняет настройку часового пояса устройства или какая-то другая часть вашей программы меняет настройку часового пояса вашей JVM. Вы заметили, что нам не нужен явный модуль форматирования для форматирования строки и ее разбора обратно в Instant
.
Если вы хотите сравнить с 2 минутами, а не со 120 секундами, используйте toMinutes()
вместо getSeconds()
.
Если вы не можете изменить строку, сохраненную в общих настройках, вам нужно будет скрестить пальцы, чтобы настройка часового пояса не была изменена, а затем проанализировать строку следующим образом:
DateTimeFormatter timestampFormatter = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss");
Instant storedTimestamp = LocalDateTime.parse(timestampFromSharedPreferences, timestampFormatter)
.atZone(ZoneId.systemDefault())
.toInstant();
Теперь пусть Duration
рассчитает разницу между Instant
объектами, как и раньше.
Я использую и рекомендую java.time
, современный API даты и времени Java. Класс SimpleDateFormat
, который вы использовали, давно устарел, как и Date
, а также, как известно, доставляет много хлопот. С современным API гораздо приятнее работать.
Вопрос: Могу ли я использовать java.time на Android?
Да, java.time
прекрасно работает на старых и новых устройствах Android. Просто требуется как минимум Java 6.
- В Java 8 и более поздних версиях, а также на более новых устройствах Android (начиная с уровня API 26, как мне сказали) современный API встроен.
- В Java 6 и 7 используйте ThreeTen Backport, бэкпорт новых классов (ThreeTen для JSR 310; см. ссылки внизу).
- На (старом) Android используйте версию ThreeTen Backport для Android. Он называется ThreeTenABP. И убедитесь, что вы импортируете классы даты и времени из
org.threeten.bp
с подпакетами.
Ссылки
person
Ole V.V.
schedule
16.04.2018
SimpleDateFormat
и друзей и добавить ThreeTenABP на свой Android. проект, чтобы использоватьjava.time
, современный API даты и времени Java. С ним намного приятнее работать. - person Ole V.V.   schedule 16.04.2018yyyy-MM-dd HH:mm:ss
? Это было бы ненадежно, если бы вы не знали, какой часовой пояс был установлен на устройстве при сохранении строки. - person Ole V.V.   schedule 16.04.2018