【发布时间】:2012-01-15 19:30:28
【问题描述】:
我正在尝试使用“millis”构造函数设置我的 Period 对象,并相应地更新所有相关字段(年、月、周、日、小时、分钟、秒)
即使用如下代码:
mPeriod = new Period(millis, PeriodType.standard());
不会相应地填写所有相关字段。
只有几周和几分钟(对于1325965615539 的输入毫秒)
有人可以帮我解决这个问题吗?
【问题讨论】:
我正在尝试使用“millis”构造函数设置我的 Period 对象,并相应地更新所有相关字段(年、月、周、日、小时、分钟、秒)
即使用如下代码:
mPeriod = new Period(millis, PeriodType.standard());
不会相应地填写所有相关字段。
只有几周和几分钟(对于1325965615539 的输入毫秒)
有人可以帮我解决这个问题吗?
【问题讨论】:
您可以使用Period#normalizedStandard();对其进行标准化
但是,Period 无法“填写所有相关字段”,因为它无法假设月数或年数的天数。它所能做的最好的事情就是将其转换为周、天和时间字段。
Javadoc 涉及到这一点,但不是很详细:
如果期间包含年或月,则月将为 归一化为 0 到 11 之间。days 字段及以下字段将是 必要时标准化,但是这个 不会溢出到 月字段。因此,1 年 15 个月的期间将正常化为 2 年 3 个月。但 1 个月 40 天的期间将保持为 1 个月 40 天。
(强调我的)
如果您需要将其标准化为年和月,则需要使用这些字段中的值构造 Period。
或者,您可以使用Duration:
Duration
使用Duration#toPeriodFrom(ReadableInstant) 创建一个在给定时刻开始的Period(例如新的DateTime())。根据文档,这应该可行:
这种转换将准确地确定一个时期的字段。这 结果是基于即时毫秒,的年表 瞬间,标准周期类型和持续时间的长度。
这是normalize() 应该对您的毫秒输入执行的操作:
import org.joda.time.Period;
class Normalize {
public static void main(String[] args) {
Period period = new Period(1325965615539L);
System.out.println(period);
System.out.println(period.normalizedStandard());
}
}
// outputs
PT368323H46M55.539S
P2192W2DT19H46M55.539S
请注意第二行已标准化,但最多只有几周。
【讨论】: