Java 如何获取Firebase时间戳与当前时间之间的小时数?

Java 如何获取Firebase时间戳与当前时间之间的小时数?,java,android,firebase,time,Java,Android,Firebase,Time,我正在开发一款具有“任务”功能的应用程序。在任务中,用户必须完成多个可用任务。一旦任务完成,我想禁用该任务15小时。我使用Firebase存储数据,我将“时间戳”存储为每个“任务”的子级。每次任务完成时,“时间戳”都会更新。现在,当用户在应用程序中打开“任务”屏幕时,我想检查每个任务,是否距离上次完成任务已经15小时了。我似乎不知道如何获得“时间戳”和当前时间之间的小时数。我只需要一个提示/指示。非常感谢您的帮助。当您在firebase上发送时间戳时,您将发送时间毫秒。 当您有当前时间戳和fir

我正在开发一款具有“任务”功能的应用程序。在任务中,用户必须完成多个可用任务。一旦任务完成,我想禁用该任务15小时。我使用Firebase存储数据,我将“时间戳”存储为每个“任务”的子级。每次任务完成时,“时间戳”都会更新。现在,当用户在应用程序中打开“任务”屏幕时,我想检查每个任务,是否距离上次完成任务已经15小时了。我似乎不知道如何获得“时间戳”和当前时间之间的小时数。我只需要一个提示/指示。非常感谢您的帮助。

当您在firebase上发送时间戳时,您将发送时间毫秒。 当您有当前时间戳和firebase的一个时间戳时。然后你可以很容易地计算出这两者之间的时间差

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();

当您在firebase上发送时间戳时,则发送时间毫秒。 当您有当前时间戳和firebase的一个时间戳时。然后你可以很容易地计算出这两者之间的时间差

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();

如果时间戳存储为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());
或者,如果您正在存储自历元以来的毫秒数(这是低级的):

在前两段代码中,我使用的是现代java日期和时间API
java.time
。当你将ThreeTanABP添加到你的Android项目中时,你可以在不到全新的Android设备上使用它

链接
  • 解释如何使用
    java.time
  • ,其中首先描述了
    java.time
  • ,java.time的后端口到Java6和Java7(JSR-310为三十)
  • ,Android版Three Ten Backport
  • ,解释得非常透彻

如果您的时间戳存储为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());
或者,如果您正在存储自历元以来的毫秒数(这是低级的):

在前两段代码中,我使用的是现代java日期和时间API
java.time
。当你将ThreeTanABP添加到你的Android项目中时,你可以在不到全新的Android设备上使用它

链接
  • 解释如何使用
    java.time
  • ,其中首先描述了
    java.time
  • ,java.time的后端口到Java6和Java7(JSR-310为三十)
  • ,Android版Three Ten Backport
  • ,解释得非常透彻
tl;博士 使用现代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.
请注意,使用这些类可以使您的代码更加清晰,并且更加自我记录

java.time 虽然我不使用Firebase,但谷歌搜索表明Firebase
TIMESTAMP
type是一个长整数,从UTC 1970年第一个时刻的Unix纪元(1970-01-01T00:00:00Z)算起,以毫秒为单位

现代java.time类使这项工作非常简单

将毫秒数解析为
瞬间
。该类表示时间线上的一个时刻,分辨率为(小数点的九(9)位)

捕捉当前时刻

顺便说一句,要记录这一时刻,请从中获取毫秒数

确定以对象表示的已用时间,以及与时间线无关的时间跨度

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.

关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到类

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

您可以直接与数据库交换java.time对象。使用兼容的或更高版本。不需要字符串,也不需要
java.sql.*

从哪里获得java.time类

  • 然后
    • 内置的
    • 标准JavaAPI的一部分,带有捆绑实现
    • Java9添加了一些次要功能和修复
    • 大部分java.time功能都在中向后移植到Java6和Java7
    • 更高版本的Android捆绑包实现了java.time类
    • 对于早期的Android(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.
      
      请注意,使用这些类可以使您的代码更加清晰,并且更加自我记录

      java.time 虽然我不使用Firebase,但谷歌搜索表明Firebase
      TIMESTAMP
      type是一个长整数,从UTC 1970年第一个时刻的Unix纪元(1970-01-01T00:00:00Z)算起,以毫秒为单位

      现代java.time类使这项工作非常简单

      将毫秒计数解析为一个
      瞬间
      。该类表示时间轴上的一个瞬间,分辨率为(最多九(9)位小数)

      捕捉当前时刻

      顺便说一句,要记录这一时刻,请从中获取毫秒数

      确定以对象表示的已用时间,以及与时间线无关的时间跨度

      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.
      

      关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,如,&

      该项目现已启动,建议迁移到类

      要了解更多信息,请参阅.和搜索堆栈溢出以获取许多示例和解释。规范为

      您可以交换java.time