Как я могу получить количество часов между Firebase TIMESTAMP и текущим временем? - PullRequest
0 голосов
/ 12 мая 2018

Я занимаюсь разработкой приложения с функцией «Задачи».В задачах пользователь должен выполнить несколько доступных задач.Когда задача будет выполнена, я хочу отключить ее на 15 часов.Я использую Firebase для хранения данных, я храню метку времени как дочерний элемент для каждой «задачи».«Метка времени» обновляется каждый раз, когда задача завершена.Теперь, когда пользователь открывает экран «Задачи» в приложении, я хочу проверить для каждой задачи, прошло ли 15 часов с момента ее последнего выполнения.Кажется, я не могу понять, как определить количество часов между «отметкой времени» и настоящим временем.Все, что мне нужно, это подсказка / направление.Любая помощь с благодарностью.

Ответы [ 3 ]

0 голосов
/ 14 мая 2018

Если ваша метка времени хранится как дата и время в формате UTC:

    LocalDateTime firebaseDateTimeInUtc = LocalDateTime.of(2018, Month.FEBRUARY, 9, 16, 30);
    long hours = ChronoUnit.HOURS.between(
            firebaseDateTimeInUtc.atOffset(ZoneOffset.UTC),
            OffsetDateTime.now(ZoneOffset.UTC));
    System.out.println(hours);

Запущено только что это напечатано

2246

Если вашотметка времени представляет собой строку в формате ISO 8601:

    String firebaseInstantString = "2018-02-09T16:29:46.789Z";
    long hours = ChronoUnit.HOURS.between(
            Instant.parse(firebaseInstantString), Instant.now());

Или, если вы храните миллисекунды с начала эпохи (это низкоуровневое значение):

    long firebaseTimestampMillis = 1_518_193_786_789L;
    long hours = TimeUnit.MILLISECONDS.toHours(
            System.currentTimeMillis() - firebaseTimestampMillis);

В первых двух фрагментах IЯ использую java.time, современный Java API даты и времени.Вы можете использовать его на новых устройствах Android, когда добавляете ThreeTanABP в свой проект Android.

Ссылки

0 голосов
/ 14 мая 2018

tl; dr

Используйте современные классы java.time для такой работы.

Duration.between(
    Instant.ofEpochMilli( firebaseMillis ) ,  // Parse count of milliseconds since 1970-01-01T00:00:00Z as a `Instant` object, a moment in UTC.
    Instant.now()                             // Capture the current moment in UTC.
)                                             // Returns a `Duration` object, a span of time unattached to the timeline.
.compareTo(                                   // The `compareTo` method implemented per the `java.lang.Comparable` interface.
    Duration.ofHours( 15 )                    // Specify your business rule of a fifteen hour limit.
)                                             // Returns an `int`, where zero means equal, over zero means greater-than, and under zero means lesser-than.
> 0                                           // Asking if our duration is over the limit of 15 hours. Returns a `boolean` primitive.

Обратите внимание, как использование этих классов делает ваш код понятным и более самостоятельным-documenting.

java.time

Хотя я не использую Firebase, поиск в Google указывает, что тип Firebase TIMESTAMP представляет собой длинное целое число миллисекунд, начиная с эпохи Unix первого момента 1970 года.в UTC, 1970-01-01T00: 00: 00Z.

Современные классы java.time делают эту работу довольно простой.

Считайте количество миллисекунд до Instant.Класс Instant представляет момент на временной шкале в UTC с разрешением наносекунд (до девяти (9) цифр десятичной дроби).

Instant then = Instant.ofEpochMilli( firebaseMillis ) ;

Захватить текущий момент в UTC .

Instant now = Instant.now() ;

Кстати, чтобы записать этот Instant момент, спроситедля подсчета миллисекунд с эпохи Unix .

long millisSinceEpoch = now.toEpochMilli() ;

Определите прошедшее время, представленное как объект Duration, промежуток времени, не связанный сграфик времени.

Duration d = Duration.between( then , now ) ;

Ваша цель состоит в том, чтобы сравнить этот промежуток времени с целью 15 часов.

Duration limit = Duration.ofHours( 15 ) ;
boolean isOverLimit = ( d.compareTo( limit ) > 0 ) ;  // positive means greater-than, zero means equal, and negative means less-than.

About java.time

Фреймворк java.time встроен в Java 8 и более поздние версии.Эти классы заменяют проблемные старые устаревшие классы даты и времени, такие как java.util.Date, Calendar, & SimpleDateFormat.

Проект Joda-Time , теперь в режиме обслуживания , рекомендует перейти на классы java.time .

Чтобы узнать больше, см. Oracle Tutorial .И поиск переполнения стека для многих примеров и объяснений.Спецификация: JSR 310 .

Вы можете обмениваться java.time объектами непосредственно с вашей базой данных.Используйте драйвер JDBC , совместимый с JDBC 4.2 или более поздней версии.Нет необходимости в строках, нет необходимости в java.sql.* классах.

Где получить классы java.time?

  • Java SE 8 , Java SE 9 , Java SE 10, а позже
    • Встроенный.
    • Часть стандартного Java API с встроенной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и Java SE 7
    • Большая часть функций java.time перенесена на Java 6 & 7 в ThreeTen-Backport .
  • Android
    • Более поздние версии реализации связки Android классов java.time.
    • Для более ранних версий Android (<26) проект <a href="https://github.com/JakeWharton/ThreeTenABP" rel="nofollow noreferrer"> ThreeTenABP адаптируется ThreeTen-Backport (упомянуто выше).См. Как использовать ThreeTenABP… .
0 голосов
/ 12 мая 2018

Когда вы отправляете метку времени в базе данных, то вы отправляете время миллис. Когда у вас есть текущая временная метка и одна временная метка пожарной базы. Тогда вы можете легко выяснить разницу во времени между этими двумя.

long mills = firebaseTimeStamp - System.currentTimeInMillis();
int hours = millis/(1000 * 60 * 60);
int mins = (mills/(1000*60)) % 60;

String diff = hours + ":" + mins; 

Вы можете получить текущее время в миллисекундах различными способами, такими как

    System.currentTimeMillis();
    Calendar.getInstance().getTimeInMillis();
    new Date().getTime();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...