4

Calendar 类中的complete()方法执行以下操作:

protected void complete()

填写日历字段中任何未设置的字段。首先,如果尚未从日历字段值计算时间值(与 Epoch 的毫秒偏移量),则调用 computeTime() 方法。然后,调用 computeFields() 方法来计算所有日历字段值。

complete()方法具有以下代码:

protected void complete()
    {
        if (!isTimeSet)
        updateTime();
        if (!areFieldsSet || !areAllFieldsSet) {
            computeFields(); // fills in unset fields
            areAllFieldsSet = areFieldsSet = true;
        }
    }

我的问题是这个循环工作的意义是什么?第一个值来自

protected int[] fields

用于更新的值

long time 

使用computeTime()方法。然后使用 的值time来更新fieldsusing中的值computeFields()。在调用自身后两者中的值将保持同步,time对吗fieldscomputeTime()还是我在这里遗漏了什么?

对于那些可能会问为什么它如此重要的人,这是因为在日历中重新计算时间的顺序通常会改变我们从中获取的时间getTime()(或者我已经阅读过)!

4

2 回答 2

1

它不是圆形的。

想象一下,您有一个Calendar对象,其中设置了一些(但不是全部)字段。此方法将 (a)long time从设置的字段中计算并保存 epoch ( ) 然后 (b) 将所有未设置的字段设置为与其刚刚计算的 epoch 一致。

因此,当该方法完成时,您将拥有一个Calendar所有字段都已填写且一致。这是从您开始的对象的不同、更好的状态。

于 2012-05-18T11:39:33.353 回答
1

Quantum 说的很对。。再补充一点,你不能直接从可用字段中计算缺失字段的值,你必须经历计算时间值然后从那个值中填充缺失字段的过程.

于 2012-05-18T11:48:38.260 回答