๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

ํ”„๋กœ์ ํŠธ/๊ณ ๋ฏผ ์ƒ๋‹ด ํ”Œ๋žซํผ

ISO 8601 ๊ธฐ์ค€์œผ๋กœ ํŠน์ • ๋‚ ์งœ์˜ N์›” N์ฃผ์ฐจ๋ฅผ Java 8 ๋‚ ์งœ API๋กœ ๊ตฌํ•˜๊ธฐ

ISO 8601 ๋ž€ ?

ISO 8601์€ ๋‚ ์งœ์™€ ์‹œ๊ฐ„์— ๊ด€๋ จ๋œ ๊ตญ์ œ ํ‘œ์ค€์œผ๋กœ์จ, ์ •์˜๋œ ๋ฐ”์— ๋”ฐ๋ฅด๋ฉด ๋งค์ฃผ์˜ ์‹œ์ž‘์ผ์€ ์›”์š”์ผ์ด ๋ฉ๋‹ˆ๋‹ค.
๋˜ํ•œ, ๋งค์›”์˜ ์ฒซ ์ฃผ๋Š” ๊ณผ๋ฐ˜์ˆ˜ ์ด์ƒ์˜ ์š”์ผ์ด ํฌํ•จ๋œ ์ฃผ๊ฐ€ ๊ธฐ์ค€์ด ๋ฉ๋‹ˆ๋‹ค.
 

ISO 8601 ๊ธฐ์ค€์œผ๋กœ ์ฃผ์ฐจ ๊ณ„์‚ฐ ์˜ˆ์‹œ

2024๋…„ 12์›” ์˜ˆ์‹œ

  • 2024๋…„ 12์›” 30์ผ, 31์ผ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ทœ์น™์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.
    • 2025๋…„ 1์›” 1~5์ผ(์ด 5์ผ)์€ 7์ผ ์ค‘ ๊ณผ๋ฐ˜์ˆ˜๋ฅผ ๋„˜์œผ๋ฏ€๋กœ 1์›” 1์ฃผ์ฐจ์ž…๋‹ˆ๋‹ค
    • ๋”ฐ๋ผ์„œ, 2024๋…„ 12์›” 30์ผ, 31์ผ์€ 2025๋…„ 1์›” 1์ฃผ์ฐจ์— ํฌํ•จ๋ฉ๋‹ˆ๋‹ค

2024๋…„ 12์›” ๋‹ฌ๋ ฅ

12์›” 2์ผ ~ 12์›” 8์ผ -> 12์›” 1์ฃผ์ฐจ
12์›” 9์ผ ~ 12์›” 15์ผ -> 12์›” 2์ฃผ์ฐจ
12์›” 16์ผ ~ 12์›” 22์ผ -> 12์›” 3์ฃผ์ฐจ
12์›” 23์ผ ~ 12์›” 29์ผ -> 12์›” 4์ฃผ์ฐจ
12์›” 30์ผ ~ 1์›” 5์ผ -> 1์›” 1์ฃผ์ฐจ

 
2026๋…„ 12์›” ์˜ˆ์‹œ

  • 2027๋…„ 1์›”์˜ ์ฒซ ์ฃผ๋Š” 1~3์ผ(์ด 3์ผ)๋กœ ๊ตฌ์„ฑ๋˜๋ฉฐ, ์ด๋Š” 7์ผ ์ค‘ ๊ณผ๋ฐ˜์ˆ˜๊ฐ€ ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ 12์›” 5์ฃผ์ฐจ์— ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
  • ๊ทธ๋ž˜์„œ, 12์›” 28์ผ ~ 1์›” 3์ผ๊นŒ์ง€๋Š” 12์›” 5์ฃผ์ฐจ์ด๋ฉฐ 1์›” 4์ผ(์›”์š”์ผ)๋ถ€ํ„ฐ 1์›” 1์ฃผ์ฐจ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

2026๋…„ 12์›” ๋‹ฌ๋ ฅ

 
 

ํŠน์ • ๋‚ ์งœ์˜ N์›” N์ฃผ์ฐจ ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•

