Попытка взять две метки времени, вычесть их, преобразовать разницу в секунды и сохранить в переменной int - PullRequest
0 голосов
/ 27 февраля 2020

У меня проблемы с пониманием получения временных меток, их вычитания и возможности назначать и использовать разницу в будущих вычислениях. Я использую Java в Android Studio.

Когда я использую SimpleDateFormat и Calendar, я могу получить текущее время в HH:mm:ss, но я не уверен, как вычтите две из этих временных меток друг от друга и преобразуйте разницу в секунды. Моя конечная цель - взять разницу, преобразовать ее в секунды, присвоить ей значение типа int, а затем сравнить значение с другими, заранее определенными значениями. Это проект в Android Studio, поэтому у меня уже настроены кнопки для выборки временных меток.

Пример:
- Получить текущую метку времени, скажем, 16: 50: 32
- Получить вторая временная метка в ближайшем будущем, скажем, 16:53:29 (примерно через три минуты)
- вычтите эти две временные метки и сохраните значение в секундах, поэтому окончательное значение будет 177 (секунд)
- получите значение 177 в переменной, чтобы я мог делать с ней больше вещей.

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

Calendar calendar = Calendar.getInstance();
SimpleDateFormat startTime = new SimpleDateFormat("HH:mm:ss");
timeTest = startTime.format(calendar.getTime());

SimpleDateFormat endTime = new SimpleDateFormat("HH:mm:ss");
timeTest2 = endTime.format(calendar.getTime());

Но после получения двух меток времени я не знаю, как вычесть их, преобразовать их в секунды и сохранить их в значении int.

Ответы [ 3 ]

2 голосов
/ 27 февраля 2020

Используете ли вы Java 8?

Если это так, вы можете преобразовать в Instant с и получить Duration между ними:

    Calendar cal = ...
    Calendar cal2 = ...
    Instant instantOne = cal.toInstant();
    Instant instanceTwo = cal2.toInstant();
    Duration between = Duration.between(instantOne, instanceTwo);
    long seconds = between.getSeconds();

Я предположил, что было причина, по которой вы используете Calendar для начала (она перешла к вам без вашего контроля?) ... Если нет, то вы можете просто использовать Instant.now() из get go и вырезать пред Java 8 date / время занятий

1 голос
/ 27 февраля 2020

Хороший ответ от tomgeraghty3 может быть всем, что вам нужно. Я добавляю приложение.

java .time и ThreeTenABP

Если я правильно понял, у вас действительно было два требования:

  1. Вы должны уметь для представления времени начала и окончания в формате HH:mm:ss.
  2. Вам необходимо указать время между началом и концом в секундах.

Не представляйте время в виде строк, хотя , Делать вычисления на них довольно безнадежно. Представьте свое время правильными объектами даты и времени. Форматировать в строки можно только в том случае, если необходимо выдать строку.

    DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HH:mm:ss");

    ZonedDateTime start = ZonedDateTime.now(ZoneId.systemDefault());
    TimeUnit.SECONDS.sleep(175); // Simulate that time passes
    ZonedDateTime end = ZonedDateTime.now(ZoneId.systemDefault());

    long diffSeconds = ChronoUnit.SECONDS.between(start, end);

    System.out.printf("From %s until %s was %d seconds",
            start.format(timeFormatter), end.format(timeFormatter), diffSeconds);

Пример выполнения:

С 05:49:41 до 05:52:36 было 175 секунд

Конечно, чтобы увидеть, как он работает, сначала введите меньшее число, например 3 или 6. Вместо 175.

Если печать в формате HH:mm:ss не была обязательной, вы можете использовать Instant вместо ZonedDateTime как в ответе tomgeraghty3. Поскольку Instant не зависит от часового пояса, вы бы пропустили аргумент для метода now:

    Instant start = Instant.now();

Аналогично для end.

В зависимости от работы, которую вы Необходимо указать значение, которое вы можете рассмотреть для класса Duration, чтобы представить разницу, а не просто для подсчета секунд. Это также продемонстрировано в ответе tomgeraghty3.

Вопрос: Разве java .time не требует Android API уровня 26?

java .time хорошо работает на обоих старых и более новые Android устройства. Для этого требуется как минимум Java 6 .

  • В Java 8 и более поздних версиях и на более новых Android устройствах (от уровня API 26) современный встроенный API -in.
  • В не- Android Java 6 и 7 получите ThreeTen Backport, бэкпорт современных классов (ThreeTen для JSR 310; см. ссылки внизу).
  • Вкл. (Старше) Android используйте версию ThreeTen Backport Android. Это называется ThreeTenABP. И убедитесь, что вы импортируете классы даты и времени из org.threeten.bp с подпакетами.

Ссылки

1 голос
/ 27 февраля 2020

Вот один способ, которым вы можете легко сделать это, используя LocalDateTime .

LocalDateTime instance1 = LocalDateTime.now();
//Do stuff
LocalDateTime instance2 = LocalDateTime.now();
long elapsedTimeInSeconds = instance1.until(instance2, ChronoUnit.SECONDS);
System.out.println(elapsedTimeInSeconds);

Поскольку у вас уже есть временная метка, предполагая, что она имеет форму строки, вы можете преобразовать ее в LocalDateTime, например, так:

String timestamp = "2012-08-15T22:56:02.038Z";
LocalDateTime instance = LocalDateTime.ofInstant(Instant.parse(timestamp), ZoneId.systemDefault());

Редактировать: Изменено LocalTime на LocalDateTime для исправления проблем с опрокидыванием в предыдущем решении.

...