--- a/jdk/src/share/classes/java/time/temporal/IsoFields.java Fri Apr 18 17:37:13 2014 -0400
+++ b/jdk/src/share/classes/java/time/temporal/IsoFields.java Sat Apr 12 14:54:44 2014 +0100
@@ -535,11 +535,17 @@
if (isSupportedBy(temporal) == false) {
throw new UnsupportedTemporalTypeException("Unsupported field: WeekBasedYear");
}
- int newVal = range().checkValidIntValue(newValue, WEEK_BASED_YEAR); // strict check
+ int newWby = range().checkValidIntValue(newValue, WEEK_BASED_YEAR); // strict check
LocalDate date = LocalDate.from(temporal);
+ int dow = date.get(DAY_OF_WEEK);
int week = getWeek(date);
- date = date.withDayOfYear(180).withYear(newVal).with(WEEK_OF_WEEK_BASED_YEAR, week);
- return (R) date.with(date);
+ if (week == 53 && getWeekRange(newWby) == 52) {
+ week = 52;
+ }
+ LocalDate resolved = LocalDate.of(newWby, 1, 4); // 4th is guaranteed to be in week one
+ int days = (dow - resolved.get(DAY_OF_WEEK)) + ((week - 1) * 7);
+ resolved = resolved.plusDays(days);
+ return (R) temporal.with(resolved);
}
@Override
public String toString() {
@@ -577,12 +583,16 @@
private static ValueRange getWeekRange(LocalDate date) {
int wby = getWeekBasedYear(date);
- date = date.withDayOfYear(1).withYear(wby);
+ return ValueRange.of(1, getWeekRange(wby));
+ }
+
+ private static int getWeekRange(int wby) {
+ LocalDate date = LocalDate.of(wby, 1, 1);
// 53 weeks if standard year starts on Thursday, or Wed in a leap year
if (date.getDayOfWeek() == THURSDAY || (date.getDayOfWeek() == WEDNESDAY && date.isLeapYear())) {
- return ValueRange.of(1, 53);
+ return 53;
}
- return ValueRange.of(1, 52);
+ return 52;
}
private static int getWeek(LocalDate date) {