【发布时间】:2021-12-31 13:48:04
【问题描述】:
例如,我从服务器获取 UTC 日期
"endValidityDate": "2021-11-18T22:59:59Z"
我想知道从现在计算剩余天数的最佳方法是什么。
这是我现在得到的:
我从现在开始创建一个为期 2 天的日期:
DateTime.now().plusSeconds(172800)
我正在将其解析为 DateTimejoda,如果您这么说,我可以使用其他的。
当我在做不同的日子时,我是这样做的
val diff = endValidityDate.toDate().time - Date().time
val daysRemaining = TimeUnit.DAYS.convert(diff, TimeUnit.MILLISECONDS)
return if (daysRemaining > 1) "$daysRemaining days}"
else TimeUnit.DAYS.convert(diff, TimeUnit.SECONDS).toString()
我想要实现的场景是:
如果剩余天数超过一 (24 小时),则打印“剩余 2 天”,而不是显示“剩余 1 天”,然后添加一个计时器:
“0h 43m 3s”。
要做计时器,我只是用 now
减去剩余时间val expireDate = LocalDateTime.now()
.plusSeconds(uiState.endValidityDate.timeLeft.toLong())
.toEpochSecond(ZoneOffset.UTC)
val currentTime = LocalDateTime.now().toEpochSecond(ZoneOffset.UTC)
然后在每一秒发生的时候,我都会像这样打印它:
val duration = Duration.ofSeconds(it)
binding.myTextView.text = String.format(
"%02dh: %02dm: %02ds",
duration.seconds / 3600,
(duration.seconds % 3600) / 60,
duration.seconds % 60,
)
但我没有得到 2 天,我只是得到一个输出:
00h: 33m: 50s
所以,我在这里遇到了一些问题:
这是最佳解决方案吗?如果不能,您能否描述一个更好的方法来实现我的目标?
为什么我的计时器显示为00h: 13m: 813s?我是在错误地执行正则表达式还是因为 epochSeconds?
实现
在尝试将其打印到设备时,给定来自服务器的 UTC 日期,那么它应该遵循此规则。
1.- 如果剩余天数大于 1 天,则打印“剩余 N 天”
2.- 如果剩余天数
- 最少 1 位 (0h 2m 1s)
- 最多 2 位数字(1h 23m 3s)
注意:
我正在使用 Java 8 如果这是问题所在,我还可以更改倒计时的方式以使用 millis 而不是 epochSeconds。
【问题讨论】:
-
从Java 9开始就有
Duration.toMinutesPart(),如果你使用的Java版本低于9,你必须自己计算部分,比如duration.toMinutes() % 60或类似的。 -
你应该使用
toMinutesPart()和toSecondsPart()。 -
@deHaar 抱歉,我完全忘了提及我使用的是哪个 Java,我使用的是 Java 8。
-
@deHaar 我已经用数学的东西改变了它,但仍然没有按预期显示,可能是因为我使用的是纪元秒数?
标签: java android date kotlin datetime