533 @Override |
533 @Override |
534 public <R extends Temporal> R adjustInto(R temporal, long newValue) { |
534 public <R extends Temporal> R adjustInto(R temporal, long newValue) { |
535 if (isSupportedBy(temporal) == false) { |
535 if (isSupportedBy(temporal) == false) { |
536 throw new UnsupportedTemporalTypeException("Unsupported field: WeekBasedYear"); |
536 throw new UnsupportedTemporalTypeException("Unsupported field: WeekBasedYear"); |
537 } |
537 } |
538 int newVal = range().checkValidIntValue(newValue, WEEK_BASED_YEAR); // strict check |
538 int newWby = range().checkValidIntValue(newValue, WEEK_BASED_YEAR); // strict check |
539 LocalDate date = LocalDate.from(temporal); |
539 LocalDate date = LocalDate.from(temporal); |
|
540 int dow = date.get(DAY_OF_WEEK); |
540 int week = getWeek(date); |
541 int week = getWeek(date); |
541 date = date.withDayOfYear(180).withYear(newVal).with(WEEK_OF_WEEK_BASED_YEAR, week); |
542 if (week == 53 && getWeekRange(newWby) == 52) { |
542 return (R) date.with(date); |
543 week = 52; |
|
544 } |
|
545 LocalDate resolved = LocalDate.of(newWby, 1, 4); // 4th is guaranteed to be in week one |
|
546 int days = (dow - resolved.get(DAY_OF_WEEK)) + ((week - 1) * 7); |
|
547 resolved = resolved.plusDays(days); |
|
548 return (R) temporal.with(resolved); |
543 } |
549 } |
544 @Override |
550 @Override |
545 public String toString() { |
551 public String toString() { |
546 return "WeekBasedYear"; |
552 return "WeekBasedYear"; |
547 } |
553 } |
575 } |
581 } |
576 } |
582 } |
577 |
583 |
578 private static ValueRange getWeekRange(LocalDate date) { |
584 private static ValueRange getWeekRange(LocalDate date) { |
579 int wby = getWeekBasedYear(date); |
585 int wby = getWeekBasedYear(date); |
580 date = date.withDayOfYear(1).withYear(wby); |
586 return ValueRange.of(1, getWeekRange(wby)); |
|
587 } |
|
588 |
|
589 private static int getWeekRange(int wby) { |
|
590 LocalDate date = LocalDate.of(wby, 1, 1); |
581 // 53 weeks if standard year starts on Thursday, or Wed in a leap year |
591 // 53 weeks if standard year starts on Thursday, or Wed in a leap year |
582 if (date.getDayOfWeek() == THURSDAY || (date.getDayOfWeek() == WEDNESDAY && date.isLeapYear())) { |
592 if (date.getDayOfWeek() == THURSDAY || (date.getDayOfWeek() == WEDNESDAY && date.isLeapYear())) { |
583 return ValueRange.of(1, 53); |
593 return 53; |
584 } |
594 } |
585 return ValueRange.of(1, 52); |
595 return 52; |
586 } |
596 } |
587 |
597 |
588 private static int getWeek(LocalDate date) { |
598 private static int getWeek(LocalDate date) { |
589 int dow0 = date.getDayOfWeek().ordinal(); |
599 int dow0 = date.getDayOfWeek().ordinal(); |
590 int doy0 = date.getDayOfYear() - 1; |
600 int doy0 = date.getDayOfYear() - 1; |