TIL 24.11.09

์œค์ง€ยท2024๋…„ 11์›” 9์ผ
post-thumbnail

๐Ÿ“ย ๋ฌธ์ œ

์บ˜๋ฆฐ๋” ๊ตฌํ˜„

์„ค๋ช…: ํ˜„์žฌ ๋‚ ์งœ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐ„๋‹จํ•œ ์บ˜๋ฆฐ๋”๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

ํžŒํŠธ: innerHTML, ํ…Œ์ด๋ธ” ํƒœ๊ทธ๋ฅผ ๋ฌธ์ž์—ด๋กœ ์กฐํ•ฉํ•ด์„œ ๋งŒ๋“ค๋ฉด๋จ

๊ธฐ๋ณธ ์ œ๊ณต ์ฝ”๋“œ:

<div id="calendar"></div>
<button id="generateCalendarButton">์บ˜๋ฆฐ๋” ์ƒ์„ฑ</button>

๐Ÿฅ”ย ๋‚ด ์ฝ”๋“œ

1์ฐจ ์‹คํŒจ โŒ

  // ํ˜„์žฌ ๋‚ ์งœ ์ •๋ณด
  const now = new Date();
  // console.log(now);

  // ํ˜„์žฌ ์ •๋ณด(์—ฐ๋„, ๋‹ฌ, ์ผ) ๋ณ€์ˆ˜์— ์ €์žฅ
  const year = now.getFullYear();
  const month = now.getMonth() + 1;
  const day = now.getDate();

  // ์š”์ผ ๊ตฌํ•˜๊ธฐ
  const days = ['์ผ', '์›”', 'ํ™”', '์ˆ˜', '๋ชฉ', '๊ธˆ', 'ํ† '];
  console.log(typeof days[now.getDay()]);

  //๋งˆ์ง€๋ง‰ ์ผ ๊ตฌํ•˜๊ธฐ
  const lastDay = new Date(year, month - 1, 0).getDate();
  console.log(lastDay); //31

  //์บ˜๋ฆฐ๋”์— ํ™œ์šฉํ•  ์ƒˆ๋กœ์šด Date ๊ฐ์ฒด ๋ณต์‚ฌ
  const calenderDate = new Date(now);

  //์บ˜๋ฆฐ๋” ๊ทธ๋ฆฌ๋Š” ํ•จ์ˆ˜
  function makeCalendar() {
    const calendarCon = document.querySelector('#calendar');
    calendarCon.innerHTML = ""; //์ดˆ๊ธฐํ™”
    let calendarInner = `
    <table>
    <tr>
      <th>์ผ</th>
      <th>์›”</th>
      <th>ํ™”</th>
      <th>์ˆ˜</th>
      <th>๋ชฉ</th>
      <th>๊ธˆ</th>
      <th>ํ† </th>
    </tr>`;

    // 1์ผ ์š”์ผ ์ธ๋ฑ์Šค 
    const firstDayIndex = new Date(year, month - 1, 1).getDay();

    //์บ˜๋ฆฐ๋” ๊ทธ๋ฆฌ๊ธฐ
    //1์ผ๋ถ€ํ„ฐ ์‹œ์ž‘(์ดˆ๊ธฐ๊ฐ’)
    let day = 1;

    calenderDate.setDate(day);
    // console.log(calenderDate);

    //์ฒซ์ค„ ๋นˆ์นธ + ๋‚ ์งœ ์ฑ„์šฐ๊ธฐ
    calendarInner += `<tr>`;
    //์ฒซ์ค„ ์ƒ์„ฑ 7๋ฒˆ ๋ฐ˜๋ณต
    for (let i = 0; i < 7; i++) {
      if (i < firstDayIndex) {
        calendarInner += ` <td> </td>`;
      } else {
        calendarInner += ` <td>${day}</td>`;
      }
      day++;
    }
    calendarInner += `</tr>`;
    console.log(day);

    // ๋‚จ์€ ๋‚ ์งœ ์ฑ„์šฐ๊ธฐ
    while (day <= lastDay) {
      calendarInner += `<tr>`;
      for (let i = 0; i < 7; i++) {
        if (day > lastDay) { // 31์ผ๋ณด๋‹ค ํฌ๋ฉด ๋นˆ์นธ 
          calendarInner += `<td> </td>`;
          day++;
        } else {
          calendarInner += `<td>${day}</td>`;
          day++;
        }
      }
      calendarInner += `</tr>`;
    }
    calendarInner += `</table>`;

    console.log(calendarInner);
    calendarCon.innerHTML = calendarInner; //๊ทธ๋ฆฌ๊ธฐ
  }

  //๋ฒ„ํŠผ ํด๋ฆญ์‹œ ์บ˜๋ฆฐ๋” ๋งŒ๋“ค๊ธฐ
  const btnEl = document.querySelector('#generateCalendarButton');
  btnEl.addEventListener('click', makeCalendar);

