Java 什么';在日历对象中添加月日或年日有什么区别?

Java 什么';在日历对象中添加月日或年日有什么区别?,java,datetime,Java,Datetime,我想把某个日期增加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); 或 还有其他的“DAY”常量,但是我使用上面两种方法将DAY增加1,得

我想把某个日期增加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);


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

出于您的目的,请使用
Calendar.DATE
。在您的例子中,这三个常量是同义词

DAY_OF_YEAR
get和set字段编号,指示当前年份内的天数

DAY_OF_MONTH
get和set的字段号,指示月份的日期。这是日期的同义词


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

添加它实际上没有什么区别,但是

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

28
363

调用add时没有任何区别。但是,getter返回不同的结果:D

来自
gregoriacalendar#add

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

实际上,根据您选择的字段类型,可能会有差异,也将有差异:

*

使用模式。

对Ad()和Load()的行为进行激励,考虑 用户界面组件,带有用于 月、日和年,以及基本的GregoriaCalendar。如果 界面显示1999年1月31日,用户按月份 增量按钮,它应该读什么?如果基础 实现使用set(),可能是1999年3月3日。更好的 结果将于一九九九年二月二十八日公布。此外,如果用户按下 再次单击“月增量”按钮,其应为1999年3月31日,而不是 一九九九年三月二十八日。通过保存原始日期并使用add()或 roll(),根据是否应影响较大的字段 用户界面可以像大多数用户直观地期望的那样工作


在这两种情况下,你基本上把日期提前了一天。因此,这两种方法没有区别


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

除了日期之外,使用月日还是年日都没有任何区别。然而,当你得到呼叫获取者并通过其中一个时,这是有意义的

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

这里有一个列表,您可以添加或减去:

  • 是介于0和999之间的毫秒数

  • 是介于0和59之间的秒数

  • 是介于0和59之间的分钟数

  • 是介于0和11之间的小时数

  • 是介于0和23之间的小时数

  • 与一周相关的日期是否介于1和7之间

  • 与月份相关的日期是否介于1和31之间

  • 一年中的日期是否介于1和365之间

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

  • 是从1开始的一年中的一周吗

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

  • 是从1开始的年数

小时、天和周有多个字段,但选择哪个字段并不重要1。例如,使用-8表示每周的第几天将有效

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仅使用日历并不重要。添加,与其他操作相比,结果可能不同。

使用日期或月日都是相同的

区别如下:

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
资料来源:

tl;博士 2012-02-01

……或者

LocalDate.of( 2012 , 1 , 31 )  // Sane numbering: 1-12 for January-December, and `2012` means year 2012.
    .plusDays( 1 )
2012-02-01

java.time
Calendar
类令人困惑、笨拙且设计拙劣。它的许多问题包括传递单位标志的方法。幸运的是,您现在可以完全忘记这门课了

java 8及更高版本中内置的java.time类现在取代了传统的日期时间类

LocalDate
该类表示一个仅限日期的值,不包含一天中的时间和时区

时区对于确定日期至关重要。在任何一个特定的时刻,世界各地的日期都因地区而异。例如,中午夜后几分钟是新的一天,而中仍然是“昨天”

如果未指定时区,JVM将隐式应用其当前默认时区。该默认值可能随时更改,因此您的结果可能会有所不同。最好将所需/预期时区明确指定为参数

大陆/地区
的格式指定,例如,或
太平洋/奥克兰
。切勿使用3-4个字母的缩写,如
EST
IST
,因为它们不是真正的时区,也不是标准化的,甚至不是唯一的(!)

如果要使用JVM的当前默认时区,请请求它并将其作为参数传递。如果省略,则隐式应用JVM的当前默认值。最好是显式的,因为JVM中任何应用程序的任何线程中的任何代码都可能在运行时的任何时刻更改默认值

ZoneId z = ZoneId.systemDefault() ;  // Get JVM’s current default time zone.
或者指定一个日期。你可以用一个数字来设置月份,1-12月的数字为1-12

LocalDate ld = LocalDate.of( 1986 , 2 , 23 ) ;  // Years use sane direct numbering (1986 means year 1986). Months use sane numbering, 1-12 for January-December.
或者,最好使用预定义的枚举对象,一年中每个月一个。提示:在整个代码库中使用这些
Month
对象,而不仅仅是一个整数,这样可以使代码更加自我记录,确保有效值,并提供更高的可用性

部分 手持
LocalDate
,您可以查询其部分

要获取月日,即“日期”,如2018年1月23日起的
23

int dayOfMonth = ld.getDayOfMonth() ; // 1-31, depending on length of month.
要从1-365或闰年1-366获取一年中的第n天,请执行以下操作:

int dayOfYear = ld.getDayOfYear() ;
数学 增加或减少天数非常简单
LocalDate ld = LocalDate.of( 1986 , 2 , 23 ) ;  // Years use sane direct numbering (1986 means year 1986). Months use sane numbering, 1-12 for January-December.
LocalDate ld = LocalDate.of( 1986 , Month.FEBRUARY , 23 ) ;
int dayOfMonth = ld.getDayOfMonth() ; // 1-31, depending on length of month.
int dayOfYear = ld.getDayOfYear() ;
LocalDate dayLater = ld.plusDays( 1 ) ;
LocalDate tomorrow = LocalDate.now( ZoneId.of( "Africa/Tunis" ) ).plusDays( 1 ) ;
Period p = Period.ofDays( 1 ) ;
LocalDate dayLater = ld.plus( p ) ;
   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();
    }