gpt4 book ai didi

android - PeriodFormatter 在不同设备上的不同行为 (JodaTime)

转载 作者:搜寻专家 更新时间:2023-11-01 09:37:15 25 4
gpt4 key购买 nike

我正在使用 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 天 4:39:18另一方面是错误的:0 days 11788:49:11。我做错了什么?

最佳答案

感谢您的评论,我现在可以重现您的问题。只需将以下静态初始化程序添加到您的测试类(首先)以模拟您观察预期输出的设备:

static {
TimeZone.setDefault(TimeZone.getTimeZone("GMT"));
}

根据规范(另见 accepted answer on this SO-post),转换 duration.toPeriod(periodType) 应该只使用所谓的精确持续时间字段,即小时、分钟、秒和毫秒但不是几天。

我对Joda-Time(v2.9.6)源码的分析:

内部类org.joda.time.chrono.BasicChronology包含以下常量:

private static final DurationField cDaysField = new PreciseDurationField(DurationFieldType.days(), 86400000L);

所以我们看到这里这个持续时间字段被标记为“精确”,但是:子类 ZonedChronology 包装它并覆盖方法 isPrecise() 的行为:

public boolean isPrecise() { 
return iTimeField ? iField.isPrecise() : iField.isPrecise() && this.iZone.isFixed();
}

这显示了 days()-duration-field 的精度属性的额外区域依赖性,即对于像 UTC 这样的固定区域是精确的,否则是不精确的。

我不知道分析和观察到的行为是特性还是错误。比方说,期望 duration.toPeriod(...) 创建的 Period 对象与区域无关是很危险的。它是not documented there如果系统区域是固定的,则有一个精确的天组件。

不幸的是,对默认时区的隐式依赖通过其年表设计被深深地编码到 Joda-Time 中。 作为解决方法,您可以使用:

Period p = new Period(nowDateTime, openingDateTime, PeriodType.dayTime());

关于android - PeriodFormatter 在不同设备上的不同行为 (JodaTime),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42114339/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com