HOWTO · PHP
PHP에서 문자열을 날짜 및 날짜-시간으로 변환하는 방법
PHP에서 날짜 문자열을 파싱하는 방법을 알아봅니다. `strtotime()`와 `date()`를 조합하거나 `DateTime::createFromFormat()` 또는 `date_create_from_format()`을 사용할 수 있습니다.
이 페이지의 내용
날짜 문자열은 PHP가 파싱하기 전까지 텍스트입니다. 파싱은 그 텍스트를 타임스탬프나 날짜·시간 객체로 해석하는 과정이며, 서식 지정은 파싱한 값을 애플리케이션에 필요한 표현으로 바꾸는 과정입니다. 익숙하고 모호하지 않은 날짜 표현에는 strtotime()를 사용하세요. 입력 형식이 정해져 있다면 DateTime::createFromFormat() 또는 이에 대응하는 절차형 함수인 date_create_from_format()로 형식을 명시하는 편이 좋습니다.
적절한 PHP 날짜 파싱 방식 선택하기
유연한 해석이 허용되는 경우 ISO 형식 날짜처럼 흔히 쓰이는 문자열에 strtotime()를 사용하세요. 이 함수는 유닉스 타임스탬프 또는 false를 반환하고, date()는 타임스탬프의 서식을 지정합니다. 입력 패턴이 고정되어 있다면 DateTime::createFromFormat() 방식으로 예상되는 필드 순서를 명확히 지정할 수 있으며, 날짜·시간 객체 또는 false가 반환됩니다. 절차형 함수인 date_create_from_format()는 정적 메서드를 직접 호출하지 않고 같은 방식으로 파싱합니다.
이 함수들은 모호한 입력을 명확하게 만들어 주지 않습니다. 사용자가 서로 다른 표기 관례로 날짜를 입력할 수 있다면 입력 단계에서 예상 형식을 정하고 검증하세요. 어떤 방식을 사용하든 날짜·시간을 해석할 때는 시간대를 신중하게 선택하세요. 그렇지 않으면 PHP에 설정된 기본 시간대가 사용됩니다.
strtotime()와 date()로 유연한 날짜 문자열 파싱하기
익숙한 날짜·시간 문자열은 strtotime()로 파싱하고, 반환된 타임스탬프를 date()에 전달하세요. 파싱에 실패한 값이 타임스탬프로 사용되지 않도록 서식을 지정하기 전에 반환값이 false인지 확인하세요. 예제는 고정된 입력과 출력 형식을 사용하므로 컴퓨터의 현재 시각과 관계없이 결과를 재현할 수 있습니다.
다음 예제를 실행해 보세요. 성공하면 날짜·시간이 표시되고, 파싱에 실패하면 오류 메시지가 표시됩니다. 코드 블록은 바이트 단위로 유지되므로 그 메시지는 영어로 남습니다.
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
<?php
$dateString = '2023-10-15 14:30:00';
$timestamp = strtotime($dateString);
if ($timestamp === false) {
echo "Could not parse the date string.";
} else {
echo date('Y-m-d H:i:s', $timestamp);
}
strtotime()는 다양한 날짜 표현을 받아들이지만, 이런 유연성이 입력 형식을 미리 정하는 일을 대신하지는 않습니다. 반환값은 시간대 규칙에 따라 해석된 시점을 나타내며, date()는 PHP의 기본 시간대를 사용해 타임스탬프의 서식을 지정합니다. 원본의 시간대를 알고 있다면 서버 설정에 의존하지 말고 입력에 포함하거나 명시적으로 적용하세요.
DateTime::createFromFormat()로 정해진 형식의 문자열 파싱하기
문자열의 구성이 정해져 있다면 이에 맞는 형식 문자열을 지정하세요. 아래 형식에서 d, m, Y, H, i는 각각 일, 월, 네 자리 연도, 시, 분을 나타냅니다. 맨 앞의 !는 입력에 없는 필드를 현재 날짜의 초나 다른 값에서 이어받는 대신 초기화합니다.
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
<?php
$dateString = '15-10-2023 14:30';
$dateFormat = '!d-m-Y H:i';
$dateTime = DateTime::createFromFormat($dateFormat, $dateString);
if ($dateTime === false) {
echo "Could not parse the date string.";
} else {
echo $dateTime->format('Y-m-d H:i:s');
}
형식 문자열은 원하는 출력이 아니라 입력의 구성을 설명해야 합니다. 파싱한 뒤에는 원하는 출력 패턴을 지정해 format()을 호출하세요. 결과가 false가 아니더라도 모든 날짜 구성 요소가 의도한 대로 정확히 받아들여졌다는 뜻은 아닙니다. PHP는 범위를 벗어난 일부 값을 정규화하고 경고를 보고할 수 있습니다. 엄격하게 입력을 검증하려면 아래에서 설명하는 것처럼 파싱 후 DateTime::getLastErrors()를 확인하세요.
절차형 date_create_from_format() 함수 사용하기
절차형 함수는 PHP 날짜 함수를 이미 사용하는 코드에서 편리합니다. 같은 입력 형식과 문자열을 받으며, 파싱에 성공하면 DateTime 객체를 반환하고 실패하면 false를 반환합니다. 반환값이 객체인지 확인한 뒤에만 date_format()으로 서식을 지정하세요.
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
<?php
$dateString = '2023/10/15 14:30';
$dateFormat = '!Y/m/d H:i';
$dateTime = date_create_from_format($dateFormat, $dateString);
if ($dateTime === false) {
echo "Could not parse the date string.";
} else {
echo date_format($dateTime, 'Y-m-d H:i:s');
}
이 함수는 DateTime::createFromFormat()의 절차형 대안입니다. 두 함수 모두 지정된 형식에 따라 파싱해 DateTime 객체를 반환합니다. 주변 코드에 어울리는 방식을 선택하세요. 둘 중 하나를 선택하기 위해 PHP 버전을 단정할 필요는 없습니다. API를 사용할 수 있는지 확인하려면 애플리케이션이 지원하는 PHP 버전의 문서를 참고하세요.
모호한 입력, 파싱 오류, 시간대 처리하기
03/04/2023과 같은 문자열은 날짜 표기 관례에 따라 3월 4일 또는 4월 3일을 뜻할 수 있습니다. 구분자만 보고 의미를 판단하지 마세요. 입력 형식이 정해져 있다면 정확한 형식을 DateTime::createFromFormat()에 전달하고 결과를 검증하세요. strtotime()는 관례적이고 명확하게 지정된 문자열을 처리하기에 편리하지만, 사용자가 의도한 표기 관례를 추론할 수는 없습니다.
DateTime::createFromFormat()와 date_create_from_format()는 false를 반환할 수 있습니다. 객체 메서드나 date_format()을 호출하기 전에 반환값을 확인하세요. 파싱 경고를 보고하면서 값을 받아들이는 경우도 있습니다. 예를 들어 PHP가 날짜 구성 요소를 정규화할 수 있습니다. 날짜가 달력상 정확히 유효해야 한다면 파싱 진단 정보도 확인하세요.
코드 블록은 바이트 단위로 유지되므로 성공 시 표시되는 날짜 형식과 실패 시 표시되는 메시지 모두 영어로 남습니다.
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
<?php
$dateTime = DateTime::createFromFormat('!Y-m-d', '2023-02-31');
$errors = DateTime::getLastErrors();
if ($dateTime === false || ($errors !== false && ($errors['warning_count'] > 0 || $errors['error_count'] > 0))) {
echo "The date is not valid for the specified format.";
} else {
echo $dateTime->format('Y-m-d');
}
!는 지정되지 않은 필드를 초기화하고, getLastErrors()는 가장 최근 파싱에서 발생한 경고와 오류를 보고합니다. 진단 세부 사항은 PHP 버전에 따라 다를 수 있으므로 애플리케이션이 지원하는 버전에서 검증 정책을 확인하세요. 특정 지역의 날짜·시간을 다룰 때는 해당 지역을 지정한 DateTimeZone을 만들고 DateTime::createFromFormat()의 세 번째 인수로 전달하세요. 절차형 함수에는 이에 대응하는 시간대 인수를 전달하면 됩니다. 입력에 UTC 오프셋이 명시되어 있다면 화면에 표시하기 전에 그 오프셋을 유지할지 변환할지 의도적으로 결정하세요.