PHP 날짜 포맷은 문자가 날짜의 각 부분을 나타내는 문자열입니다. date('Y-m-d H:i:s')는 2026-03-14 09:05:07 같은 것을 출력합니다. Y는 4자리 연도, m은 월, d는 일, H는 시(24시간제), i는 분, s는 초이며, -, /, :처럼 포맷 문자가 아닌 문자는 그대로 출력됩니다. 같은 포맷 문자열이 date()와 DateTimeImmutable::format()에서 모두 동작합니다.
$format을 바꾸고 Run을 누르세요. 날짜가 2026년 3월 14일 토요일 09:05:07로 고정되어 있으므로 각 문자가 무엇을 하는지 정확히 볼 수 있습니다.
출력:
Sat, 14 Mar 2026 09:05
2026-03-14
14/03/2026
Saturday, March 14th, 2026
9:05 AM
date($format)은 현재 시각을, date($format, $timestamp)는 타임스탬프를 포맷하고, $date->format($format)은 날짜 객체를 포맷합니다. strtotime()부터 시간대까지 날짜에 관한 나머지는 PHP date() 페이지에 있습니다.
날짜 포맷 문자
아래의 모든 예는 UTC 2026-03-14 09:05:07.123456에 대한 결과입니다.
일
| 문자 | 의미 | 예 |
|---|---|---|
d | 월의 일, 앞에 0이 붙은 2자리(01부터 31) | 14 |
j | 앞에 0이 없는 월의 일(1부터 31) | 14 |
D | 짧은 요일 이름, 3글자 | Sat |
l(소문자 L) | 전체 요일 이름 | Saturday |
N | ISO 요일, 1(월요일)부터 7(일요일) | 6 |
w | 요일, 0(일요일)부터 6(토요일) | 6 |
S | 일에 붙는 영어 접미사: st, nd, rd, th. j 뒤에 쓰세요 | th |
z | 연중 일, 0부터 시작 | 72 |
주와 월
| 문자 | 의미 | 예 |
|---|---|---|
W | ISO 8601 주 번호(주는 월요일에 시작) | 11 |
F | 전체 월 이름 | March |
M | 짧은 월 이름, 3글자 | Mar |
m | 앞에 0이 붙은 월 숫자(01부터 12) | 03 |
n | 앞에 0이 없는 월 숫자(1부터 12) | 3 |
t | 그 달의 일수 | 31 |
연도
| 문자 | 의미 | 예 |
|---|---|---|
Y | 전체 연도, 최소 4자리 | 2026 |
y | 연도, 2자리 | 26 |
L | 윤년이면 1, 아니면 0 | 0 |
o | ISO 8601 주 기준 연도(W와 함께 쓰세요) | 2026 |
X | 부호가 붙은 확장 전체 연도(PHP 8.2+) | +2026 |
x | 확장 전체 연도, 필요할 때만 부호(PHP 8.2+) | 2026 |
시간
| 문자 | 의미 | 예 |
|---|---|---|
H | 시, 24시간제, 앞에 0(00부터 23) | 09 |
G | 시, 24시간제, 앞에 0 없음(0부터 23) | 9 |
h | 시, 12시간제, 앞에 0(01부터 12) | 09 |
g | 시, 12시간제, 앞에 0 없음(1부터 12) | 9 |
i | 앞에 0이 붙은 분(00부터 59) | 05 |
s | 앞에 0이 붙은 초(00부터 59) | 07 |
a | am 또는 pm | am |
A | AM 또는 PM | AM |
v | 밀리초 | 123 |
u | 마이크로초(정수 초를 받는 date()에서는 항상 000000) | 123456 |
B | 스와치 인터넷 시간(000부터 999) | 420 |
시간대
| 문자 | 의미 | 예 |
|---|---|---|
e | 시간대 식별자 | UTC |
T | 시간대 약어 | UTC |
P | 콜론이 있는 UTC 오프셋 | +00:00 |
p | P와 같지만 UTC는 Z | Z |
O | 콜론이 없는 UTC 오프셋 | +0000 |
Z | 초 단위 오프셋 | 0 |
I(대문자 i) | 서머타임 중이면 1, 아니면 0 | 0 |
전체 날짜와 시간
| 문자 | 의미 | 예 |
|---|---|---|
c | ISO 8601 날짜와 시간 | 2026-03-14T09:05:07+00:00 |
r | 이메일 헤더에 쓰는 RFC 2822 날짜 | Sat, 14 Mar 2026 09:05:07 +0000 |
U | 유닉스 타임스탬프(1970-01-01 UTC부터의 초) | 1773479107 |
같은 표를 직접 실행해 볼 수 있습니다. 이 블록은 고른 날짜에 대해 모든 문자를 출력합니다. 생일, 오후의 날짜, 윤년 말의 날짜를 넣어 보세요.
포맷 안에 문자와 단어 출력하기
포맷 문자열의 모든 문자는 포맷 문자로 읽히므로 'Today is l'은 "Today is"를 출력하지 않습니다. T, o, d, a, y, i, s가 모두 포맷 문자입니다. 그대로 출력할 문자마다 앞에 백슬래시를 붙이세요. 큰따옴표 문자열에서 \t는 이미 탭 문자이므로 백슬래시가 든 포맷에는 작은따옴표를 쓰세요.
출력:
UTC202614am26 0507 Saturday
Today is Saturday
Saturday the 14th of March
2026-03-14T09:05:07
Saturday 09UTC 14th
자주 쓰는 날짜 포맷
대부분의 코드에는 몇 가지 포맷만 필요합니다. 이 블록은 그것을 HTML 표로 출력하므로 Page 탭에 나타납니다.
날짜는 Y-m-d나 Y-m-d H:i:s로 저장하고 비교하세요. 그 순서의 문자열은 날짜와 같은 방식으로 정렬되지만 d/m/Y 문자열은 그렇지 않습니다.
ISO 8601, DATE_ATOM 등 표준 포맷
PHP에는 API, 피드, 쿠키가 기대하는 포맷을 위한 상수가 있습니다. DATE_ATOM(또는 DateTimeInterface::ATOM)은 ISO 8601이자 RFC 3339이며, JSON API가 쓰는 포맷입니다.
출력:
2026-03-14T09:05:07+00:00
2026-03-14T09:05:07+00:00
2026-03-14T09:05:07.000+00:00
Sat, 14 Mar 2026 09:05:07 +0000
Sat, 14 Mar 2026 09:05:07 +0000
Saturday, 14-Mar-2026 09:05:07 UTC
Y-m-d\TH:i:sP
DATE_ISO8601 상수도 있지만 오프셋에 콜론이 없어서(+0000) ISO 8601이 그 형태로는 허용하지 않습니다. DATE_ATOM을 쓰세요.
일본식 날짜 포맷(Y年m月d日)
포맷 문자가 아닌 문자는 그대로 출력되며, 한자도 마찬가지이므로 'Y年n月j日'은 쓴 그대로 동작합니다. n과 j는 앞의 0을 빼고(3月14日), m과 d는 유지합니다(03月14日). date()는 영어 이름만 알기 때문에 요일 이름은 번역할 수 없는 유일한 부분입니다. 대신 w 숫자를 직접 만든 목록에 대응시키세요.
출력:
2026年3月14日
2026年03月14日 09時05分
2026年3月14日(土)
2026/03/14
다른 언어의 월 이름과 일본 연호(令和)를 포함한 완전한 지역화에는 intl 확장의 IntlDateFormatter가 로케일 패턴으로 포맷합니다. 이 페이지의 PHP 문자가 아니라 ICU 패턴 문자(yyyy, MM, EEEE)를 씁니다.
<?php
$formatter = new IntlDateFormatter('ja_JP', IntlDateFormatter::FULL, IntlDateFormatter::NONE, 'Asia/Tokyo');
echo $formatter->format(new DateTimeImmutable('2026-03-14')); // 2026年3月14日土曜日
$era = new IntlDateFormatter('ja_JP@calendar=japanese', IntlDateFormatter::LONG, IntlDateFormatter::NONE, 'Asia/Tokyo', IntlDateFormatter::TRADITIONAL);
echo $era->format(new DateTimeImmutable('2026-03-14')); // 令和8年3月14日
날짜를 한 포맷에서 다른 포맷으로 변환하기
14/03/2026을 2026-03-14로 바꾸려면 DateTimeImmutable::createFromFormat()으로 문자열을 쓰인 포맷대로 파싱한 다음 다시 포맷하세요. 표와 같은 문자를 씁니다. 포맷을 !로 시작하세요. 그렇지 않으면 주지 않은 필드(여기서는 시간)가 현재 시각으로 채워집니다.
출력:
2026-03-14 00:00:00
March 14, 2026
bool(false)
2026-03-03
Array
(
[10] => The parsed date was invalid
)
사용자가 입력한 날짜라면 getLastErrors()의 모든 경고를 false와 똑같이 잘못된 날짜로 취급하세요.
날짜 포맷의 흔한 실수
세 가지 버그가 계속 나옵니다. i를 의도한 곳에 쓴 m, Y와 y, 그리고 일과 월의 순서를 strtotime()이 추측하게 두는 것입니다. strtotime()은 슬래시를 미국식 월/일 순서로, 대시나 점을 일-월 순서로 읽으므로 같은 숫자가 서로 다른 두 날짜가 됩니다.
출력:
09:03:07
09:05:07
14/03/26
2026-03-04
2026-04-03
bool(false)
입력의 포맷을 안다면 strtotime()이 추측하게 두지 말고 createFromFormat()으로 명시하세요.
자주 묻는 질문
PHP에서 date('Y-m-d')는 무엇을 뜻하나요?
각 문자가 날짜의 한 부분으로 바뀝니다. Y는 4자리 연도, m은 앞에 0이 붙은 월, d는 앞에 0이 붙은 일이며, 대시는 그대로 출력됩니다. 2026년 3월 14일에는 2026-03-14를 반환합니다.
PHP에서 날짜를 한 포맷에서 다른 포맷으로 변환하려면 어떻게 하나요?
현재 포맷으로 파싱한 다음 원하는 포맷으로 출력하세요: DateTimeImmutable::createFromFormat('!d/m/Y', '14/03/2026')->format('Y-m-d')는 2026-03-14를 반환합니다. 문자열이 맞지 않으면 createFromFormat()이 false를 반환하므로 먼저 확인하세요.
PHP 날짜 포맷에서 m과 i의 차이는 무엇인가요?
m은 월(01부터 12)이고 i는 분(00부터 59)입니다. 'H:i' 대신 'H:m'이라고 쓰는 것은 흔한 버그로, 분이 있어야 할 자리에 월 숫자가 보입니다.
PHP에서 날짜를 ISO 8601로 포맷하려면 어떻게 하나요?
c 문자나 DATE_ATOM 상수를 쓰세요: $date->format(DATE_ATOM)은 2026-03-14T09:05:07+00:00을 반환합니다. DATE_ISO8601은 피하세요. 오프셋에 콜론이 없어서(+0000) 올바른 ISO 8601이 아닙니다.
PHP date()로 요일을 한국어나 일본어로 보여 주려면 어떻게 하나요?
date()는 영어 이름만 출력하므로 w 숫자(일요일 0부터 토요일 6까지)를 직접 만든 목록에 대응시키세요: ['日','月','火','水','木','金','土'][$date->format('w')]. intl 확장이 있다면 IntlDateFormatter가 어떤 로케일로든 날짜 전체를 포맷할 수 있습니다.