像
@Ole V.V. explained
例如,ISO-8601标准考虑:
月份分为多个时段,每个时段从定义的一周的第一天开始。同一个月的最早时间段称为周
0
如果少于最小天数和周数
1
如果它至少有最少的天数。
根据您如何定义它们,您可以得到不同的结果。考虑2017年7月的日历:
July 2017
Su Mo Tu We Th Fr Sa
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
如果我们考虑ISO的定义,我们有:
-
第0周-2017-07-01至2017-07.02
-
-
第2周:2017-07-10至2017-07.16
-
-
第4周:2017-07-23至2017-07.30
-
第5周:2017-07-31
-
第1周:2017-07-01
-
-
第3周:2017-07-09至2017-07.15
-
第4周:2017年7月16日至2017年07月21日
-
第5周:2017年7月22日至2017年07月29日
-
Calendar
已经发布了,我将使用新的API编写一个。如果您正在使用
,考虑使用
new java.time API
.这更容易,
less bugged and less error-prone than the old APIs
Java<=7.
,您可以使用
ThreeTen Backport
,是Java 8新的日期/时间类的一个很好的后台端口。对于
安卓
,这是
ThreeTenABP
here
下面的代码适用于这两种情况。
唯一的区别是
包名称
(在Java 8中
java.time
在ThreeTen Backport(或Android的ThreeTenABP)中
org.threeten.bp
),但类和方法
都是一样的。
我正在使用
DateTimeFormatter
LocalDate
(包含日/月/年字段)。我也在使用
WeekFields
类,可以将其配置为使用不同的周定义(第一天和第一周的最小天数)
public LocalDate getDate(int weekOfMonth, int dayOfWeek, int month, int year) {
// you can customize your week definition (first day of week and mininum days in first week)
WeekFields wf = WeekFields.of(DayOfWeek.SUNDAY, 2);
DateTimeFormatter fmt = new DateTimeFormatterBuilder()
// week of month, using week definition from WeekFields
.appendValue(wf.weekOfMonth()).appendPattern(" ")
// day of week
.appendValue(ChronoField.DAY_OF_WEEK)
// month and year
.appendPattern(" M/yyyy")
// create formatter
.toFormatter();
return LocalDate.parse(weekOfMonth + " " +
// Sunday is 0, adjusting value
(dayOfWeek == 0 ? 7 : dayOfWeek) + " " + month + "/" + year, fmt);
}
使用此代码(一周从周日开始,需要将2天视为第一周-否则,如上面的第一个示例所示,一周将为零):
LocalDate d = getDate(1, 6, 7, 2017);
d
2017-07-08
(2017年7月1日星期六)。
如果要使用ISO 8601定义,请使用常量
WeekFields.ISO
而不是使用
WeekFields.of()
方法
@Ole V.V. suggested in the comments
,也可以在不创建格式化程序的情况下完成:获取第一个
dayOfWeek
并将其调整到所需的
weekOfMonth
:
public LocalDate getDate(int weekOfMonth, int dayOfWeek, int month, int year) {
// you can customize your week definition (first day of week and mininum days in first week)
WeekFields wf = WeekFields.of(DayOfWeek.SUNDAY, 2);
// Sunday is 0, adjusting value
DayOfWeek dow = DayOfWeek.of(dayOfWeek == 0 ? 7 : dayOfWeek);
// get the first weekday of the month
LocalDate first = LocalDate.of(year, month, 1).with(TemporalAdjusters.nextOrSame(dow));
// check in which week this date is
int week = first.get(wf.weekOfMonth());
// adjust to weekOfMonth
return first.plusWeeks(weekOfMonth - week);
}
PS:
日历
通过这些方法也具有类似的配置
setFirstDayOfWeek()
和
setMinimalDaysInFirstWeek()
get
方法。