UNPKG

@modern-kit/utils

Version:
1 lines 7 kB
{"version":3,"file":"index.mjs","sources":["../../../src/date/isBirthDate/index.ts"],"sourcesContent":["import { isNumeric } from '../../validator/isNumeric';\n\ninterface ParsedFormatDateReturnType {\n year: number;\n month: number;\n day: number;\n}\n\nconst YEAR_SHORT_LENGTH = 6;\nconst YEAR_LONG_LENGTH = 8;\nconst YEAR_2000 = 2000;\nconst YEAR_1900 = 1900;\n\n/**\n * @description 6자리 생년월일 문자열을 파싱하여 년, 월, 일을 반환합니다.\n * 주어진 연도가 현재 연도보다 크면 2000년대 연도로 파싱하고, 아니면 1900년대 연도로 파싱합니다.\n *\n * ex: 2025년 기준\n * - 26 ~ 99: 1926 ~ 1999년\n * - 00 ~ 25: 2000 ~ 2025년\n *\n * @param {string} birthDate 6자리 생년월일 문자열\n * @returns {ParsedFormatDateReturnType} 년, 월, 일\n */\nconst parseShortFormatDate = (\n birthDate: string\n): ParsedFormatDateReturnType => {\n const currentYear = new Date().getFullYear(); // 2025\n const remainingYear = currentYear % 100; // ex 25\n const birthYear = Number(birthDate.substring(0, 2)); // 03\n\n return {\n year:\n remainingYear > birthYear ? YEAR_2000 + birthYear : YEAR_1900 + birthYear,\n month: Number(birthDate.substring(2, 4)),\n day: Number(birthDate.substring(4, 6)),\n };\n};\n\n/**\n * @description 8자리 생년월일 문자열을 파싱하여 년, 월, 일을 반환합니다.\n * @param {string} birthDate 8자리 생년월일 문자열\n * @returns {ParsedFormatDateReturnType} 년, 월, 일\n */\nconst parseLongFormatDate = (birthDate: string): ParsedFormatDateReturnType => {\n return {\n year: Number(birthDate.substring(0, 4)),\n month: Number(birthDate.substring(4, 6)),\n day: Number(birthDate.substring(6, 8)),\n };\n};\n\n/**\n * @description 구분자가 있는 생년월일 문자열이 올바른 날짜 형식인지 검사합니다.\n * 'YYYY-MM-DD', 'YY-MM-DD', 'YYYY.MM.DD', 'YY.MM.DD', 'YYYY/MM/DD', 'YY/MM/DD' 형식을 허용합니다.\n *\n * @param {string} dateString 생년월일 문자열\n * @returns {boolean} 올바른 날짜 형식이면 true, 아니면 false\n */\nconst isValidDateFormat = (dateString: string): boolean => {\n const regex =\n /^(?:\\d{4}|\\d{2})[-](?:\\d{2})[-](?:\\d{2})$|^(?:\\d{4}|\\d{2})[.](?:\\d{2})[.](?:\\d{2})$|^(?:\\d{4}|\\d{2})[\\/](?:\\d{2})[\\/](?:\\d{2})$/;\n return regex.test(dateString);\n};\n\n/**\n * @description 주어진 날짜가 실제로 존재하는 날짜이며 유효한 범위 내에 있는지 검사합니다.\n * @param {number} year 년\n * @param {number} month 월\n * @param {number} day 일\n * @returns {boolean} 올바른 날짜이면 true, 아니면 false\n */\nconst isValidDateInRange = (\n year: number,\n month: number,\n day: number\n): boolean => {\n const date = new Date(year, month - 1, day);\n const currentYear = new Date().getFullYear();\n const isValidYearRange = year >= YEAR_1900 && year <= currentYear;\n\n return (\n date.getFullYear() === year &&\n date.getMonth() === month - 1 &&\n date.getDate() === day &&\n isValidYearRange\n );\n};\n\n/**\n * @description 입력된 생년월일 문자열이 6자리 또는 8자리의 올바른 형식인지,\n * 그리고 해당 날짜가 실제로 존재하는 날짜인지(월, 일 범위 및 윤년 고려) 검사합니다.\n *\n * 입력값은 아래와 같은 형식을 허용합니다:\n * - 구분자 미포함: `\"YYYYMMDD\"`, `\"YYMMDD\"`\n * - 구분자 포함: `\"YY-MM-DD\"`, `\"YYYY-MM-DD\"`, `\"YY.MM.DD\"`, `\"YYYY.MM.DD\"`, `\"YY/MM/DD\"`, `\"YYYY/MM/DD\"`\n *\n * @param {string} birthDate 생년월일 문자열\n * @returns {boolean} 유효한 날짜면 true, 아니면 false\n *\n * @example\n * isBirthDate(\"950913\"); // true\n * isBirthDate(\"19950913\"); // true\n *\n * @example\n * isBirthDate(\"95-09-13\"); // true\n * isBirthDate(\"1995-09-13\"); // true\n *\n * isBirthDate(\"95.09.13\"); // true\n * isBirthDate(\"1995.09.13\"); // true\n *\n * isBirthDate(\"95/09/13\"); // true\n * isBirthDate(\"1995/09/13\"); // true\n *\n * @example\n * isBirthDate(\"1995&09&13\"); // false, '&'구분자는 불가합니다.\n * isBirthDate(\"199-509-13\"); // false, 구분자가 올바른 형식에 위치해야 합니다.\n * isBirthDate(\"1995-9-13\"); // false, 월 또는 일이 2자리여야 합니다.\n */\nexport function isBirthDate(birthDate: string): boolean {\n let birthDateToUse = birthDate;\n\n if (isValidDateFormat(birthDateToUse)) {\n birthDateToUse = birthDateToUse.replace(/[-/.]/g, '');\n }\n\n if (!isNumeric(birthDateToUse)) {\n return false;\n }\n\n if (\n birthDateToUse.length !== YEAR_SHORT_LENGTH &&\n birthDateToUse.length !== YEAR_LONG_LENGTH\n ) {\n return false;\n }\n\n const parsedBirthDate =\n birthDateToUse.length === YEAR_SHORT_LENGTH\n ? parseShortFormatDate(birthDateToUse)\n : parseLongFormatDate(birthDateToUse);\n\n const { year, month, day } = parsedBirthDate;\n\n return isValidDateInRange(year, month, day);\n}\n"],"names":[],"mappings":";;AAQA,MAAM,iBAAA,GAAoB,CAAA;AAC1B,MAAM,gBAAA,GAAmB,CAAA;AACzB,MAAM,SAAA,GAAY,GAAA;AAClB,MAAM,SAAA,GAAY,IAAA;AAalB,MAAM,oBAAA,GAAuB,CAC3B,SAAA,KAC+B;AAC/B,EAAA,MAAM,WAAA,GAAA,iBAAc,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAC3C,EAAA,MAAM,gBAAgB,WAAA,GAAc,GAAA;AACpC,EAAA,MAAM,YAAY,MAAA,CAAO,SAAA,CAAU,SAAA,CAAU,CAAA,EAAG,CAAC,CAAC,CAAA;AAElD,EAAA,OAAO;AAAA,IACL,IAAA,EACE,aAAA,GAAgB,SAAA,GAAY,SAAA,GAAY,YAAY,SAAA,GAAY,SAAA;AAAA,IAClE,OAAO,MAAA,CAAO,SAAA,CAAU,SAAA,CAAU,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA,IACvC,KAAK,MAAA,CAAO,SAAA,CAAU,SAAA,CAAU,CAAA,EAAG,CAAC,CAAC;AAAA,GACvC;AACF,CAAA;AAOA,MAAM,mBAAA,GAAsB,CAAC,SAAA,KAAkD;AAC7E,EAAA,OAAO;AAAA,IACL,MAAM,MAAA,CAAO,SAAA,CAAU,SAAA,CAAU,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA,IACtC,OAAO,MAAA,CAAO,SAAA,CAAU,SAAA,CAAU,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA,IACvC,KAAK,MAAA,CAAO,SAAA,CAAU,SAAA,CAAU,CAAA,EAAG,CAAC,CAAC;AAAA,GACvC;AACF,CAAA;AASA,MAAM,iBAAA,GAAoB,CAAC,UAAA,KAAgC;AACzD,EAAA,MAAM,KAAA,GACJ,iIAAA;AACF,EAAA,OAAO,KAAA,CAAM,KAAK,UAAU,CAAA;AAC9B,CAAA;AASA,MAAM,kBAAA,GAAqB,CACzB,IAAA,EACA,KAAA,EACA,GAAA,KACY;AACZ,EAAA,MAAM,OAAO,IAAI,IAAA,CAAK,IAAA,EAAM,KAAA,GAAQ,GAAG,GAAG,CAAA;AAC1C,EAAA,MAAM,WAAA,GAAA,iBAAc,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAC3C,EAAA,MAAM,gBAAA,GAAmB,IAAA,IAAQ,SAAA,IAAa,IAAA,IAAQ,WAAA;AAEtD,EAAA,OACE,IAAA,CAAK,WAAA,EAAY,KAAM,IAAA,IACvB,IAAA,CAAK,QAAA,EAAS,KAAM,KAAA,GAAQ,CAAA,IAC5B,IAAA,CAAK,OAAA,EAAQ,KAAM,GAAA,IACnB,gBAAA;AAEJ,CAAA;AAgCO,SAAS,YAAY,SAAA,EAA4B;AACtD,EAAA,IAAI,cAAA,GAAiB,SAAA;AAErB,EAAA,IAAI,iBAAA,CAAkB,cAAc,CAAA,EAAG;AACrC,IAAA,cAAA,GAAiB,cAAA,CAAe,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA;AAAA,EACtD;AAEA,EAAA,IAAI,CAAC,SAAA,CAAU,cAAc,CAAA,EAAG;AAC9B,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IACE,cAAA,CAAe,MAAA,KAAW,iBAAA,IAC1B,cAAA,CAAe,WAAW,gBAAA,EAC1B;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,eAAA,GACJ,eAAe,MAAA,KAAW,iBAAA,GACtB,qBAAqB,cAAc,CAAA,GACnC,oBAAoB,cAAc,CAAA;AAExC,EAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAO,GAAA,EAAI,GAAI,eAAA;AAE7B,EAAA,OAAO,kBAAA,CAAmB,IAAA,EAAM,KAAA,EAAO,GAAG,CAAA;AAC5C;;;;"}