ISO 8601 ๊ธฐ์ค€์—์„œ ๋งค์ฃผ ์›”์š”์ผ์ด ์‹œ์ž‘์ผ, ์ผ์š”์ผ์ด ๋งˆ์ง€๋ง‰ ๋‚ ๋กœ ๊ณ ์ •๋ฉ๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ, ํŠน์ • ๋‚ ์งœ๊ฐ€ ํฌํ•จ๋œ ์ฃผ์˜ ์ค‘๊ฐ„์ผ(๋ชฉ์š”์ผ)์ด ์–ด๋–ค ๋‹ฌ์— ์†ํ•˜๋Š”์ง€ ์•Œ๋ฉด ํŠน์ • ๋‚ ์งœ์˜ ์ฃผ์ฐจ๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ์ฃผ์˜ ์ค‘๊ฐ„์ผ(๋ชฉ์š”์ผ)์ด ํ•ด๋‹น ์›”์— ์†ํ•˜๋ฉด ๊ทธ ์ฃผ๋Š” ํ•ด๋‹น ์›”์˜ ๋งˆ์ง€๋ง‰ ์ฃผ์ฐจ๋กœ ํŒ๋‹จํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฐ˜๋Œ€๋กœ ์ค‘๊ฐ„์ผ(๋ชฉ์š”์ผ)์ด ๋‹ค์Œ ์›”์— ์†ํ•˜๋ฉด ๊ทธ ์ฃผ๋Š” ๋‹ค์Œ ์›”์˜ ์ฒซ ์ฃผ์ฐจ๋กœ ํŒ๋‹จํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ, ๋ช‡์›” ๋ช‡์ฃผ์ฐจ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ตฌํ–ˆ์Šต๋‹ˆ๋‹ค.
 
1. ํŠน์ • ๋‚ ์งœ๊ฐ€ ํฌํ•จ๋œ ์ฃผ์˜ ์›”์š”์ผ ๊ตฌํ•˜๊ธฐ

  • TemporalAdjusters.previousOrSame()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น ์ฃผ์˜ ์›”์š”์ผ(LocalDate)์„ ๊ตฌํ•ฉ๋‹ˆ๋‹ค.

2. ์ค‘๊ฐ„์ผ(๋ชฉ์š”์ผ) ๊ตฌํ•˜๊ธฐ

  • ๊ตฌํ•œ ์›”์š”์ผ์— plusDays(3)๋ฅผ ๋”ํ•ด ์ค‘๊ฐ„์ผ(๋ชฉ์š”์ผ)์„ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.

3. ์ค‘๊ฐ„์ผ(๋ชฉ์š”์ผ)์— ํ•ด๋‹นํ•˜๋Š” ์›” ํ™•์ธํ•˜๊ธฐ

  • LocalDate.getMonthValue()๋กœ ์ค‘๊ฐ„์ผ์˜ ์›”์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

4. ์ค‘๊ฐ„์ผ์ด ISO ๊ธฐ์ค€ ๋ช‡ ์ฃผ์ฐจ์ธ์ง€ ํ™•์ธ

  • WeekFields.ISO.weekOfMonth()๋ฅผ ์‚ฌ์šฉํ•ด ISO ๊ธฐ์ค€ ์ฃผ์ฐจ๋ฅผ ๊ตฌํ•ฉ๋‹ˆ๋‹ค.
  • WeekFields.ISO๋Š” WeekFields.of(DayOfWeek.MONDAY, 4)๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ „์ฒด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

