Вычтите 2 метки времени и проверьте их разницу

Я хочу найти разницу между двумя временными метками. Что я делаю, так это сохраняю 1-ю метку времени в общих настройках и пытаюсь вычесть ее из новой метки времени. Чтобы получить метку времени, я использую -

public static String setTimestamp() {
        try {
            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
            return dateFormat.format(new Date());
        } catch (Exception e) {
            return null;
        }
} 

Как вычесть 2 метки времени и проверить, меньше ли разница 120 секунд?


person Monique890    schedule 16.04.2018    source источник
comment
В качестве отступления подумайте о том, чтобы выбросить давно устаревший и заведомо неприятный SimpleDateFormat и друзей и добавить ThreeTenABP на свой Android. проект, чтобы использовать java.time, современный API даты и времени Java. С ним намного приятнее работать.   -  person Ole V.V.    schedule 16.04.2018
comment
Что дал ваш поиск? Возможно, вы, например, нашли этот вопрос: Вычислить разницу даты/времени в java . Подобных вопросов много, не нужно задавать свои.   -  person Ole V.V.    schedule 16.04.2018
comment
Возможный дубликат В Java как получить разницу в секундах между двумя датами?   -  person Ole V.V.    schedule 16.04.2018
comment
Является ли отметка времени в общих настройках строкой в ​​формате yyyy-MM-dd HH:mm:ss? Это было бы ненадежно, если бы вы не знали, какой часовой пояс был установлен на устройстве при сохранении строки.   -  person Ole V.V.    schedule 16.04.2018


Ответы (2)


Я предлагаю следующее для получения строки для сохранения в ваших общих настройках:

    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

Вы можете найти разницу, как это

long diffInMs = firstTimestamp - secondTimestamp;

long diffInSec = TimeUnit.MILLISECONDS.toSeconds(diffInMs);

Теперь у вас есть разница в секундах, так что просто проверьте свое состояние.

if(diffInSec < 120){

}
person Akshay Panchal    schedule 16.04.2018
comment
Как я могу вычесть 2 строки? - person Monique890; 16.04.2018
comment
Если вы сохраняете временные метки в строке, просто проанализируйте строку до длинной. Как и long longTimeStamp = Long.parseLong(timestampInString) - person Akshay Panchal; 16.04.2018
comment
Пожалуйста, наберитесь терпения, @AkshayPanchal. Обычно приходится ждать пару дней, прежде чем принять ответ, чтобы посмотреть, не появятся ли за это время другие ответы. - person Ole V.V.; 16.04.2018