/** * 날짜/시간 유틸리티 함수 * * 중요: 이 프로젝트는 한국(Asia/Seoul, UTC+9) 시간대 기준으로 운영됩니다. * DB에 저장되는 비즈니스 날짜(report_date, session_date 등)는 반드시 한국 시간 기준이어야 합니다. * * @author TK-FB-Project * @since 2026-02-03 */ const KOREA_TIMEZONE_OFFSET = 9; // UTC+9 /** * 한국 시간(KST) 기준 현재 Date 객체 반환 * @returns {Date} 한국 시간 기준 Date 객체 */ function getKoreaDate() { const now = new Date(); return new Date(now.getTime() + (KOREA_TIMEZONE_OFFSET * 60 * 60 * 1000)); } /** * 한국 시간(KST) 기준 현재 날짜 문자열 반환 * @returns {string} 'YYYY-MM-DD' 형식 */ function getKoreaDateString() { const koreaDate = getKoreaDate(); const year = koreaDate.getUTCFullYear(); const month = String(koreaDate.getUTCMonth() + 1).padStart(2, '0'); const day = String(koreaDate.getUTCDate()).padStart(2, '0'); return `${year}-${month}-${day}`; } /** * 한국 시간(KST) 기준 현재 datetime 문자열 반환 * @returns {string} 'YYYY-MM-DD HH:mm:ss' 형식 (MySQL DATETIME 호환) */ function getKoreaDatetime() { const koreaDate = getKoreaDate(); const year = koreaDate.getUTCFullYear(); const month = String(koreaDate.getUTCMonth() + 1).padStart(2, '0'); const day = String(koreaDate.getUTCDate()).padStart(2, '0'); const hours = String(koreaDate.getUTCHours()).padStart(2, '0'); const minutes = String(koreaDate.getUTCMinutes()).padStart(2, '0'); const seconds = String(koreaDate.getUTCSeconds()).padStart(2, '0'); return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`; } /** * 한국 시간(KST) 기준 현재 시간 문자열 반환 * @returns {string} 'HH:mm:ss' 형식 */ function getKoreaTimeString() { const koreaDate = getKoreaDate(); const hours = String(koreaDate.getUTCHours()).padStart(2, '0'); const minutes = String(koreaDate.getUTCMinutes()).padStart(2, '0'); const seconds = String(koreaDate.getUTCSeconds()).padStart(2, '0'); return `${hours}:${minutes}:${seconds}`; } /** * UTC Date를 한국 시간 datetime 문자열로 변환 * @param {Date} date - UTC 기준 Date 객체 * @returns {string} 'YYYY-MM-DD HH:mm:ss' 형식 */ function toKoreaDatetime(date) { if (!date) return null; const koreaDate = new Date(date.getTime() + (KOREA_TIMEZONE_OFFSET * 60 * 60 * 1000)); const year = koreaDate.getUTCFullYear(); const month = String(koreaDate.getUTCMonth() + 1).padStart(2, '0'); const day = String(koreaDate.getUTCDate()).padStart(2, '0'); const hours = String(koreaDate.getUTCHours()).padStart(2, '0'); const minutes = String(koreaDate.getUTCMinutes()).padStart(2, '0'); const seconds = String(koreaDate.getUTCSeconds()).padStart(2, '0'); return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`; } /** * UTC Date를 한국 날짜 문자열로 변환 * @param {Date} date - UTC 기준 Date 객체 * @returns {string} 'YYYY-MM-DD' 형식 */ function toKoreaDateString(date) { if (!date) return null; const koreaDate = new Date(date.getTime() + (KOREA_TIMEZONE_OFFSET * 60 * 60 * 1000)); const year = koreaDate.getUTCFullYear(); const month = String(koreaDate.getUTCMonth() + 1).padStart(2, '0'); const day = String(koreaDate.getUTCDate()).padStart(2, '0'); return `${year}-${month}-${day}`; } /** * 한국 시간 datetime 문자열을 Date 객체로 변환 * @param {string} koreaDatetimeStr - 'YYYY-MM-DD HH:mm:ss' 형식 * @returns {Date} UTC 기준 Date 객체 */ function fromKoreaDatetime(koreaDatetimeStr) { if (!koreaDatetimeStr) return null; // 한국 시간 문자열을 UTC로 변환 const date = new Date(koreaDatetimeStr + '+09:00'); return date; } /** * 연도 반환 (한국 시간 기준) * @returns {number} 현재 연도 */ function getKoreaYear() { return getKoreaDate().getUTCFullYear(); } /** * 월 반환 (한국 시간 기준, 1-12) * @returns {number} 현재 월 (1-12) */ function getKoreaMonth() { return getKoreaDate().getUTCMonth() + 1; } module.exports = { KOREA_TIMEZONE_OFFSET, getKoreaDate, getKoreaDateString, getKoreaDatetime, getKoreaTimeString, toKoreaDatetime, toKoreaDateString, fromKoreaDatetime, getKoreaYear, getKoreaMonth, };