@DisplayName("2024๋…„ 12์›” 31์ผ์€ ISO ๊ธฐ์ค€์œผ๋กœ 1์›” 1์ฃผ์ฐจ์ด๋‹ค.")
@Test
void ISO_๊ธฐ์ค€์œผ๋กœ_ํŠน์ •๋‚ ์งœ์—๋Œ€ํ•ด_๋ช‡์›”_๋ช‡์ฃผ์ฐจ๋ฅผ_๊ตฌํ•œ๋‹ค() {
    // given
    LocalDate target = LocalDate.of(2024, 12, 31);
    LocalDate startOfWeek = target.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY)); // ํ•ด๋‹น ์ฃผ ์›”์š”์ผ
    LocalDate endOfWeek = target.with(TemporalAdjusters.nextOrSame(DayOfWeek.SUNDAY)); // ํ•ด๋‹น ์ฃผ ์ผ์š”์ผ
    LocalDate middleOfWeek = startOfWeek.plusDays(3);  // ํ•ด๋‹น ์ฃผ์˜ ์ค‘๊ฐ„์ผ

    // when
    int monthValue = middleOfWeek.getMonthValue();
    int isoWeekValue = middleOfWeek.get(WeekFields.ISO.weekOfMonth());

    //then
    Assertions.assertThat(startOfWeek).isEqualTo(LocalDate.of(2024, 12, 30));
    Assertions.assertThat(endOfWeek).isEqualTo(LocalDate.of(2025, 1, 5));
    Assertions.assertThat(monthValue).isEqualTo(1);
    Assertions.assertThat(isoWeekValue).isEqualTo(1);

    System.out.println("ํ•ด๋‹น ๋‚ ์งœ๊ฐ€ ํฌํ•จ๋œ ์ฃผ์˜ ์›”์š”์ผ: " + startOfWeek);  // 12์›” 30์ผ
    System.out.println("ํ•ด๋‹น ๋‚ ์งœ๊ฐ€ ํฌํ•จ๋œ ์ฃผ์˜ ์ผ์š”์ผ: " + endOfWeek);    // 1์›” 5์ผ
    System.out.println("ํ•ด๋‹น ๋‚ ์งœ์˜ ๋ช‡ ์›”: " + monthValue);        // 1์›”
    System.out.println("ํ•ด๋‹น ๋‚ ์งœ์˜ ๋ช‡ ์ฃผ์ฐจ: " + isoWeekValue);    // ์›” ๊ธฐ์ค€์œผ๋กœ 1์ฃผ์ฐจ (1~5์˜ ๊ฐ’ ์ค‘ ํ•˜๋‚˜)
    System.out.println(target.get(WeekFields.ISO.weekOfWeekBasedYear()));  // ๋…„ ๊ธฐ์ค€์œผ๋กœ N์ฃผ์ฐจ (1~53์˜ ๊ฐ’ ์ค‘ ํ•˜๋‚˜)
}

 
์ด๋ฅผ ์‘์šฉํ•ด์„œ 2024๋…„ 11์›” 16์ผ์„ ๊ธฐ์ค€์œผ๋กœ ์ „ 4๊ฐœ ์ฃผ์ฐจ์˜ ์‹œ์ž‘์ผ, ๋งˆ์ง€๋ง‰์ผ, N์›”, N์ฃผ์ฐจ๋ฅผ ๊ตฌํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

@DisplayName("24๋…„ 11์›” 16์ผ ๊ธฐ์ค€์œผ๋กœ 4์ฃผ์ฐจ์˜ ์‹œ์ž‘์ผ,๋งˆ์ง€๋ง‰์ผ,๋ช‡์›”,๋ช‡์ฃผ์ฐจ ๋ฅผ ๊ตฌํ•œ๋‹ค.")
@Test
void test() {
    // given
    LocalDate today = LocalDate.of(2024, 11, 16);

    List<WeeklyDate> weeklyDates = IntStream.rangeClosed(1, 4)
           .mapToObj(i -> {
               LocalDate minusDate = today.minusDays((long) i * 7);
               LocalDate firstOfWeek = 
                                  minusDate.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY));
               LocalDate lastOfWeek = minusDate.with(TemporalAdjusters.nextOrSame(DayOfWeek.SUNDAY));
               LocalDate middleOfWeek = firstOfWeek.plusDays(3);

              return new WeeklyDate(
                       firstOfWeek,
                       lastOfWeek,
                       middleOfWeek.getMonthValue(),
                       middleOfWeek.get(WeekFields.ISO.weekOfMonth())
               );
           })
           .sorted()
           .collect(Collectors.toList());

    for (WeeklyDate weeklyDate : weeklyDates) {
        System.out.println("weeklyDate = " + weeklyDate);
    }
}

static class WeeklyDate implements Comparable<WeeklyDate> {
   LocalDate startDate;
   LocalDate endDate;
   int monthValue;
   int weekNumber;

   public WeeklyDate(LocalDate startDate, LocalDate endDate, int monthValue, int weekNumber) {
       this.startDate = startDate;
       this.endDate = endDate;
       this.monthValue = monthValue;
       this.weekNumber = weekNumber;
   }

   @Override
   public int compareTo(@NotNull WeeklyTest.WeeklyDate o) {
        return startDate.compareTo(o.startDate);
   }

