61

我想将某个日期增加 1 天。我创建了一个日历对象,如:

Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, 2012);
cal.set(Calendar.MONTH, 0);
cal.set(Calendar.DAY_OF_MONTH, 31);

然后,为了增加 1 天,我可以做两件事:

cal.add(Calendar.DAY_OF_MONTH, 1);

或者

cal.add(Calendar.DAY_OF_YEAR, 1);

还有其他“DAY”常量,但我使用上述两种将日期增加 1 的方法得到了相同的结果。在这种情况下,我会得到两种不同的结果吗?

4

11 回答 11

60

添加它真的没有区别,但这

Calendar c = Calendar.getInstance();
System.out.println(c.get(Calendar.DAY_OF_MONTH));
System.out.println(c.get(Calendar.DAY_OF_YEAR));

印刷

28
363
于 2012-12-28T06:03:28.047 回答
28

Calendar.add根据日历的规则,在给定的日历字段中添加或减去指定的时间量。

在这里,您有一个可以添加或减去的日历字段列表:

  • MILLISECOND是 0 到 999 之间的毫秒数

  • SECOND是 0 到 59 之间的秒数

  • MINUTE是 0 到 59 之间的分钟数

  • HOUR是 0 到 11 之间的小时数

  • HOUR_OF_DAY是 0 到 23 之间的小时数

  • DAY_OF_WEEK是与 1 到 7 之间的星期相关的日期

  • DAY_OF_MONTH是与 1 到 31 之间的月份相关的日期

  • DAY_OF_YEAR是与 1 到 366 之间的年份相关的日期

  • WEEK_OF_MONTH是与从 1 开始的月份相关的周

  • WEEK_OF_YEAR是从 1 开始的与一年相关的周

  • MONTH是与年份相关的月份,介于 0 和 11 之间

  • YEAR是从 1 开始的年数

小时、天和周有多个字段,但您选择哪一个并不重要1。例如使用 -8DAY_OF_WEEK将起作用。

calendar.add(Calendar.DAY_OF_MONTH, -2); // subtract 2 days
calendar.add(Calendar.DAY_OF_WEEK, -2);  // subtract 2 days
calendar.add(Calendar.DAY_OF_YEAR, -2);  // subtract 2 days

calendar.add(Calendar.YEAR, -2);         // subtract 2 years

1使用没关系,使用其他操作结果可能会有所不同。Calendar.add

于 2017-04-05T09:56:12.280 回答
10

用于Calendar.DATE您的目的。在您的情况下,这三个常量是同义词。

于 2012-12-28T06:01:37.940 回答
8

调用 add 时没有任何区别。然而,吸气剂返回不同的结果:D

代码片段来自GregorianCalendar#add

case DAY_OF_MONTH: // synonym of DATE
 case DAY_OF_YEAR:
 case DAY_OF_WEEK:
    break;
于 2012-12-28T06:04:35.990 回答
7
DAY_OF_YEAR

get 和 set 字段编号,表示当年的天

DAY_OF_MONTH

get 和 set 的字段编号,指示月份中的哪一天。这是 DATE 的同义词

如果一天大于 31,您将看到差异。

于 2012-12-28T06:02:20.383 回答
2

在这两种情况下,您基本上都将日期提前了。所以这两种方法没有区别。

但是坚持使用单一方法将使您的代码库保持一致性,维护人员会感到宾至如归,并且运行时可能还会通过编译来优化方法调用。

于 2012-12-28T06:40:11.980 回答
1

实际上,根据您选择的字段类型,可能并且将会有所不同:

* http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Calendar.html

使用模式。

为了激发 add() 和 roll() 的行为,考虑一个带有月、日和年的递增和递减按钮的用户界面组件,以及一个底层的 GregorianCalendar。如果界面显示为 1999 年 1 月 31 日,用户按下月份增量按钮,应该显示什么?如果底层实现使用 set(),它可能显示为 1999 年 3 月 3 日。更好的结果是 1999 年 2 月 28 日。此外,如果用户再次按下月份增量按钮,它应该显示为 1999 年 3 月 31 日,而不是 3 月 28 日, 1999。通过保存原始日期并使用 add() 或 roll(),根据是否应该影响更大的字段,用户界面可以像大多数用户直观预期的那样运行。

于 2012-12-28T06:08:12.810 回答
1
于 2018-02-06T01:58:19.647 回答
0

除了日期之外,您使用 DAY_OF_MONTH 还是 DAY_OF_YEAR 没有任何区别。但是,当您获得 call getter 并通过其中一个时,这是有道理的。

于 2012-12-28T06:52:58.060 回答
0

使用 DATE 或 DAY_OF_MONTH 两者都相同

这是区别:

DATE or DAY_OF_MONTH : Get and Set indicating the day of the month
DAY_OF_WEEK          : get and set indicating the week number within the current month
DAY_OF_YEAR          : get and set indicating the day number within the current ye

来源:https ://docs.oracle.com/javase/7/docs/api/java/util/Calendar.html

于 2017-04-05T09:58:15.397 回答
0
   public static String findDay(int month, int day, int year) {
// Creating a calendar
  Calendar calndr = Calendar.getInstance();
     calndr.set(Calendar.MONTH, month-1);
     calndr.set(Calendar.YEAR, year);        
     calndr.set(Calendar.DAY_OF_MONTH, day);
     String[] strDays = new String[] { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday",
                "Friday", "Saturday" };
      return strDays[calndr.get(Calendar.DAY_OF_WEEK)-1].toUpperCase();
    }

}

于 2021-03-29T01:09:54.283 回答