UNPKG

@modern-kit/utils

Version:
1 lines 5.61 kB
{"version":3,"file":"index.mjs","sources":["../../../src/date/getDateStartOf/index.ts"],"sourcesContent":["import { parseDate } from '../parseDate';\n\ntype DateStartOfUnit =\n | 'year'\n | 'month'\n | 'week'\n | 'date'\n | 'utcYear'\n | 'utcMonth'\n | 'utcWeek'\n | 'utcDate';\n\n/**\n * @description 주어진 날짜의 특정 단위 시작점을 반환합니다.\n *\n * 로컬 타임존 기준과 UTC 기준 모두 지원하며, 각 단위별로 해당 시작점의 00시 00분 00초를 반환합니다.\n *\n * - `year`: 로컬 타임존 기준 해당 연도의 1월 1일 00시 00분 00초\n * - `month`: 로컬 타임존 기준 해당 월의 1일 00시 00분 00초\n * - `week`: 로컬 타임존 기준 해당 주의 첫날(일요일) 00시 00분 00초\n * - `date`: 로컬 타임존 기준 해당 날짜의 00시 00분 00초\n * - `utcYear`: UTC 기준 해당 연도의 1월 1일 00시 00분 00초\n * - `utcMonth`: UTC 기준 해당 월의 1일 00시 00분 00초\n * - `utcWeek`: UTC 기준 해당 주의 첫날(일요일) 00시 00분 00초\n * - `utcDate`: UTC 기준 해당 날짜의 00시 00분 00초\n *\n * @param {string | Date | number} date - 기준 날짜\n * @param {DateStartOfUnit} 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 = getDateStartOf(target, 'year'); // 2025-01-01 00:00:00 (수요일)\n *\n * date.toISOString(); // '2024-12-31T15:00:00.000Z', KST 기준\n * date.getFullYear(); // 2025\n * date.getMonth(); // 0\n * date.getDate(); // 1\n * date.getDay(); // 3\n * date.getHours(); // 0\n * date.getMinutes(); // 0\n * date.getSeconds(); // 0\n * date.getMilliseconds(); // 0\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 = getDateStartOf(target, 'utcYear'); // 2025-01-01 00:00:00 (수요일)\n *\n * utcDate.toISOString(); // '2025-01-01T00:00:00.000Z', UTC 기준\n * utcDate.getFullYear(); // 2025\n * utcDate.getMonth(); // 0\n * utcDate.getDate(); // 1\n * utcDate.getDay(); // 3\n * utcDate.getHours(); // 0\n * utcDate.getMinutes(); // 0\n * utcDate.getSeconds(); // 0\n * utcDate.getMilliseconds(); // 0\n */\nexport function getDateStartOf(\n date: string | Date | number,\n unit: DateStartOfUnit\n): Date {\n const parsedDate = parseDate(date);\n\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, 0, 1, 0, 0, 0, 0));\n }\n return new Date(year, 0, 1, 0, 0, 0, 0);\n case 'month':\n if (isUTC) {\n return new Date(Date.UTC(year, month, 1, 0, 0, 0, 0));\n }\n return new Date(year, month, 1, 0, 0, 0, 0);\n case 'week': {\n const dayOfWeek = isUTC ? parsedDate.getUTCDay() : parsedDate.getDay();\n const startOfWeek = day - dayOfWeek;\n\n if (isUTC) {\n return new Date(Date.UTC(year, month, startOfWeek, 0, 0, 0, 0));\n }\n return new Date(year, month, startOfWeek, 0, 0, 0, 0);\n }\n case 'date':\n if (isUTC) {\n return new Date(Date.UTC(year, month, day, 0, 0, 0, 0));\n }\n return new Date(year, month, day, 0, 0, 0, 0);\n default:\n throw new Error(`지원하지 않는 단위입니다`);\n }\n}\n"],"names":[],"mappings":";;;AAkEO,SAAS,cAAA,CACd,MACA,IAAA,EACM;AACN,EAAA,MAAM,UAAA,GAAa,UAAU,IAAI,CAAA;AAEjC,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,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA,MAClD;AACA,MAAA,OAAO,IAAI,KAAK,IAAA,EAAM,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAAA,IACxC,KAAK,OAAA;AACH,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,OAAO,IAAI,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,KAAA,EAAO,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA,MACtD;AACA,MAAA,OAAO,IAAI,KAAK,IAAA,EAAM,KAAA,EAAO,GAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAAA,IAC5C,KAAK,MAAA,EAAQ;AACX,MAAA,MAAM,YAAY,KAAA,GAAQ,UAAA,CAAW,SAAA,EAAU,GAAI,WAAW,MAAA,EAAO;AACrE,MAAA,MAAM,cAAc,GAAA,GAAM,SAAA;AAE1B,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,OAAO,IAAI,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,KAAA,EAAO,WAAA,EAAa,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA,MAChE;AACA,MAAA,OAAO,IAAI,KAAK,IAAA,EAAM,KAAA,EAAO,aAAa,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAAA,IACtD;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,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA,MACxD;AACA,MAAA,OAAO,IAAI,KAAK,IAAA,EAAM,KAAA,EAAO,KAAK,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAAA,IAC9C;AACE,MAAA,MAAM,IAAI,MAAM,CAAA,oEAAA,CAAe,CAAA;AAAA;AAErC;;;;"}