   @Override
   public String toString() {
        return "WeeklyDate{" +
               "startDate=" + startDate +
               ", endDate=" + endDate +
               ", month=" + month +
               ", weekNumber=" + weekNumber +
               '}';
   }
}

 
์‹œ์ž‘์ผ์€ ์›”์š”์ผ, ๋งˆ์ง€๋ง‰์ผ์€ ์ผ์š”์ผ, ๋ช‡์›” ๋ช‡์ฃผ์ฐจ์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’์ด ์ด 4๊ฐœ๊ฐ€ ์ž˜ ๋‚˜์˜จ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 
 

WeekFields ํด๋ž˜์Šค ์„ค๋ช…

WeekFields ํด๋ž˜์Šค๋Š” Java 8์—์„œ ๋„์ž…๋œ ํด๋ž˜์Šค์ด๋ฉฐ, ํŠน์ • ๋ฌธํ™”๊ถŒ ๋˜๋Š” ํ‘œ์ค€์— ๋”ฐ๋ผ ์ฃผ(week)๋ฅผ ์ •์˜ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค.
 

  • ์ง€์—ญํ™”๋œ ์ฃผ ์ •์˜(Localization)
    • ์„œ๋กœ ๋‹ค๋ฅธ ๋ฌธํ™”๊ถŒ์—์„œ๋Š” ์ฃผ์˜ ์‹œ์ž‘ ์š”์ผ๊ณผ ์ฒซ ๋ฒˆ์งธ ์ฃผ๋ฅผ ์ •์˜ํ•˜๋Š” ๋ฐฉ์‹์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค.
    • WeekFields๋Š” ์ด๋Ÿฌํ•œ ์ฐจ์ด๋ฅผ ๋ฐ˜์˜ํ•˜์—ฌ ์ฃผ์˜ ์ •์˜๋ฅผ ๋งž์ถค ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
    • WeekFields.of(new Locale("ko", "KR") ์„ ์‚ฌ์šฉํ•˜๋ฉด ํ•œ๊ตญ ๋ฌธํ™”๊ถŒ์—์„œ์˜ ์‹œ์ž‘ ์š”์ผ๊ณผ ์ฒซ๋ฒˆ์งธ ์ฃผ ๊ทœ์น™์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.
    • ko ์™€ KR ๊ฐ™์ด ์ •์˜ํ•˜๊ณ  ์‹ถ์€ ์–ธ์–ด์™€ ๋‚˜๋ผ๋ฅผ ์•Œ๊ณ  ์‹ถ๋‹ค๋ฉด Locale[] locales = Locale.getAvailableLocales(); ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
  • Thread-Safe ๋ฐ Immutable
    • ์ด ํด๋ž˜์Šค๋Š” ๋ถˆ๋ณ€(Immutable)์ด๋ฉฐ, ๋‹ค์ค‘ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ๋„ ์•ˆ์ „ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ISO-8601 ํ‘œ์ค€๊ณผ์˜ ํ˜ธํ™˜์„ฑ
    • ISO-8601 ํ‘œ์ค€์—์„œ ์ฃผ์˜ ์‹œ์ž‘ ์š”์ผ์€ ์›”์š”์ผ์ด๋ฉฐ, ์ฒซ ๋ฒˆ์งธ ์ฃผ๋Š” ์ตœ์†Œ 4์ผ์„ ํฌํ•จํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ธฐ์ค€์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.
    • WeekFields๋ฅผ ํ†ตํ•ด ์ด๋Ÿฌํ•œ ๊ธฐ์ค€๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ ๊ธฐ์ค€๋„ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด, ์ผ์š”์ผ๋ถ€ํ„ฐ ์ตœ์†Œ 3์ผ์„ ํฌํ•จํ•˜๋ฉด ์œ ํšจํ•œ ์ฃผ๋ผ๊ณ  ๋ณด๊ณ ์‹ถ๋‹ค๋ฉด WeekFields.of(DayOfWeek.SUNDAY, 3) ๋กœ ์ƒ์„ฑํ•œ๋‹ค์Œ LocalDate.get() ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ์— ์ฃผ์ž…ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

TemporalAdjuster ํด๋ž˜์Šค ์„ค๋ช…

TemporalAdjuster๋Š” Java8์˜ java.time ํŒจํ‚ค์ง€์— ์†ํ•˜๋ฉฐ, ๋‚ ์งœ์™€ ์‹œ๊ฐ„์„ ์กฐ์ •ํ•˜๊ธฐ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค.
์ด๋ฅผ ํ†ตํ•ด Temporal ๊ฐ์ฒด(์˜ˆ: LocalDate, LocalDateTime)๋ฅผ ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์œผ๋กœ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • previous(DayOfWeek): ํ•ญ์ƒ ์ด์ „ ์ฃผ์˜ ์š”์ผ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
    • ํ˜„์žฌ ๋‚ ์งœ๊ฐ€ ํ† ์š”์ผ์ผ ๋•Œ, previous(DayOfWeek.SATURDAY) ๋ฅผ ํ•˜๋ฉด ์ €๋ฒˆ ์ฃผ ํ† ์š”์ผ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • previsoueOrSame(DayOfWeek): ํ˜„์žฌ ๋‚ ์งœ๊ฐ€ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•  ๊ฒฝ์šฐ ์ด๋ฅผ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ด์ „ ์š”์ผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
    • ex) ํ˜„์žฌ ๋‚ ์งœ๊ฐ€ ํ† ์š”์ผ์ผ ๋•Œ, previouseOrSame(DayOfWeek.SATURDAY) ๋ฅผ ํ•˜๋ฉด ํ˜„์žฌ ๋‚ ์งœ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
    • ํ˜„์žฌ ๋‚ ์งœ๊ฐ€ ํ† ์š”์ผ ์ผ๋•Œ, previousOrSame(DayOfWeek.MONDAY) ๋ฅผ ํ•˜๋ฉด ํ•ด๋‹น ์ฃผ์˜ ์›”์š”์ผ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. 
  • firstDayOfMonth(): ๋‹ฌ์˜ ์ฒซ ๋ฒˆ์งธ ๋‚ 
  • lastDayOfMonth(): ๋‹ฌ์˜ ๋งˆ์ง€๋ง‰ ๋‚ 
  • next(DayOfWeek): ๋‹ค์Œ ํŠน์ • ์š”์ผ
  • firstInMonth(DayOfWeek): ์›” ๋‚ด ํŠน์ • ์š”์ผ์˜ ์ฒซ ๋ฒˆ์งธ ๋‚ 

 
