@modern-kit/utils
Version:
1 lines • 3.04 kB
Source Map (JSON)
{"version":3,"file":"index.mjs","sources":["../../../src/date/getDDay/index.ts"],"sourcesContent":["import { parseDate } from '../parseDate';\nimport { objectKeys } from '../../object/objectKeys';\n\ntype CalculatedTimeResult = Record<keyof typeof TIME_UNITS, number>;\n\nconst TIME_UNITS = {\n days: 1000 * 60 * 60 * 24,\n hours: 1000 * 60 * 60,\n minutes: 1000 * 60,\n seconds: 1000,\n} as const;\n\nconst TIME_UNITS_KEYS = objectKeys(TIME_UNITS);\n\n/**\n * @description 주어진 날짜와 현재 날짜 사이의 `D-day`를 `일/시/분/초` 단위로 계산합니다.\n * 목표 날짜가 현재 날짜보다 기간이 남은 경우 `음수`를 반환합니다. 목표 날짜보다 기간이 지난 경우 `양수`를 반환합니다.\n *\n * @param {string | number | Date} date - 목표 날짜\n * @returns {CalculatedTimeResult} - 남은 시간을 `일/시/분/초` 단위에 맞게 계산한 값을 갖는 객체\n * @throws {Error} 유효하지 않은 날짜 형식이 입력된 경우\n *\n * @example\n * // 현재 날짜가 2025년 1월 1일 00:00:00 일 때\n * getDDay(new Date('2024-12-25 00:00:00'));\n * // { days: -7, hours: 0, minutes: 0, seconds: 0 }\n *\n * getDDay(new Date('2025-01-01 02:30:45'));\n * // { days: 0, hours: 2, minutes: 30, seconds: 45 }\n *\n * @example\n * // 문자열 포맷도 허용합니다.\n * getDDay('2024-12-31 18:15:30');\n * // { days: 0, hours: -5, minutes: -44, seconds: -30 }\n */\nexport function getDDay(date: string | number | Date): CalculatedTimeResult {\n const targetDate = parseDate(date);\n\n const today = new Date();\n const timeDiff = targetDate.getTime() - today.getTime();\n\n const isNegative = timeDiff < 0;\n const absoluteDiff = Math.abs(timeDiff);\n\n let remainingTime = absoluteDiff;\n\n const calculateTime = () => {\n return TIME_UNITS_KEYS.reduce((acc, key) => {\n const value = Math.floor(remainingTime / TIME_UNITS[key]);\n remainingTime %= TIME_UNITS[key];\n\n acc[key] = value && isNegative ? -value : value;\n return acc;\n }, {} as CalculatedTimeResult);\n };\n\n return calculateTime();\n}\n"],"names":[],"mappings":";;;;AAKA,MAAM,UAAA,GAAa;AAAA,EACjB,IAAA,EAAM,GAAA,GAAO,EAAA,GAAK,EAAA,GAAK,EAAA;AAAA,EACvB,KAAA,EAAO,MAAO,EAAA,GAAK,EAAA;AAAA,EACnB,SAAS,GAAA,GAAO,EAAA;AAAA,EAChB,OAAA,EAAS;AACX,CAAA;AAEA,MAAM,eAAA,GAAkB,WAAW,UAAU,CAAA;AAuBtC,SAAS,QAAQ,IAAA,EAAoD;AAC1E,EAAA,MAAM,UAAA,GAAa,UAAU,IAAI,CAAA;AAEjC,EAAA,MAAM,KAAA,uBAAY,IAAA,EAAK;AACvB,EAAA,MAAM,QAAA,GAAW,UAAA,CAAW,OAAA,EAAQ,GAAI,MAAM,OAAA,EAAQ;AAEtD,EAAA,MAAM,aAAa,QAAA,GAAW,CAAA;AAC9B,EAAA,MAAM,YAAA,GAAe,IAAA,CAAK,GAAA,CAAI,QAAQ,CAAA;AAEtC,EAAA,IAAI,aAAA,GAAgB,YAAA;AAEpB,EAAA,MAAM,gBAAgB,MAAM;AAC1B,IAAA,OAAO,eAAA,CAAgB,MAAA,CAAO,CAAC,GAAA,EAAK,GAAA,KAAQ;AAC1C,MAAA,MAAM,QAAQ,IAAA,CAAK,KAAA,CAAM,aAAA,GAAgB,UAAA,CAAW,GAAG,CAAC,CAAA;AACxD,MAAA,aAAA,IAAiB,WAAW,GAAG,CAAA;AAE/B,MAAA,GAAA,CAAI,GAAG,CAAA,GAAI,KAAA,IAAS,UAAA,GAAa,CAAC,KAAA,GAAQ,KAAA;AAC1C,MAAA,OAAO,GAAA;AAAA,IACT,CAAA,EAAG,EAA0B,CAAA;AAAA,EAC/B,CAAA;AAEA,EAAA,OAAO,aAAA,EAAc;AACvB;;;;"}