【问题标题】:Calendar Get Next Month日历获取下个月
【发布时间】:2014-10-01 21:12:02
【问题描述】:
Calendar c = Calendar.getInstance();
c.set(Calendar.MONTH, Calendar.OCTOBER);
c.set(Calendar.DAY_OF_MONTH, 31);
c.set(Calendar.MONTH, c.get(Calendar.MONTH)+1); //Returns Dec 1. Expect Nov 30.

如果我有一个日历对象,并且一个月的最后一天在 31 号,而下个月的天数比上个月的天数少,我如何确保通过将月份提前设置不会超过下个月?

【问题讨论】:

  • 使用 add() 代替 set() 可能更好
  • 添加返回相同的结果。我知道日历反应正常,但在我的具体情况下,我希望日期不超过实际的下个月,即使这意味着返回一个月中的不同日期。
  • @ryandlf 表示你想要下个月的最后一个日期?
  • c.add(Calendar.MONTH, 1); 我得到了 11 月 30 日
  • 你是对的。我又试了一次,它按预期工作。

标签: java calendar


【解决方案1】:

使用add() 而不是set(),因为日历“智能”足以确定天数之差等等......

public static void main(String[] args) throws Exception {
    Calendar c = Calendar.getInstance();
    c.set(Calendar.MONTH, Calendar.OCTOBER);
    c.set(Calendar.DAY_OF_MONTH, 31);
    c.add(Calendar.MONTH, 1);
    System.out.println(c.getTime());
}

输出(截至我目前的运行):

Sun Nov 30 09:08:01 EST 2014

【讨论】:

    【解决方案2】:

    根据Calendar JavaDocs

    宽大处理

    日历有两种解释日历字段的模式,宽松的 并且不宽容。当日历处于宽松模式时,它接受一个 比它产生的更广泛的日历字段值。当一个日历 重新计算由 get() 返回的日历字段值,所有 日历字段已标准化。例如,一个宽容的 GregorianCalendar 将 MONTH == JANUARY, DAY_OF_MONTH == 32 解释为 2 月 1 日。

    这意味着当您将 MONTH 加 1 时,DAY_OF_MONTH 的值仍然是 31。但是 11 月没有第 31 天。这意味着如果您使用的日历是宽松的,它会将 MONTH == 11, DAY_OF_MONTH == 31 解释为 12 月 1 日。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多