Dayjs KST 중앙 setup
한국 서비스에서 반복되는 dayjs 설정을 단 한 번만 하도록 표준 파일을 생성한다.
왜 필요한가
- plugin 등록 누락: 컴포넌트마다
import dayjs from "dayjs"하면dayjs.tz()호출 시 plugin 미등록 에러가 산발적으로 발생한다. - timezone shift:
YYYY-MM-DD같은 date-only 값을 그냥new Date()로 파싱하면 로컬 타임존에 따라 하루씩 밀리는 버그가 잦다.parseDateOnly로 일괄 처리. - 한국어 locale:
dayjs().format("LL")같은 호출이 자동으로 한국어로 나오게.
워크플로우
1. 위치 결정
| 프로젝트 구조 | 파일 위치 |
|---|---|
src/ 구조 |
src/lib/dayjs.ts |
| 루트 직접 | lib/dayjs.ts |
다른 프로젝트들과 일관성 위해 dayjs.ts 파일명 그대로 둔다 (date.ts, date-utils.ts 등으로 바꾸지 않음).
2. 패키지 설치
pnpm add dayjs
3. 파일 생성
assets/dayjs.ts를 결정한 위치에 복사한다.
이미 lib/dayjs.ts가 있다면 → 사용자에게 기존 파일 보여주고 덮어쓸지 / 헬퍼만 추가할지 물어본다.
4. 기존 코드 마이그레이션 안내
스킬 실행 후 사용자에게 다음을 안내한다:
기존 코드에서
import dayjs from "dayjs"를 모두import dayjs from "@/lib/dayjs"로 바꿔야 합니다. 자동 변환을 원하시면 말씀해주세요.
자동 변환 요청 시:
# Next.js (alias가 @/ 인 경우)
grep -rl 'from ["\x27]dayjs["\x27]' src/ app/ components/ hooks/ 2>/dev/null \
| xargs -I{} sed -i '' 's|from "dayjs"|from "@/lib/dayjs"|g; s|from '''dayjs'''|from '''@/lib/dayjs'''|g' {}
(macOS sed 기준. 작업 전 git status 깨끗한지 확인하고 실행할 것.)
5. 사용 패턴 안내 (CLAUDE.md 추가)
선택적으로 다음 블록을 CLAUDE.md에 추가:
## 날짜 처리 규칙
- 모든 dayjs 호출은 `@/lib/dayjs`에서 import. 직접 `from "dayjs"` 금지.
- 이유: timezone/locale/plugin이 등록된 인스턴스를 보장하기 위함.
- date-only 문자열(YYYY-MM-DD)은 `parseDateOnly()` 사용. `new Date()` 직접 호출 금지.
- 입력 form의 Date + "HH:mm"은 `formatDateTime()` 사용.
산출물
lib/dayjs.ts(또는src/lib/dayjs.ts)package.json에dayjs추가- (선택) 기존 코드의 import 경로 일괄 변환
- (선택) CLAUDE.md에 날짜 규칙 블록
헬퍼 함수 요약
| 함수 | 입력 | 출력 | 용도 |
|---|---|---|---|
parseDateOnly(s) |
"2026-04-30" |
Dayjs | null |
date-only 컬럼 |
formatDateOnly(d) |
Date / Dayjs |
"2026-04-30" |
UI 표시용 |
parseTimestamp(s) |
ISO 문자열 | Dayjs | null |
created_at 등 |
formatDateTime(date, "14:30") |
Date + 시각 | ISO 문자열 (KST) | form 입력 |
extractTime(d) |
날짜값 | "14:30" |
시간만 표시 |