【发布时间】:2017-06-26 03:25:37
【问题描述】:
我正在使用 JodaTime 为 android 应用程序实现倒数计时器。 根据设备的不同,输出是不同的。
DateTime openingDateTime = new DateTime(2018, DateTimeConstants.JUNE, 14, 21, 0, 0, DateTimeZone.forID("Europe/Moscow"));
DateTime nowDateTime = DateTime.now(DateTimeZone.forID("Europe/Moscow"));
long difference = openingDateTime.getMillis() - nowDateTime.getMillis();
(...)
onTick(difference);
(...)
PeriodFormatter periodFormatter = new PeriodFormatterBuilder()
.printZeroAlways()
.appendDays().appendSuffix(" day", " days")
.appendSeparator(" ")
.appendHours()
.appendSeparator(":")
.appendMinutes()
.appendSeparator(":")
.appendSeconds()
.toFormatter();
(...)
@Override
public void onTick(long millisUntilFinished) {
Duration duration = new Duration(millisUntilFinished);
Period period = duration.toPeriod(PeriodType.dayTime());
tvCounter.setText(periodFormatter.print(period));
}
单机输出正确:491 days 4:39:18 另一方面是错误的:0 天 11788:49:11。 我做错了什么?
【问题讨论】:
-
也许您的设备上有不同版本的 Joda-Time。无论如何,我只能重现您的第二个(错误)示例,javadoc 说:“只会使用句点类型中的精确字段。最多是小时、分钟、秒和毫秒”
-
为什么不简单地使用
Period p = new Period(nowDateTime, openingDateTime, PeriodType.dayTime());而不是这种有损的毫秒转换? -
@MenoHochschild Joda-Time 的版本是相同的。我不知道为什么,但 Joda 必须使用与我的解决方案相关的某种信息的内部 android 实现。
-
@MenoHochschild 你说得对,在这种情况下我必须忘记默认的 long millisUntilFinished 参数(它来自 CountDownTimer android SDK 解决方案)并使用简单的 Period(DateTime, DateTime, PerdiodType)
-
@MenoHochschild 你说得对,更改默认区域会影响输出。
标签: android jodatime duration period periodformatter