ํ’€์ด

  1. ํ˜„์žฌ ๋‚ ์งœ ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ
    • ํ˜„์žฌ ์—ฐ๋„, ์›”, ์ผ ์ €์žฅ
  2. ํ•ด๋‹น ์›”์˜ ๋งˆ์ง€๋ง‰ ๋‚ ์งœ ๊ณ„์‚ฐ
  3. ์บ˜๋ฆฐ๋” ๊ทธ๋ฆฌ๊ธฐ ํ•จ์ˆ˜ (makeCalendar) ๊ตฌํ˜„
    • while ๋ฌธ์œผ๋กœ ์ดˆ๊ธฐ๊ฐ’ 1(์ผ)์—์„œ ๋งˆ์ง€๋ง‰ ๊ฐ’(๋‚ ์งœ) ๊นŒ์ง€ ๋ฐ˜๋ณตํ•ด์„œ ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•จ
    • 1์ผ์˜ ์š”์ผ ์ธ๋ฑ์Šค ๊ณ„์‚ฐ
    • ์ฒซ ์ฃผ ์ƒ์„ฑ (๋นˆ ์นธ + ๋‚ ์งœ) - 1์ผ ์ธ๋ฑ์Šค๋กœ ๋นˆ์นธ ์ˆ˜ ๊ณ„์‚ฐ
    • for๋ฌธ์œผ๋กœ ํ•œ ์ค„์— ๋“ค์–ด๊ฐˆ 7๋ฒˆ์˜ ํƒœ๊ทธ ์ƒ์„ฑ ํ›„ ๋กœ ๊ฐ์‹ธ๊ธฐ
    • ๋‚จ์€ ๋‚ ์งœ ์ฑ„์šฐ๊ธฐ(๋‚ ์งœ๋ณด๋‹ค ํฌ๋ฉด ๋นˆ์นธ ์ฒ˜๋ฆฌ)
    • ์™„์„ฑ๋œ ์บ˜๋ฆฐ๋” HTML์„ ํŽ˜์ด์ง€์— ์‚ฝ์ž…
  4. ๋ฒ„ํŠผ ํด๋ฆญ ์ด๋ฒคํŠธ์— ์บ˜๋ฆฐ๋” ์ƒ์„ฑ ํ•จ์ˆ˜ ์—ฐ๊ฒฐ

๋ฌธ์ œ์ (๊ฐ•์‚ฌ๋‹˜ ํ”ผ๋“œ๋ฐฑ)

  1. ํ˜„์žฌ ์ •๋ณด๋ฅผ ๋ณ€์ˆ˜๋กœ ์ €์žฅํ•ด ์ดํ›„ Date ๊ฐ์ฒด์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ, month ๊ฐ’์— 1์„ ๋”ํ•˜์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค. โ‡’ Date ๊ฐ์ฒด๋Š” ์›”์„ 0๋ถ€ํ„ฐ 11๋กœ ํ‘œํ˜„ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
 // ํ˜„์žฌ ์ •๋ณด(์—ฐ๋„, ๋‹ฌ, ์ผ) ๋ณ€์ˆ˜์— ์ €์žฅ
  const year = now.getFullYear();
  const month = now.getMonth() + 1;
  const day = now.getDate();
  1. ๋ณ€์ˆ˜ day๋Š” if ์กฐ๊ฑด์ด ์„ฑ๋ฆฝํ•˜์ง€ ์•Š์•˜์„ ๋•Œ๋งŒ ์ฆ๊ฐ€(++)ํ•ด์•ผ ํ•œ๋‹ค.

    โ‡’ ๋‹ฌ๋ ฅ ์ฒซ ์ค„์—์„œ 1์ผ์˜ ์š”์ผ๊ณผ ์ผ์น˜ํ•˜๋Š” ์ธ๋ฑ์Šค๋ฅผ ์ฐพ์„ ๋•Œ๊นŒ์ง€๋Š” ๋นˆ์นธ์œผ๋กœ ๋‘์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

   //์ฒซ์ค„ ์ƒ์„ฑ 7๋ฒˆ ๋ฐ˜๋ณต
    for (let i = 0; i < 7; i++) {
      if (i < firstDayIndex) {
        calendarInner += ` <td> </td>`;
      } else {
        calendarInner += ` <td>${day}</td>`;
      }
      day++;
    }

