java - 如何获取 Firebase TIMESTAMP 和当前时间之间的小时数?
问题描述
我正在开发一个具有“任务”功能的应用程序。在任务中,用户必须完成几个可用的任务。任务完成后,我想禁用该任务 15 小时。我正在使用 Firebase 存储数据,我将“时间戳”存储为每个“任务”的子项。每次完成任务时都会更新“时间戳”。现在,当用户在应用程序中打开“任务”屏幕时,我想检查每个任务,如果它自上次完成以来已经 15 小时。我似乎无法弄清楚如何获得“时间戳”和当前时间之间的小时数。我需要的只是一个提示/方向。任何帮助是极大的赞赏。
解决方案
如果您的时间戳以 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);
在我使用的前两个片段中java.time
,现代 Java 日期和时间 API。当您将 ThreeTanABP 添加到您的 Android 项目时,您可以在不太新的 Android 设备上使用它。
链接
- Oracle 教程:日期时间解释如何使用
java.time
. - Java 规范请求 (JSR) 310,
java.time
第一次描述的地方。 - ThreeTen Backport 项目,
java.time
Java 6 和 7 的反向移植(ThreeTen for JSR-310)。 - ThreeTenABP , ThreeTen Backport 的 Android 版
- 问题:如何在Android项目中使用ThreeTenABP,有非常详尽的解释。
- 维基百科文章:ISO 8601
推荐阅读
- python - 循环遍历多个小的 Pandas 数据框并基于单个列创建摘要数据框
- python - 试图刮掉 coinmarketcap 并获得“无”
- redis - Redis 忽略 aof-use-rdb-preamble 是
- python - 如何根据另一个字符串值中的字符串值为一列分配字符串值?
- c++ - QCheckBox 和 QRadioButton 的 Qt Style-Sheet 伪状态中的字体设置
- python - 函数的时间复杂度
- python - 带有自定义 CSS 的 Plotly-Dash 中的列出现问题
- android - Android Retrofit OkHttpClient 拦截器添加标头获取错误“HTTP 403 Forbidden”
- php - PHPSpreadsheet 选择要在 HTML 中显示的特定工作表
- node.js - SequelizeUniqueConstraintError 创建方法只添加一行