date('Y-m-d')는 2026-03-14처럼 오늘 날짜를 문자열로 반환합니다. 첫 번째 인수는 각 문자가 날짜의 한 부분을 나타내는 포맷 문자열이고(Y는 연도, m은 월, d는 일, H:i:s는 시간), 선택적인 두 번째 인수는 현재 시각 대신 포맷할 유닉스 타임스탬프입니다.
UTC 기준의 현재 날짜와 시간이므로 Run을 누를 때마다 출력이 바뀝니다. 포맷 문자열의 모든 문자와 그 사이에 일반 텍스트를 넣는 방법은 PHP 날짜 포맷 페이지에 있습니다.
타임스탬프: time(), mktime(), strtotime()
유닉스 타임스탬프는 1970년 1월 1일 자정 UTC부터 지난 초의 수입니다. time()은 현재 값을 반환하고, mktime(hour, minute, second, month, day, year)는 부분들로 만들며, strtotime()은 영어로 쓴 날짜('2026-03-14', '+1 week', 'next monday')를 읽습니다. 어떤 타임스탬프든 date()의 두 번째 인수로 넘기세요. strtotime()의 두 번째 인수는 상대적인 표현이 기준으로 삼는 시각이며, 없으면 지금부터 셉니다.
출력:
1773480600
Sat, 14 Mar 2026 09:30
2027-01-01
tomorrow Sun 2026-03-15
+1 week Sat 2026-03-21
next monday Mon 2026-03-16
last day of this month Tue 2026-03-31
first monday of next month Mon 2026-04-06
bool(false)
mktime()의 넘김 처리는 유용합니다. 어떤 달의 0일은 그 전 달의 마지막 날이므로 mktime(0, 0, 0, 3, 0, 2026)은 2월 28일입니다. 결과를 넘기기 전에 항상 false와 비교하세요. date('Y-m-d', false)는 아무도 의도하지 않은 날짜 1970-01-01을 조용히 출력합니다.
날짜에 일수 더하기
출력 이상의 작업에는 DateTimeImmutable을 쓰세요. 그 modify() 메서드는 strtotime()과 같은 표현을 받고 새 날짜를 반환하며, add()는 P7D(7일 기간)나 PT90M(90분) 같은 DateInterval을 받습니다.
출력:
2026-03-21
2026-03-13
2026-04-14
11:00
2025-03-14
2026-03-03
2026-02-28
2월 31일은 존재하지 않으므로 1월 31일에 +1 month를 하면 3월 3일이 됩니다. "다음 달 말일"을 뜻한다면 last day of next month로 그렇게 말하세요.
DateTime과 DateTimeImmutable
DateTime은 modify(), add(), setDate()를 호출하면 자신을 바꾸고 같은 객체를 반환합니다. 원래 날짜를 변수에 보관하는 사람들은 이에 놀랍니다.
출력:
2026-03-21
2026-03-21
bool(true)
2026-03-14
2026-03-21
새 코드에서는 DateTimeImmutable을 쓰세요. 두 클래스는 같은 메서드를 가지고 둘 다 DateTimeInterface를 구현하므로, 함수는 둘 중 무엇이든 받을 수 있습니다.
두 날짜의 차이
diff()는 DateInterval을 반환합니다. 그 days 속성은 두 날짜 사이의 전체 일수이고, y, m, d는 차이를 년, 월, 일로 나누며, 나이 계산에 바로 필요한 것입니다. 날짜를 바꾸고 다시 실행해 보세요.
출력:
Age: 35
Exactly: 35 years, 7 months, 22 days
Days alive: 13021
286 days to go
9 months and 11 days
-286 days
format()에서 %a는 전체 일수이고 %d는 일 부분만이므로, "며칠 남았나"에는 %a를 쓰세요. 차이 없이 두 날짜를 비교하려면 날짜 객체에 일반 연산자가 동작합니다: $today < $christmas는 true입니다.
시간대
date()와 new DateTimeImmutable()은 php.ini의 date.timezone에서 오는 기본 시간대를 씁니다(설정되지 않으면 UTC). date_default_timezone_set()으로 스크립트 전체에 설정하거나, 날짜 하나에 자신의 DateTimeZone을 주고 setTimezone()으로 변환하세요.
출력:
Asia/Tokyo 2026-03-14 18:30 JST +09:00
Europe/Berlin 2026-03-14 10:30 CET +01:00
America/New_York 2026-03-14 05:30 EDT -04:00
Asia/Tokyo
2026-03-14 18:30
타임스탬프는 어디서나 같은 숫자이고, 시간대는 그것을 쓰는 방식만 바꿉니다. 그래서 날짜는 UTC로 저장하고 표시할 때 변환하라는 것이 일반적인 조언입니다.
웹 페이지에 달력 보여 주기
날짜는 HTML에 출력되는 경우가 가장 많습니다. 이 블록은 이번 달을 달력으로 그리고 오늘을 강조합니다. 실행한 다음 Previous나 Next를 클릭하세요. 링크에서 ?m=2026-04처럼 설정된 $_GET['m']으로 같은 스크립트가 다시 실행됩니다.
format('N')은 요일을 1(월요일)부터 7(일요일)로 주며, 1일 앞에 빈 칸이 몇 개 들어갈지가 이것으로 정해집니다. format('t')는 그 달의 일수를 줍니다. '!Y-m'의 !는 포맷이 언급하지 않는 모든 필드를 초기화하므로 일은 1일, 시간은 자정이 됩니다.
date()의 흔한 실수
date()의 두 번째 인수는 날짜 문자열이 아니라 타임스탬프여야 합니다. 이 줄은
<?php
echo date('d/m/Y', '2026-03-14');
TypeError와 함께 스크립트를 멈춥니다.
PHP Fatal error: Uncaught TypeError: date(): Argument #2 ($timestamp) must be of type ?int, string given in /home/index.php:2
먼저 strtotime()이나 객체로 문자열을 변환하세요.
출력:
14/03/2026
14/03/2026
bool(false)
bool(true)
주의할 것이 두 가지 더 있습니다. m은 월이고 i는 분이므로 'H:m'은 분을 원한 자리에 월을 출력합니다. 그리고 new DateTimeImmutable('garbage')는 false를 반환하는 대신 예외를 던지므로, 사용자 입력은 try/catch로 감싸거나, 형식이 맞지 않으면 false를 반환하는 DateTimeImmutable::createFromFormat()으로 파싱하세요.
자주 묻는 질문
PHP에서 현재 날짜를 얻으려면 어떻게 하나요?
포맷 문자열과 함께 date()를 호출하세요. echo date('Y-m-d');는 오늘 날짜를 2026-03-14처럼 출력하고, date('Y-m-d H:i:s')는 시간을 덧붙입니다. 객체 버전은 (new DateTimeImmutable())->format('Y-m-d')입니다.
PHP에서 날짜에 일수를 더하려면 어떻게 하나요?
DateTimeImmutable에 modify()를 쓰세요: (new DateTimeImmutable('2026-03-14'))->modify('+7 days')->format('Y-m-d')는 2026-03-21을 줍니다. 타임스탬프라면 date('Y-m-d', strtotime('+7 days', $timestamp))가 같은 일을 합니다.
PHP에서 두 날짜의 차이를 계산하려면 어떻게 하나요?
한 날짜에서 다른 날짜와 함께 diff()를 호출하세요. $a->diff($b)는 DateInterval을 반환합니다. 그 days 속성은 전체 일수이고, y, m, d는 년, 월, 일을 담으며, 나이를 계산하는 방법이 이것입니다.
PHP에서 유닉스 타임스탬프를 날짜로 변환하려면 어떻게 하나요?
date()의 두 번째 인수로 넘기세요: date('Y-m-d H:i:s', 1773479107)는 UTC로 2026-03-14 09:05:07을 반환합니다. 객체로는 new DateTimeImmutable('@1773479107')를 쓰세요.
PHP date()가 잘못된 시간을 보여 주는 이유는 무엇인가요?
date()는 php.ini의 date.timezone에서 오는 기본 시간대를 쓰며, 이는 흔히 UTC입니다. 스크립트 맨 위에서 date_default_timezone_set('Europe/Berlin')으로 직접 설정하거나, DateTimeImmutable에 DateTimeZone을 넘기세요.