자바스크립트 Date 객체 메소드 정리 – 날짜·시간 다루기
1. Date 객체 핵심 개념
- 기준 시점: 1970-01-01 00:00:00 UTC
- 정밀도: 1 밀리초(ms)
- 생성자:
new Date()만 사용,Date는 래퍼가 아님 - 로컬 vs UTC: 내부 저장은 UTC, 표시·계산 시 타임존 보정
2. 날짜 객체 빠르게 만들기
| 패턴 | 설명 | 예시 |
|---|---|---|
new Date() |
현재 날짜/시간 | new Date() |
new Date("YYYY-MM-DD") |
문자열 기반 | new Date("2024-05-24") |
new Date(ms) |
1970년 이후 밀리초 | new Date(86_400_000) |
new Date(y, m, d, h, mi, s, ms) |
숫자 지정 (월 0-11!) | new Date(2024, 4, 24) → 5월24일 |
월(month)은 0부터 11 (0 = 1월)임을 항상 기억하세요.
3. Date.now() – 밀리초 타임스탬프
const nowMs = Date.now(); // 예: 1716540000000
const nowObj = new Date(nowMs); // 동일 시각 Date 객체
- 고해상도 시간차 계산에 가장 안전
4. Date.prototype Getter 메소드
4-1 로컬 시간용 Getter
| 메소드 | 반환 | 범위 |
|---|---|---|
getFullYear() |
연도 | 4자리 |
getMonth() |
월 | 0-11 |
getDate() |
일(1-31) | |
getDay() |
요일(0=일) | 0-6 |
getHours() |
시 | 0-23 |
getMinutes() / getSeconds() |
분 / 초 | 0-59 |
getMilliseconds() |
ms | 0-999 |
getTime() |
1970 이후 ms | – |
getTimezoneOffset() |
UTC-로컬 분 차이 | KST → -540 |
✔ 요일 출력 예시
const days = ["일", "월", "화", "수", "목", "금", "토"];
console.log(`오늘은 ${days[new Date().getDay()]}요일`);
4-2 UTC Getter
getUTCFullYear(), getUTCMonth(), getUTCDate(), getUTCHours() …
서버 UTC 시간과 비교하거나, 타임존 무시 로직에서 사용.
5. Date.prototype Setter 메소드
| 메소드 | 기능 | 허용 범위 |
|---|---|---|
setFullYear(y, m?, d?) |
연도(+월/일) | 연, 월 0-11 |
setMonth(m) |
월 | 0-11 |
setDate(d) |
일 | 1-31 초과 시 자동 보정 |
setHours(h) / setMinutes(mi) / setSeconds(s) |
시·분·초 | 0-23 / 0-59 |
setMilliseconds(ms) |
ms | 0-999 |
setTime(ms) |
1970 기준 ms 지정 | – |
자동 보정
const d = new Date(); d.setDate(40); // 40 → 다음 달로 롤오버
UTC Setter
setUTCFullYear(), setUTCMonth() … → 협정 세계시 기준으로 값 변경.
6. 날짜 차이 계산 – “D-Day” 만들기
const start = new Date(); // 오늘
const target = new Date("2030-12-25"); // 목표일
const oneDay = 86_400_000; // ms
const diff = Math.floor((target - start) / oneDay);
console.log(`크리스마스까지 ${diff}일 남았습니다!`);
7. 원하는 포맷(yyyy-mm-dd)으로 변환
전통적인 패딩 방법
function toYMD(d) {
const y = d.getFullYear();
const m = String(d.getMonth() + 1).padStart(2, "0");
const da = String(d.getDate()).padStart(2, "0");
return `${y}-${m}-${da}`;
}
Intl.DateTimeFormat 활용
const ymd = new Intl.DateTimeFormat("sv-SE", {
dateStyle: "short",
}).format(new Date()); // "2025-06-03"
8. 타임존 – 한국 KST ↔ UTC 변환
// 한국(KST) → UTC
const kst = new Date();
const utc = new Date(kst.getTime() - 9 * 60 * 60 * 1000);
// UTC 문자열 → KST 표시
const utcStr = "2025-12-31T15:00:00Z";
console.log(
new Date(utcStr).toLocaleString("ko-KR", { timeZone: "Asia/Seoul" })
);
9. Getter & Setter 메소드 요약표
| 분류 | 대표 메소드 | 설명 |
|---|---|---|
| 날짜 | getFullYear, getMonth, getDate |
연·월·일 |
| 시간 | getHours, getMinutes, getSeconds |
시·분·초 |
| 밀리초/오프셋 | getMilliseconds, getTime, getTimezoneOffset |
정밀 계산 |
| 요일 | getDay |
0 = 일 |
| UTC | getUTC…, setUTC… |
UTC 기준 |
| Setter 핵심 | setFullYear, setMonth, setDate, setHours, setTime |
값 변경 |
질문 정리
-
월이 0부터 시작하는 이유는?
초기 C 언어 시절 배열 인덱스를 그대로 따온 역사적 이유입니다.
-
new Date("2025-02-30")은 오류가 나나요?아니요. 자바스크립트는 유효한 날짜가 될 때까지 롤오버 하여 3월 2일로 자동 조정합니다.
-
밀리초 대신 초 단위가 필요하면?
Math.floor(Date.now() / 1000)으로 간단히 변환 가능합니다. -
서머타임(DST)까지 정확히 처리하려면?
Intl.DateTimeFormat의timeZone옵션을 사용하거나, Luxon / Day.js 같은 라이브러리를 도입하세요. -
Temporal API는 언제 써야 하나요?
복잡한 달력·타임존 로직이 많을 때 권장합니다. 현재 Stage-3 이므로 폴리필과 함께 사용하세요.
댓글남기기