Menu

PHP 날짜 date(): 현재 날짜, 포맷, 날짜 계산

date('Y-m-d')는 오늘 날짜를 문자열로 반환하고, date('Y-m-d', $timestamp)는 어떤 유닉스 타임스탬프든 포맷합니다. time(), mktime(), strtotime(), DateTimeImmutable, 날짜 더하기, 두 날짜의 차이, 시간대를 실행 가능한 예제로 알아봅니다.

이 페이지에는 실행 가능한 에디터가 있습니다 - 편집하고 실행하면 결과를 바로 볼 수 있습니다.

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을 넘기세요.

Coddy 프로그래밍 언어 일러스트

Coddy로 코딩 배우기

시작하기