Search code examples
javadatedayofweekweek-numberlocaldate

Same day prevous year (previous year, same week and day of week)


I want to retrieve same day previous year.

e.g. today is 2019-03-30 that is year 2019, week 26(week of year), day 7 (day of week).

I need to construct LocalDate which is year 2018, week 26(week of year), day 7 (day of week).

I could not find from java.time package which can built LocalDate like this.


Solution

  • It seems like you want the previous year date with same week of year and day of week as the given date. Below code with give you that result.

    LocalDate currentLocalDate = LocalDate.now();
    int dayOfWeek = currentLocalDate.getDayOfWeek().getValue();
    int weekOfYear = currentLocalDate.get(ChronoField.ALIGNED_WEEK_OF_YEAR);
    LocalDate resultLocalDate = currentLocalDate
        .minusYears(1)
        .with(ChronoField.ALIGNED_WEEK_OF_YEAR, weekOfYear)
        .with(ChronoField.DAY_OF_WEEK, dayOfWeek);
    

    Full Example (live copy):

    import java.time.*;
    import java.time.format.*;
    import java.time.temporal.*;
    
    class Example
    {
        private static void showDateInfo(LocalDate ld) {
            int weekOfYear = ld.get(ChronoField.ALIGNED_WEEK_OF_YEAR);
            int dayOfWeek = ld.getDayOfWeek().getValue();
            System.out.println(ld.format(DateTimeFormatter.ISO_LOCAL_DATE) + " is week " + weekOfYear + ", day " + dayOfWeek);
        }
        public static void main (String[] args) throws java.lang.Exception
        {
            LocalDate currentLocalDate = LocalDate.of(2019, 6, 30);
            showDateInfo(currentLocalDate);
            int dayOfWeek = currentLocalDate.getDayOfWeek().getValue();
            int weekOfYear = currentLocalDate.get(ChronoField.ALIGNED_WEEK_OF_YEAR);
            LocalDate resultLocalDate = currentLocalDate
                .minusYears(1)
                .with(ChronoField.ALIGNED_WEEK_OF_YEAR, weekOfYear)
                .with(ChronoField.DAY_OF_WEEK, dayOfWeek);
            showDateInfo(resultLocalDate);
        }
    }
    

    Output:

    2019-06-30 is week 26, day 7
    2018-07-01 is week 26, day 7