【问题标题】:android.util.GregorianCalendar: will c.add(Calendar.DAY_OF_MONTH, 1) rollback or forward?android.util.GregorianCalendar:c.add(Calendar.DAY_OF_MONTH, 1) 会回滚还是向前?
【发布时间】:2016-07-16 03:42:26
【问题描述】:

如果日历在当月的最后一天(比如 7 月 31 日),将

c.add(Calendar.DAY_OF_MONTH, 1);

将 c 设置为同月的开始,即 7 月,还是将 c 提前到下个月的 8 月?

【问题讨论】:

    标签: java android wear-os android-calendar watchface


    【解决方案1】:

    查看超类 java.util.Calendar 的文档,在名为“Field Manipulation”的部分(强调我的):

    add(f, delta)delta 添加到字段f。这相当于调用set(f, get(f) + delta) 进行两次调整:

    添加规则 1。调用后字段f 的值减去调用前字段f 的值是delta,以字段f 中发生的任何溢出为模。 溢出在字段值超出其范围时发生,因此,下一个较大的字段会增加或减少,并且字段值会调整回其范围内。 p>

    所以add(Calendar.DAY_OF_MONTH, 1) 将从 7 月 31 日更改为 8 月 1 日

    相比之下,文档继续:

    roll(f, delta)delta 添加到字段f 而不更改更大的字段。这相当于调用add(f, delta) 并进行以下调整:

    滚动规则较大的字段在调用后保持不变。较大的字段表示较大的时间单位。 DAY_OF_MONTH 是一个比 HOUR 更大的字段。

    所以roll(Calendar.DAY_OF_MONTH, 1) 将从 7 月 31 日更改为 7 月 1 日

    【讨论】:

    • 谢谢。也许缺少 repl 的 java 有一些优势。我从您的回复中学到了更多我会从测试中获得的信息。了解roll方法也很好。
    【解决方案2】:

    Calendar 对象中的月份从 0 开始。所以 1 表示二月。你知道 2 月的最后一天是 28 日,所以输出应该是 3 月 2 日。

    0 = January = Calendar.JANUARY
    1 = february = Calendar.FEBRUARY
    

    所以

    Calendar calendar = new GregorianCalendar();
    
    int year       = calendar.get(Calendar.YEAR);
    int month      = calendar.get(Calendar.MONTH); 
    int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH); // Jan = 0, not 1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-17
      • 1970-01-01
      • 2012-07-28
      • 1970-01-01
      • 2016-05-25
      • 1970-01-01
      • 2015-02-02
      相关资源
      最近更新 更多