๋งˆ์น˜๋ฉฐ.
๋น„์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๋ฉด์„œ ํ•ด๋‹น ๋‚ ์งœ๊ฐ€ ๋ช‡์›” ๋ช‡์ฃผ์ฐจ์ด๋ฉฐ, ์›”์š”์ผ~์ผ์š”์ผ๊นŒ์ง€์˜ ๋‚ ์งœ๋ฅผ ๊ตฌํ•˜๋Š” ์š”๊ตฌ์‚ฌํ•ญ์ด ์žˆ์–ด์„œ ๋‚ ์งœAPI๋ฅผ ์‚ฌ์šฉํ•ด๋ดค๋Š”๋ฐ์š”.
 
์ฒ˜์Œ์—๋Š” Baeldung ์˜ ์ž๋ฃŒ๋งŒ์„ ์ฐธ๊ณ ํ–ˆ๋‹ค๊ฐ€ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๋Œ๋ ค๋ณด๋‹ˆ Baeldung์—์„œ ๋‚˜์˜จ ์ฝ”๋“œ๊ฐ€ ISO ๊ธฐ์ค€์ด ์•„๋‹˜์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค.
์—ญ์‹œ ์ฒ˜์Œ ์‚ฌ์šฉํ•ด๋ณด๋Š” API๋Š” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋กœ ํ™•์ธํ•˜๋Š” ์ž์„ธ๋Š” ํ•„์ˆ˜์ธ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
์—ฌ๋Ÿฌ๋ถ„๋„ ๋‚ ์งœ์™€ ์‹œ๊ฐ„ ๊ด€๋ จ ๋กœ์ง์„ ๋‹ค๋ฃฐ ๋•Œ ๊ผญ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋กœ ํ™•์ธํ•ด๋ณด์‹œ๊ธธ ์ถ”์ฒœ๋“œ๋ฆฌ๋ฉฐ ๋งˆ๋ฌด๋ฆฌ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค!
 
 

์ฐธ๊ณ 
- Baeldung ์˜ Getting the Week Number From Any Date
- stackoverflow ์˜ How to get dates of a week (I know week number)?