2026-01-09 09:46:54 +09:00
|
|
|
/**
|
|
|
|
|
* 날짜 관련 유틸리티 함수
|
|
|
|
|
* dayjs를 사용하여 KST(한국 표준시) 기준으로 날짜 처리
|
|
|
|
|
*/
|
|
|
|
|
import dayjs from "dayjs";
|
|
|
|
|
import utc from "dayjs/plugin/utc";
|
|
|
|
|
import timezone from "dayjs/plugin/timezone";
|
|
|
|
|
|
|
|
|
|
// 플러그인 확장
|
|
|
|
|
dayjs.extend(utc);
|
|
|
|
|
dayjs.extend(timezone);
|
|
|
|
|
|
|
|
|
|
// 기본 타임존 설정
|
|
|
|
|
const KST = "Asia/Seoul";
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* KST 기준 오늘 날짜 (YYYY-MM-DD)
|
|
|
|
|
* @returns {string} 오늘 날짜 문자열
|
|
|
|
|
*/
|
|
|
|
|
export const getTodayKST = () => {
|
|
|
|
|
return dayjs().tz(KST).format("YYYY-MM-DD");
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* KST 기준 현재 시각
|
|
|
|
|
* @returns {dayjs.Dayjs} dayjs 객체
|
|
|
|
|
*/
|
|
|
|
|
export const nowKST = () => {
|
|
|
|
|
return dayjs().tz(KST);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 날짜 문자열 포맷팅
|
|
|
|
|
* @param {string|Date} date - 날짜
|
|
|
|
|
* @param {string} format - 포맷 (기본: 'YYYY-MM-DD')
|
|
|
|
|
* @returns {string} 포맷된 날짜 문자열
|
|
|
|
|
*/
|
|
|
|
|
export const formatDate = (date, format = "YYYY-MM-DD") => {
|
|
|
|
|
return dayjs(date).tz(KST).format(format);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 날짜에서 년, 월, 일, 요일 추출
|
|
|
|
|
* @param {string|Date} date - 날짜
|
|
|
|
|
* @returns {object} { year, month, day, weekday }
|
|
|
|
|
*/
|
|
|
|
|
export const parseDateKST = (date) => {
|
|
|
|
|
const d = dayjs(date).tz(KST);
|
|
|
|
|
const weekdays = ["일", "월", "화", "수", "목", "금", "토"];
|
|
|
|
|
return {
|
|
|
|
|
year: d.year(),
|
|
|
|
|
month: d.month() + 1,
|
|
|
|
|
day: d.date(),
|
|
|
|
|
weekday: weekdays[d.day()],
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 두 날짜 비교 (같은 날인지)
|
|
|
|
|
* @param {string|Date} date1
|
|
|
|
|
* @param {string|Date} date2
|
|
|
|
|
* @returns {boolean}
|
|
|
|
|
*/
|
|
|
|
|
export const isSameDay = (date1, date2) => {
|
|
|
|
|
return (
|
|
|
|
|
dayjs(date1).tz(KST).format("YYYY-MM-DD") ===
|
|
|
|
|
dayjs(date2).tz(KST).format("YYYY-MM-DD")
|
|
|
|
|
);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 날짜가 오늘인지 확인
|
|
|
|
|
* @param {string|Date} date
|
|
|
|
|
* @returns {boolean}
|
|
|
|
|
*/
|
|
|
|
|
export const isToday = (date) => {
|
|
|
|
|
return isSameDay(date, dayjs());
|
|
|
|
|
};
|
|
|
|
|
|
2026-01-21 12:10:08 +09:00
|
|
|
/**
|
|
|
|
|
* X(트위터) 스타일 날짜/시간 포맷팅
|
|
|
|
|
* 입력: "2026-01-18 19:00" 또는 "2026-01-18"
|
|
|
|
|
* 출력: "오후 7:00 · 2026년 1월 18일" 또는 "2026년 1월 18일"
|
|
|
|
|
* @param {string} datetime - 날짜/시간 문자열
|
|
|
|
|
* @returns {string} 포맷된 문자열
|
|
|
|
|
*/
|
|
|
|
|
export const formatXDateTime = (datetime) => {
|
|
|
|
|
if (!datetime) return '';
|
|
|
|
|
|
|
|
|
|
const d = dayjs(datetime).tz(KST);
|
|
|
|
|
const datePart = d.format('YYYY년 M월 D일');
|
|
|
|
|
|
|
|
|
|
// 시간이 포함된 경우
|
|
|
|
|
if (datetime.includes(' ') || datetime.includes('T')) {
|
|
|
|
|
const hour = d.hour();
|
|
|
|
|
const minute = d.minute();
|
|
|
|
|
const period = hour >= 12 ? '오후' : '오전';
|
|
|
|
|
const hour12 = hour > 12 ? hour - 12 : hour === 0 ? 12 : hour;
|
|
|
|
|
return `${period} ${hour12}:${String(minute).padStart(2, '0')} · ${datePart}`;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return datePart;
|
|
|
|
|
};
|
|
|
|
|
|
2026-01-09 09:46:54 +09:00
|
|
|
// dayjs 인스턴스도 export (고급 사용용)
|
|
|
|
|
export { dayjs };
|