首頁  >  問答  >  主體

java - Calendar的add方法中的DAY_OF_MONTH参数和DAY_OF_YEAR参数有什么区别?

比如,

calendar.add(Calendar.DAY_OF_MONTH, amount);
calendar.add(Calendar.DAY_OF_YEAR, amount);

如上,有何区别?

怪我咯怪我咯2717 天前441

全部回覆(1)我來回復

  • 黄舟

    黄舟2017-04-17 16:43:59

    簡單來說,沒差別。

    Calendar 類別的 add 方法是個抽象方法,在 JDK 中有三個類別實作了這個方法,分別是:

    • java.util.JapaneseImperialCalendar

    • java.util.GregorianCalendar

    • sun.util.BuddhistCalendar

    忽略第三個,只看前兩個實作類,有這麼一段程式碼:

    case DAY_OF_MONTH: // synonym of DATE
    case DAY_OF_YEAR:
    case DAY_OF_WEEK:
        break;
    

    粗看一下,break以後的執行分支並沒有針對這三種做區別處理。
    而且 amount 似乎沒有受第一個參數的範圍限制,例如呼叫:

    calendar.add(Calendar.DAY_OF_MONTH, 100);

    可以看到最終結果的 day_of_year 還是增加了100 天。

    這個方法的 API 中所描述的兩個規則可以解釋這種超過範圍情況:

    Add rule 1. The value of field after the call minus the value of field
    before the call is amount, modulo any overflow that has occurred in
    field. Overflow occurs when a field value excurred in
    field. Overflow occurs when a field value. the next larger field is incremented or decremented and the
    field value is adjusted back into its range.

    Add rule 2. If a smaller field is expected to be invariant, but it is
    impossible for it to be equal to its prior value because of jus in
    its to minimum or maxim after orheter leem.d, stedn be as close as possible to its expected value. A smaller
    field represents a smaller unit of time. HOUR is a smaller field than
    DAY_OF_MONTH. No adjustment ismaller to smal DAY_OF_MONTH。 s what fields
    are expected to be invariant.

    所以我覺得這兩個方法呼叫沒有差別,即便 amount 超出了 day_of_month 的範圍,這個方法也會正確處理。
    不過從可讀性考慮,還是用適當的參數比較好。

    回覆
    0
  • 取消回覆