在Java'中,Calendar.WEEK OF_MONTH和Calendar.DAY OF_WEEK IN_MONTH之间有什么区别;什么是日历课?

在Java'中,Calendar.WEEK OF_MONTH和Calendar.DAY OF_WEEK IN_MONTH之间有什么区别;什么是日历课?,java,calendar,Java,Calendar,Java的Calendar类提供了两个字段:月中的周和月中的周中的日。有人能给我解释一下区别吗?使用以下代码进行测试时,它们似乎都返回相同的值: Calendar date = Calendar.getInstance(); date.set(2011,5,29); int weekNo1 = date.get(Calendar.WEEK_OF_MONTH); int weekNo2 = date.get(Calendar.DAY_OF_WEEK_IN_MONTH); 月周是指从星期日开始的当

Java的Calendar类提供了两个字段:月中的周和月中的周中的日。有人能给我解释一下区别吗?使用以下代码进行测试时,它们似乎都返回相同的值:

Calendar date = Calendar.getInstance();
date.set(2011,5,29);
int weekNo1 = date.get(Calendar.WEEK_OF_MONTH);
int weekNo2 = date.get(Calendar.DAY_OF_WEEK_IN_MONTH);

月周是指从星期日开始的当月内的一周有多少周


一周中的第五天是星期四、星期日等。

我发现所有其他文档都很混乱,因此对于像我这样的任何Microsoft开发人员来说,这一天对您来说可能很清楚,就像对我一样:


一个常数,表示给定一天发生多少次的值 发生在本月


不同之处在于,月内的周内的周内的日提供了该月内工作日发生的次数,而月内的周仅返回当前月内的周数。这样想吧,如果这个月从星期三开始,那么第一个星期一将出现在这个月的第二周。该星期一的“周中的天”的值为1,而“月中的周”的值为2。

  • Calendar.WEEK\u OF\u MONTH
    只需返回“当前月份的当前周数”
  • 日历。每周的第几天
    只需返回“从上周日开始的本周的当前天数”
  • 日历。如果当前日期为每月第N天,则返回“如果今天是本月第3个星期三,则返回
所以我在2016年12月21日写下这篇文章:

这就是我得到的:

Calendar today = Calendar.getInstance();
System.out.println(today.get(Calendar.DAY_OF_WEEK));          //outputs 4, as today is 4th day in this week which started on 18
System.out.println(today.get(Calendar.DAY_OF_WEEK_IN_MONTH)); //outputs 3, as today is "3rd Wednesday of this month". Earlier two wednesday were on 7th and 14th
System.out.println(today.get(Calendar.WEEK_OF_MONTH));        //outputs 4, as currently 4th week of a month is running

您还必须考虑Calendar.getInstance依赖于语言环境。因此,有时您可能需要指定一个具体的语言环境,而不是默认的语言环境,例如:Calendar.getInstance(newlocale(“es”,“PE”)

太长了,读不下去了,例如,Apbe,Calase.GETSimple(新的区域设置(“ES”),“PE”)日历将考虑周一的第一天,在其他区域可能是其他天< /P> TL;DR。

  • Calendar.周/月
    • 过时,切勿使用
      日历
    • 是指一个月内的第n周,其定义因
      区域设置和结果而异
    • 如果要将一周定义为每月的一周,则使用:
      LocalDate::get(ChronoField.ALIGNED\u week\u of\u month)
  • 日历。一周中的第几天,一个月中的第几天
    • 过时,切勿使用
      日历
    • 指该月内一周的第n天,如第2个星期二,其中周定义为包含该月第1天的第1周
    • 替换为
      LocalDate::get(ChronoField.ALIGNED\u DAY\u OF\u WEEK\u IN\u MONTH)
避免
Calendar
legacy类 请注意,问题中使用的
Calendar
类非常糟糕,多年前被中定义的现代java.time类所取代。不要使用
Calendar
gregorianalendar
。它们是由不懂日期-时间处理的人设计的

java.time
LocalDate
该类表示一个只包含日期的值,不包含一天中的时间,也不包含或

转换 如果给定的
Calendar
对象实际上是
GregoriaCalendar
,则可以轻松转换为现代
ZoneDateTime
对象

GregorianCalendar gc = ( GregorianCalendar ) myCalendar ;  // Cast from more general class to the concrete class underlying.
ZonedDateTime zdt = gc.toZonedDateTime() ;
提取仅日期部分

LocalDate ld = zdt.toLocalDate() ;  // Extract the date, omitting the time-of-day and the context of a time zone.
ChronoField
您可以使用各种枚举对象通过
get
方法查询
LocalDate
对象

这会询问每月的一周。但是如何定义每月的一周?不幸的是,
日历
类的定义因
区域设置
而异。因此,您的结果在运行时可能会有所不同

如果您的定义是第1周为日历月的第一天,则可以使用询问
LocalDate

这意味着一个月中的第n天,如第二个星期二或第三个星期四。与
日历不同,此定义不随
地区的不同而变化。week#1是包含第1个月的一天的一周。这个遗留的
日历
类确实非常混乱、混乱和不一致。很好的摆脱。

现在在java.time中,改用


文档对此做了很好的解释。对于Unix开发人员来说,Sun/Oracle关于这个主题的文档也很混乱;-)“一个月内某一天发生了多少次。”解释了一切。谢谢。
WEEK OF u_月
取决于一周的第一天。不是所有日历都有星期天作为一周的开始。例如,法国将星期一作为一周的第一天。这个答案完全不正确。
day OF u周_IN_月
是“工作日在一个月内发生的次数”,正如@user3096406在下面提到的。令人敬畏的解释这个答案得到了我的投票,因为它提供了一个直观的例子。不,这一点并不特别正确。引用JavaDoc:“与月的周和年的周不同,这个字段的值不依赖于getFirstDayOfWeek()或getMinimalDaysInFirstWeek()第1个月的第1天到第7天总是与第1个月的第1周的第1天相对应;第8天到第14天总是与第2个月的第1周的第1天相对应,依此类推。“Basil Bourque,我从来没有提到过日历。第2个月的第1天,我只是注意到日历依赖于LocaleB,但这个问题是关于
日历。第2个月的第1周的第2天
LocalDate ld = zdt.toLocalDate() ;  // Extract the date, omitting the time-of-day and the context of a time zone.
int weekOfMonth = ld.get( ChronoField.ALIGNED_WEEK_OF_MONTH ) ;
DayOfWeek dow = ld.getDayOfMonth() ;  // Get enum object representing day of week such as `DayOfWeek.MONDAY`. 
int nthDayOfWeekOfMonth = ld.get( ChronoField.ALIGNED_DAY_OF_WEEK_IN_MONTH ) ;