1//DateUtils í´ëì¤ 2class DateUtils { 3 /** 4 * ë ì§ë¥¼ ì§ì ë í¬ë§·ì¼ë¡ ë³ííë í¨ì 5 * @param {Date} date ë³íí ë ì§ ê°ì²´ (기본ê°: íì¬ ë ì§) 6 * @param {string} format ìíë ì¶ë ¥ íì (ì: 'yyyy-mm-dd', 'dd/mm/yyyy') 7 * @returns {string} í¬ë§·í ë ë ì§ ë¬¸ìì´ 8 */ 9 static formatDate(date = new Date(), format = 'yyyy-mm-dd') { 10 const yyyy = date.getFullYear(); 11 const mm = String(date.getMonth() + 1).padStart(2, '0'); 12 const dd = String(date.getDate()).padStart(2, '0'); 13 return format.replace('yyyy', yyyy).replace('mm', mm).replace('dd', dd); 14 } 15 16 /** 17 * ë ì§ë¥¼ ì¶ê°íê±°ë ë¹¼ë í¨ì 18 * @param {Date} date ê¸°ì¤ ë ì§ 19 * @param {number} value ëí ê° (ììë©´ 빼기) 20 * @param {'days' | 'months' | 'years'} unit ë¨ì (days, months, years) 21 * @returns {Date} ê³ì°ë ìë¡ì´ ë ì§ ê°ì²´ 22 */ 23 static addDate(date, value, unit) { 24 if (typeof date === 'string') date = new Date(date); // 문ìì´ì Date ê°ì²´ë¡ ë³í 25 26 if (!(date instanceof Date) || isNaN(date)) throw new Error("ì í¨í ë ì§ë¥¼ ì ë ¥íì¸ì."); 27 28 // valueê° ë¬¸ìì´ì´ë©´ ì«ìë¡ ë³í ìë 29 value = Number(value); 30 if (isNaN(value)) throw new Error("valueë ì«ìì¬ì¼ í©ëë¤."); 31 32 const newDate = new Date(date); 33 if (unit === 'days') newDate.setDate(newDate.getDate() + value); 34 if (unit === 'months') newDate.setMonth(newDate.getMonth() + value); 35 if (unit === 'years') newDate.setFullYear(newDate.getFullYear() + value); 36 37 return newDate; 38 } 39 40 41 /** 42 * ë ë ì§ ê° ì°¨ì´ ê³ì° (ì¼ ë¨ì) 43 * @param {Date} date1 첫 ë²ì§¸ ë ì§ 44 * @param {Date} date2 ë ë²ì§¸ ë ì§ 45 * @returns {number} ë ì§ ì°¨ì´ (ì¼ ë¨ì) 46 */ 47 static diffDays(date1, date2) { 48 return Math.ceil((date2 - date1) / (1000 * 60 * 60 * 24)); 49 } 50 51 /** 52 * 주ì´ì§ ë ì§ê° 주ë§ì¸ì§ íì¸ 53 * @param {Date} date ê²ì¬í ë ì§ 54 * @returns {boolean} ì£¼ë§ ì¬ë¶ (true: 주ë§, false: íì¼) 55 */ 56 static isWeekend(date) { 57 return date.getDay() === 0 || date.getDay() === 6; 58 } 59 60 /** 61 * 주ì´ì§ ì°ëê° ì¤ë ì¸ì§ íì¸ 62 * @param {number} year ê²ì¬í ì°ë 63 * @returns {boolean} ì¤ë ì¬ë¶ (true: ì¤ë , false: íë ) 64 */ 65 static isLeapYear(year) { 66 return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0; 67 } 68 69 /** 70 * ì í¨í ë ì§ì¸ì§ íì¸ 71 * @param {Date} date ê²ì¬í ë ì§ 72 * @returns {boolean} ì í¨í ë ì§ ì¬ë¶ 73 */ 74 static isValidDate(date) { 75 return date instanceof Date && !isNaN(date); 76 } 77 78 /** 79 * í´ë¹ ìì ë§ì§ë§ ë ì§ ë°í 80 * @param {number} year ì°ë 81 * @param {number} month ì (1~12) 82 * @returns {number} í´ë¹ ìì ë§ì§ë§ ë ì§ 83 */ 84 static getLastDayOfMonth(year, month) { 85 return new Date(year, month, 0).getDate(); 86 } 87 88 /** 89 * 주ì´ì§ ë ì§ê° ê³µí´ì¼ì¸ì§ íì¸ 90 * @param {Date} date ê²ì¬í ë ì§ 91 * @param {string[]} holidays ê³µí´ì¼ ëª©ë¡ (기본ê°: ìí´ ì²«ë & í¬ë¦¬ì¤ë§ì¤) 92 * @returns {boolean} ê³µí´ì¼ ì¬ë¶ 93 */ 94 static isHoliday(date, holidays = ['2025-01-01', '2025-12-25']) { 95 return holidays.includes(this.formatDate(date, 'yyyy-mm-dd')); 96 } 97 98 /** 99 * ë ë ì§ ê° ìê° ì°¨ì´ ê³ì° (ìê°, ë¶, ì´) 100 * @param {Date} date1 첫 ë²ì§¸ ë ì§ 101 * @param {Date} date2 ë ë²ì§¸ ë ì§ 102 * @returns {{hours: number, minutes: number, seconds: number}} ì°¨ì´ ê°ì²´ 103 */ 104 static diffTime(date1, date2) { 105 const diffMs = Math.abs(date2 - date1); 106 return { 107 hours: Math.floor(diffMs / (1000 * 60 * 60)), 108 minutes: Math.floor((diffMs / (1000 * 60)) % 60), 109 seconds: Math.floor((diffMs / 1000) % 60) 110 }; 111 } 112 113 /** 114 * í´ë¹ ë ì§ì ISO 8601 주 ë²í¸ ë°í 115 * @param {Date} date ê²ì¬í ë ì§ 116 * @returns {number} í´ë¹ ë ì§ì 주 ë²í¸ 117 */ 118 static getWeekNumber(date) { 119 const firstDayOfYear = new Date(date.getFullYear(), 0, 1); 120 const pastDaysOfYear = (date - firstDayOfYear) / (1000 * 60 * 60 * 24); 121 return Math.ceil((pastDaysOfYear + firstDayOfYear.getDay() + 1) / 7); 122 } 123 124 /** 125 * í¹ì ìì¼ì ë¤ì ë ì§ ì°¾ê¸° 126 * @param {Date} date ê¸°ì¤ ë ì§ 127 * @param {number} dayOfWeek ìíë ìì¼ (0: ì¼ìì¼, 6: í ìì¼) 128 * @returns {Date} í´ë¹ ìì¼ì ë¤ì ë ì§ 129 */ 130 static getNextDayOfWeek(date, dayOfWeek) { 131 const resultDate = new Date(date); 132 resultDate.setDate(date.getDate() + ((dayOfWeek + 7 - date.getDay()) % 7)); 133 return resultDate; 134 } 135} 136 137// ì¬ì© ìì 138/*const today = new Date(); 139console.log('ì¤ë ë ì§:', DateUtils.formatDate(today, 'yyyy-mm-dd')); // 2025-03-13 140console.log('ì¼ì£¼ì¼ ì :', DateUtils.formatDate(DateUtils.addDate(today, -7, 'days'), 'yyyy-mm-dd')); // 7ì¼ ì 141console.log('í ë¬ í:', DateUtils.formatDate(DateUtils.addDate(today, 1, 'months'), 'yyyy-mm-dd')); // 1ë¬ í 142console.log('ì¬í´ë ì¤ë ì¸ê°?', DateUtils.isLeapYear(today.getFullYear()));
142 // ì¤ë ì¬ë¶ 143console.log('주ë§ì¸ê°?', DateUtils.isWeekend(today)); // ì¤ëì´ ì£¼ë§ì¸ì§ íì¸*/ 144 145// ë ë ì§ ì°¨ì´ ê³ì° 146/*const anotherDate = new Date('2025-04-01'); 147console.log('ë ì§ ì°¨ì´:', DateUtils.diffDays(today, anotherDate), 'ì¼'); // ë ì§ ì°¨ì´ ê³ì°*/
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.