【问题标题】:Joda time, Period from millisJoda 时间,从毫秒开始
【发布时间】:2012-01-15 19:30:28
【问题描述】:

我正在尝试使用“millis”构造函数设置我的 Period 对象,并相应地更新所有相关字段(年、月、周、日、小时、分钟、秒)

即使用如下代码:

mPeriod = new Period(millis, PeriodType.standard());

不会相应地填写所有相关字段。 只有几周和几分钟(对于1325965615539 的输入毫秒)

有人可以帮我解决这个问题吗?

【问题讨论】:

    标签: java jodatime


    【解决方案1】:

    您可以使用Period#normalizedStandard();对其进行标准化

    但是,Period 无法“填写所有相关字段”,因为它无法假设月数或年数的天数。它所能做的最好的事情就是将其转换为周、天和时间字段。

    Javadoc 涉及到这一点,但不是很详细:

    如果期间包含年或月,则月将为 归一化为 0 到 11 之间。days 字段及以下字段将是 必要时标准化,但是这个 不会溢出到 月字段。因此,1 年 15 个月的期间将正常化为 2 年 3 个月。但 1 个月 40 天的期间将保持为 1 个月 40 天。

    (强调我的)

    如果您需要将其标准化为年和月,则需要使用这些字段中的值构造 Period

    或者,您可以使用Duration

    1. 以毫秒为单位构造Duration
    2. 使用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
    

    请注意第二行标准化,但最多只有几周。

    【讨论】:

    • @DrorWeiss - 它可能有效果,但可能不是你所期望的。我更新了我的答案以澄清原因。
    猜你喜欢
    • 1970-01-01
    • 2013-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多