jdk/src/share/classes/java/time/temporal/IsoFields.java
changeset 24032 a25d367576e8
parent 20873 e91d5b1cb8e6
child 24256 da9a41004459
equal deleted inserted replaced
24031:aa920ff15013 24032:a25d367576e8
   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;