2์ฐจ ์„ฑ๊ณต โœ…

    // ํ˜„์žฌ ๋‚ ์งœ ์ •๋ณด
  const now = new Date();
  // console.log(now);

  // ํ˜„์žฌ ์ •๋ณด(์—ฐ๋„, ๋‹ฌ, ์ผ) ๋ณ€์ˆ˜์— ์ €์žฅ
  const year = now.getFullYear();
  const month = now.getMonth();
  const day = now.getDate();

  // ์š”์ผ ๊ตฌํ•˜๊ธฐ
  const days = ['์ผ', '์›”', 'ํ™”', '์ˆ˜', '๋ชฉ', '๊ธˆ', 'ํ† '];
  console.log(typeof days[now.getDay()]);

  //๋งˆ์ง€๋ง‰ ์ผ ๊ตฌํ•˜๊ธฐ
  const lastDay = new Date(year, month - 1, 0).getDate();
  console.log(lastDay); //31

  //์บ˜๋ฆฐ๋”์— ํ™œ์šฉํ•  ์ƒˆ๋กœ์šด Date ๊ฐ์ฒด ๋ณต์‚ฌ
  const calenderDate = new Date(now);

  //์บ˜๋ฆฐ๋” ๊ทธ๋ฆฌ๋Š” ํ•จ์ˆ˜
  function makeCalendar() {
    const calendarCon = document.querySelector('#calendar');
    calendarCon.innerHTML = ''; //์ดˆ๊ธฐํ™”
    let calendarInner = `
    <table>
    <tr>
      <th>์ผ</th>
      <th>์›”</th>
      <th>ํ™”</th>
      <th>์ˆ˜</th>
      <th>๋ชฉ</th>
      <th>๊ธˆ</th>
      <th>ํ† </th>
    </tr>`;

    // 1์ผ ์š”์ผ ์ธ๋ฑ์Šค
    const firstDayIndex = new Date(year, month, 1).getDay();

    //์บ˜๋ฆฐ๋” ๊ทธ๋ฆฌ๊ธฐ
    //1์ผ๋ถ€ํ„ฐ ์‹œ์ž‘(์ดˆ๊ธฐ๊ฐ’)
    let day = 1;

    calenderDate.setDate(day);
    // console.log(calenderDate);

    //์ฒซ์ค„ ๋นˆ์นธ + ๋‚ ์งœ ์ฑ„์šฐ๊ธฐ
    calendarInner += `<tr>`;
    //์ฒซ์ค„ ์ƒ์„ฑ 7๋ฒˆ ๋ฐ˜๋ณต
    for (let i = 0; i < 7; i++) {
      if (i < firstDayIndex) {
        calendarInner += ` <td> </td>`;
      } else {
        calendarInner += ` <td>${day}</td>`;
        day++;
      }
    }
    calendarInner += `</tr>`;
    console.log(day);

    // ๋‚จ์€ ๋‚ ์งœ ์ฑ„์šฐ๊ธฐ
    while (day <= lastDay) {
      calendarInner += `<tr>`;
      for (let i = 0; i < 7; i++) {
        if (day > lastDay) {
          // 31์ผ๋ณด๋‹ค ํฌ๋ฉด ๋นˆ์นธ
          calendarInner += `<td> </td>`;
          day++;
        } else {
          calendarInner += `<td>${day}</td>`;
          day++;
        }
      }
      calendarInner += `</tr>`;
    }
    calendarInner += `</table>`;

    console.log(calendarInner);
    calendarCon.innerHTML = calendarInner; //๊ทธ๋ฆฌ๊ธฐ
  }

  //๋ฒ„ํŠผ ํด๋ฆญ์‹œ ์บ˜๋ฆฐ๋” ๋งŒ๋“ค๊ธฐ
  const btnEl = document.querySelector('#generateCalendarButton');
  btnEl.addEventListener('click', makeCalendar);

๐Ÿ’ฌย ๋งˆ์น˜๋ฉฐ

์•„๋งˆ ์—ฌํƒœ ํ’€์—ˆ๋˜ ๋ฌธ์ œ ์ค‘ ๊ฐ€์žฅ ์˜ค๋ž˜ ๊ฑธ๋ ธ๊ณ  ๊ฐ€์žฅ ๊ธด ๋กœ์ง์ผ ๊ฒƒ ๊ฐ™๋‹ค! ๋ˆ„๊ตฐ๊ฐ€์—๊ฒ ์ž‘๊ณ  ์ดˆ๋ผํ•œ ์ฝ”๋“œ๊ฒ ์ง€๋งŒโ€ฆ ๋‚œ ๋„ˆ๋ฌด ๋ฟŒ๋“ฏํ•จ โœจ Date ๊ฐ์ฒด๋ž‘ ํ…Œ์ด๋ธ”ํƒœ๊ทธ๊ฐ€ ์ต์ˆ™ํ•˜์ง€ ์•Š์•„์„œ ๋ช‡๊ฐ€์ง€ ๊ฐœ๋…์„ ์ฐธ๊ณ ํ•ด์„œ ํ’€์—ˆ๋‹ค. ์˜จ์ „ํ•œ ๋‚ด ํž˜์€ ์•„๋‹ˆ์—ˆ์ง€๋งŒโ€ฆ ๋กœ์ง ์ž์ฒด๋ฅผ ๋งŒ๋“ค์–ด ๋‚ผ ์ˆ˜ ์žˆ์—ˆ๋‹ค๋Š” ๊ฑฐ์— ์˜๋ฏธ๋ฅผ ๋‘ฌ์•ผ์ง€ ๐ŸŒ

profile
ํ”„๋ก ํŠธ์—”๋“œ ๊ณต๋ถ€ ๊ธฐ๋ก ์•„์นด์ด๋น™๐Ÿ

0๊ฐœ์˜ ๋Œ“๊ธ€