Java 如何获取Firebase时间戳与当前时间之间的小时数?
我正在开发一款具有“任务”功能的应用程序。在任务中,用户必须完成多个可用任务。一旦任务完成,我想禁用该任务15小时。我使用Firebase存储数据,我将“时间戳”存储为每个“任务”的子级。每次任务完成时,“时间戳”都会更新。现在,当用户在应用程序中打开“任务”屏幕时,我想检查每个任务,是否距离上次完成任务已经15小时了。我似乎不知道如何获得“时间戳”和当前时间之间的小时数。我只需要一个提示/指示。非常感谢您的帮助。当您在firebase上发送时间戳时,您将发送时间毫秒。 当您有当前时间戳和firebase的一个时间戳时。然后你可以很容易地计算出这两者之间的时间差Java 如何获取Firebase时间戳与当前时间之间的小时数?,java,android,firebase,time,Java,Android,Firebase,Time,我正在开发一款具有“任务”功能的应用程序。在任务中,用户必须完成多个可用任务。一旦任务完成,我想禁用该任务15小时。我使用Firebase存储数据,我将“时间戳”存储为每个“任务”的子级。每次任务完成时,“时间戳”都会更新。现在,当用户在应用程序中打开“任务”屏幕时,我想检查每个任务,是否距离上次完成任务已经15小时了。我似乎不知道如何获得“时间戳”和当前时间之间的小时数。我只需要一个提示/指示。非常感谢您的帮助。当您在firebase上发送时间戳时,您将发送时间毫秒。 当您有当前时间戳和fir
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日期和时间APIjava.time
。当你将ThreeTanABP添加到你的Android项目中时,你可以在不到全新的Android设备上使用它
链接
- 解释如何使用
java.time
- ,其中首先描述了
java.time
- ,java.time的后端口到Java6和Java7(JSR-310为三十)
- ,Android版Three Ten Backport
- ,解释得非常透彻
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日期和时间APIjava.time
。当你将ThreeTanABP添加到你的Android项目中时,你可以在不到全新的Android设备上使用它
链接
- 解释如何使用
java.time
- ,其中首先描述了
java.time
- ,java.time的后端口到Java6和Java7(JSR-310为三十)
- ,Android版Three Ten Backport
- ,解释得非常透彻
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,但谷歌搜索表明FirebaseTIMESTAMP
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类进行此类工作
请注意,使用这些类可以使您的代码更加清晰,并且更加自我记录 java.time 虽然我不使用Firebase,但谷歌搜索表明FirebaseDuration.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.
type是一个长整数,从UTC 1970年第一个时刻的Unix纪元(1970-01-01T00:00:00Z)算起,以毫秒为单位 现代java.time类使这项工作非常简单 将毫秒计数解析为一个TIMESTAMP
。该类表示时间轴上的一个瞬间,分辨率为(最多九(9)位小数) 捕捉当前时刻 顺便说一句,要记录这一时刻,请从中获取毫秒数 确定以对象表示的已用时间,以及与时间线无关的时间跨度瞬间
你的目标是将这段时间与15小时的目标进行比较Duration d = Duration.between( then , now ) ;
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