@modern-kit/utils
Version:
1 lines • 6.14 kB
Source Map (JSON)
{"version":3,"file":"index.mjs","sources":["../../../src/date/getDateEndOf/index.ts"],"sourcesContent":["import { parseDate } from '../parseDate';\n\ntype DateEndOfUnit =\n | 'year'\n | 'month'\n | 'week'\n | 'date'\n | 'utcYear'\n | 'utcMonth'\n | 'utcWeek'\n | 'utcDate';\n\n/**\n * @description 주어진 날짜의 특정 단위 끝점을 반환합니다.\n *\n * 로컬 타임존 기준과 UTC 기준 모두 지원하며, 각 단위별로 해당 끝점의 23시 59분 59초를 반환합니다.\n *\n * - `year`: 로컬 타임존 기준 해당 연도의 12월 31일 23시 59분 59초\n * - `month`: 로컬 타임존 기준 해당 월의 마지막 날 23시 59분 59초\n * - `week`: 로컬 타임존 기준 해당 주의 마지막 날(토요일) 23시 59분 59초\n * - `date`: 로컬 타임존 기준 해당 날짜의 23시 59분 59초\n * - `utcYear`: UTC 기준 해당 연도의 12월 31일 23시 59분 59초\n * - `utcMonth`: UTC 기준 해당 월의 마지막 날 23시 59분 59초\n * - `utcWeek`: UTC 기준 해당 주의 마지막 날(토요일) 23시 59분 59초\n * - `utcDate`: UTC 기준 해당 날짜의 23시 59분 59초\n *\n * @param {string | Date | number} date - 기준 날짜\n * @param {DateEndOfUnit} unit - 끝점을 구할 단위\n * @returns {Date} 끝점이 셋팅된 Date 객체\n *\n * @example\n * // 로컬 타임존(KST) 기준\n * const target = '2025-03-15T14:30:45.123Z'\n * // 2025-03-15 23:30:45 (KST 기준 토요일)\n * // 2025-03-15 14:30:45 (UTC 기준 토요일)\n *\n * const date = getDateEndOf(target, 'year'); // 2025-12-31 23:59:59.999 (수요일)\n *\n * date.toISOString(); // '2025-12-31T14:59:59.999Z', KST 기준\n * date.getFullYear(); // 2025\n * date.getMonth(); // 11\n * date.getDate(); // 31\n * date.getDay(); // 3\n * date.getHours(); // 23\n * date.getMinutes(); // 59\n * date.getSeconds(); // 59\n * date.getMilliseconds(); // 999\n *\n * @example\n * // UTC 타임존 기준\n * const target = '2025-03-15T14:30:45.123Z'\n * // 2025-03-15 23:30:45 (KST 기준 토요일)\n * // 2025-03-15 14:30:45 (UTC 기준 토요일)\n *\n * const utcDate = getDateEndOf(target, 'utcYear'); // 2025-12-31 23:59:59.999 (수요일)\n *\n * utcDate.toISOString(); // '2025-12-31T23:59:59.999Z', UTC 기준\n * utcDate.getUTCFullYear(); // 2025\n * utcDate.getUTCMonth(); // 11\n * utcDate.getUTCDate(); // 31\n * utcDate.getUTCDay(); // 3\n * utcDate.getUTCHours(); // 23\n * utcDate.getUTCMinutes(); // 59\n * utcDate.getUTCSeconds(); // 59\n * utcDate.getUTCMilliseconds(); // 999\n */\nexport function getDateEndOf(\n date: string | Date | number,\n unit: DateEndOfUnit\n): Date {\n const parsedDate = parseDate(date);\n\n // UTC 단위인지 확인\n const isUTC = unit.startsWith('utc');\n const baseUnit = isUTC ? unit.slice(3).toLowerCase() : unit;\n\n const year = isUTC ? parsedDate.getUTCFullYear() : parsedDate.getFullYear();\n const month = isUTC ? parsedDate.getUTCMonth() : parsedDate.getMonth();\n const day = isUTC ? parsedDate.getUTCDate() : parsedDate.getDate();\n\n switch (baseUnit) {\n case 'year':\n if (isUTC) {\n return new Date(Date.UTC(year, 11, 31, 23, 59, 59, 999));\n }\n return new Date(year, 11, 31, 23, 59, 59, 999);\n case 'month': {\n const lastDayOfMonth = isUTC\n ? new Date(Date.UTC(year, month + 1, 0)).getUTCDate()\n : new Date(year, month + 1, 0).getDate();\n\n if (isUTC) {\n return new Date(Date.UTC(year, month, lastDayOfMonth, 23, 59, 59, 999));\n }\n return new Date(year, month, lastDayOfMonth, 23, 59, 59, 999);\n }\n case 'week': {\n const dayOfWeek = isUTC ? parsedDate.getUTCDay() : parsedDate.getDay();\n const endOfWeek = day + (6 - dayOfWeek);\n\n if (isUTC) {\n return new Date(Date.UTC(year, month, endOfWeek, 23, 59, 59, 999));\n }\n return new Date(year, month, endOfWeek, 23, 59, 59, 999);\n }\n case 'date':\n if (isUTC) {\n return new Date(Date.UTC(year, month, day, 23, 59, 59, 999));\n }\n return new Date(year, month, day, 23, 59, 59, 999);\n default:\n throw new Error(`지원하지 않는 단위입니다`);\n }\n}\n"],"names":[],"mappings":";;;AAkEO,SAAS,YAAA,CACd,MACA,IAAA,EACM;AACN,EAAA,MAAM,UAAA,GAAa,UAAU,IAAI,CAAA;AAGjC,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,UAAA,CAAW,KAAK,CAAA;AACnC,EAAA,MAAM,WAAW,KAAA,GAAQ,IAAA,CAAK,MAAM,CAAC,CAAA,CAAE,aAAY,GAAI,IAAA;AAEvD,EAAA,MAAM,OAAO,KAAA,GAAQ,UAAA,CAAW,cAAA,EAAe,GAAI,WAAW,WAAA,EAAY;AAC1E,EAAA,MAAM,QAAQ,KAAA,GAAQ,UAAA,CAAW,WAAA,EAAY,GAAI,WAAW,QAAA,EAAS;AACrE,EAAA,MAAM,MAAM,KAAA,GAAQ,UAAA,CAAW,UAAA,EAAW,GAAI,WAAW,OAAA,EAAQ;AAEjE,EAAA,QAAQ,QAAA;AAAU,IAChB,KAAK,MAAA;AACH,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,OAAO,IAAI,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,GAAG,CAAC,CAAA;AAAA,MACzD;AACA,MAAA,OAAO,IAAI,KAAK,IAAA,EAAM,EAAA,EAAI,IAAI,EAAA,EAAI,EAAA,EAAI,IAAI,GAAG,CAAA;AAAA,IAC/C,KAAK,OAAA,EAAS;AACZ,MAAA,MAAM,cAAA,GAAiB,QACnB,IAAI,IAAA,CAAK,KAAK,GAAA,CAAI,IAAA,EAAM,QAAQ,CAAA,EAAG,CAAC,CAAC,CAAA,CAAE,UAAA,KACvC,IAAI,IAAA,CAAK,MAAM,KAAA,GAAQ,CAAA,EAAG,CAAC,CAAA,CAAE,OAAA,EAAQ;AAEzC,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,OAAO,IAAI,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,KAAA,EAAO,cAAA,EAAgB,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,GAAG,CAAC,CAAA;AAAA,MACxE;AACA,MAAA,OAAO,IAAI,KAAK,IAAA,EAAM,KAAA,EAAO,gBAAgB,EAAA,EAAI,EAAA,EAAI,IAAI,GAAG,CAAA;AAAA,IAC9D;AAAA,IACA,KAAK,MAAA,EAAQ;AACX,MAAA,MAAM,YAAY,KAAA,GAAQ,UAAA,CAAW,SAAA,EAAU,GAAI,WAAW,MAAA,EAAO;AACrE,MAAA,MAAM,SAAA,GAAY,OAAO,CAAA,GAAI,SAAA,CAAA;AAE7B,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,OAAO,IAAI,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,KAAA,EAAO,SAAA,EAAW,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,GAAG,CAAC,CAAA;AAAA,MACnE;AACA,MAAA,OAAO,IAAI,KAAK,IAAA,EAAM,KAAA,EAAO,WAAW,EAAA,EAAI,EAAA,EAAI,IAAI,GAAG,CAAA;AAAA,IACzD;AAAA,IACA,KAAK,MAAA;AACH,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,OAAO,IAAI,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,KAAA,EAAO,GAAA,EAAK,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,GAAG,CAAC,CAAA;AAAA,MAC7D;AACA,MAAA,OAAO,IAAI,KAAK,IAAA,EAAM,KAAA,EAAO,KAAK,EAAA,EAAI,EAAA,EAAI,IAAI,GAAG,CAAA;AAAA,IACnD;AACE,MAAA,MAAM,IAAI,MAAM,CAAA,oEAAA,CAAe,CAAA;AAAA;AAErC;;;;"}