PHP의 시간대
DateTimeZone과 date_default_timezone_set으로 여러 시간대를 처리합니다.
PHP의 시간대은(는) CoddyKit의 무료 PHP Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 PHP Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. PHP Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
시간대가 중요한 이유
애플리케이션이 전 세계 사용자에게 서비스를 제공한다면 시간대 처리가 매우 중요합니다. PHP는 변환을 올바르게 처리하기 위해 시간대를 인식하는 함수와 클래스를 사용합니다.
- 데이터베이스에는 항상 시간을 UTC로 저장합니다
- 표시할 때만 사용자의 현지 시간대로 변환합니다
date_default_timezone_set()
모든 날짜 함수의 기본 시간대를 설정합니다:
<?php
// Set at the top of your script or in php.ini
date_default_timezone_set('Europe/Istanbul');
echo date('Y-m-d H:i:s'); // local Istanbul time
echo PHP_EOL;
date_default_timezone_set('UTC');
echo date('Y-m-d H:i:s'); // UTC time
// Or set in php.ini:
// date.timezone = "Europe/London"DateTimeZone 클래스
DateTime과 함께 사용할 시간대 객체를 생성합니다:
<?php
$utc = new DateTimeZone('UTC');
$istanbul = new DateTimeZone('Europe/Istanbul');
$ny = new DateTimeZone('America/New_York');
$dt = new DateTime('now', $utc);
echo $dt->format('Y-m-d H:i:s T'); // UTC time시간대 간 변환
setTimezone()을 사용하여 DateTime을 다른 시간대로 변환합니다:
<?php
$utcTime = new DateTime('2024-05-27 12:00:00', new DateTimeZone('UTC'));
$istanbul = clone $utcTime;
$istanbul->setTimezone(new DateTimeZone('Europe/Istanbul'));
$newYork = clone $utcTime;
$newYork->setTimezone(new DateTimeZone('America/New_York'));
echo 'UTC: ' . $utcTime->format('H:i T') . PHP_EOL;
echo 'Istanbul: ' . $istanbul->format('H:i T') . PHP_EOL;
echo 'New York: ' . $newYork->format('H:i T') . PHP_EOL;getOffset() 및 DST
UTC 오프셋을 초 단위로 가져오고 DST를 확인합니다:
<?php
$tz = new DateTimeZone('America/New_York');
$dt = new DateTime('now', $tz);
$offset = $tz->getOffset($dt); // offset in seconds
$offsetHours = $offset / 3600;
echo 'Offset: ' . $offsetHours . 'h'; // e.g. -5 or -4 in DST
$transitions = $tz->getTransitions(
strtotime('2024-01-01'),
strtotime('2024-12-31')
);
echo 'DST changes in 2024: ' . count($transitions);UTC로 저장하고 현지 시간으로 표시
권장 방식: 데이터베이스에는 UTC로 저장하고 사용자에게는 현지 시간을 표시합니다:
<?php
// Store: always save as UTC
$createdAt = (new DateTimeImmutable('now', new DateTimeZone('UTC')))
->format('Y-m-d H:i:s');
// Display: convert to user's timezone
$userTz = new DateTimeZone($user['timezone'] ?? 'UTC');
$display = (new DateTime($createdAt, new DateTimeZone('UTC')))
->setTimezone($userTz)
->format('d M Y, H:i T');사용자 시간대 감지
표시 목적으로 사용자의 시간대를 감지하고 저장합니다:
// JavaScript: detect and send to PHP:
// const tz = Intl.DateTimeFormat().resolvedOptions().timeZone;
// fetch('/api/set-timezone', { method:'POST', body: tz });
<?php
// PHP: validate and store
$tz = $_POST['timezone'] ?? 'UTC';
$valid = in_array($tz, DateTimeZone::listIdentifiers());
if ($valid) {
$_SESSION['timezone'] = $tz;
setcookie('user_tz', $tz, time() + 365 * 86400);
}DateTimeZone::listIdentifiers()
유효한 모든 시간대 식별자를 가져옵니다:
<?php
// All identifiers
$all = DateTimeZone::listIdentifiers();
echo count($all) . ' timezones available';
// Filter by region
$europe = DateTimeZone::listIdentifiers(DateTimeZone::EUROPE);
echo count($europe) . ' European timezones';
// Check if a timezone string is valid
function isValidTimezone(string $tz): bool {
return in_array($tz, DateTimeZone::listIdentifiers());
}
var_dump(isValidTimezone('Europe/Istanbul')); // true시간대 오프셋 형식 지정
표시 및 API용으로 시간대 오프셋의 형식을 지정합니다:
<?php
$dt = new DateTime('now', new DateTimeZone('America/Los_Angeles'));
echo $dt->format('P'); // +05:30 or -07:00
echo $dt->format('O'); // +0530 (no colon)
echo $dt->format('T'); // PST or PDT
echo $dt->format('e'); // America/Los_Angeles
echo $dt->format('Z'); // offset in seconds유닉스 타임스탬프는 시간대와 무관합니다
유닉스 타임스탬프는 시간대와 관계없이 특정 시점을 나타냅니다. 비교와 계산에 사용합니다:
<?php
// These represent the same moment:
$utc = new DateTime('2024-05-27 12:00:00', new DateTimeZone('UTC'));
$ist = new DateTime('2024-05-27 15:00:00', new DateTimeZone('Asia/Kolkata'));
echo $utc->getTimestamp(); // same timestamp
echo $ist->getTimestamp(); // same timestamp
var_dump($utc->getTimestamp() === $ist->getTimestamp()); // true시간대와 함께 date_create 사용
date_create와 date_timezone_set을 사용한 절차적 시간대 처리입니다:
<?php
$dt = date_create('now', timezone_open('UTC'));
$tz = timezone_open('Europe/Istanbul');
date_timezone_set($dt, $tz);
echo date_format($dt, 'Y-m-d H:i:s T');
// Check transition info
$info = timezone_transitions_get($tz);
echo 'Current offset: ' . ($info[0]['offset'] / 3600) . 'h';빠른 확인
전 세계에 분산된 애플리케이션에서는 날짜와 시간을 데이터베이스의 어디에 저장해야 합니까?
복습: PHP 시간대
시간대 핵심 사항:
date_default_timezone_set()으로 기본 시간대를 설정합니다- DateTime과 함께
DateTimeZone객체를 사용합니다 setTimezone()으로 시간대 간 변환을 수행합니다- 데이터베이스에는 항상 UTC로 저장합니다
DateTimeZone::listIdentifiers()로 사용자 시간대의 유효성을 검사합니다- 유닉스 타임스탬프는 시간대와 무관한 시점을 나타냅니다
자주 묻는 질문
“PHP의 시간대” 강의는 무료인가요?
네 — “PHP의 시간대” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 PHP Academy 강의 전체를 잠금 해제할 수 있습니다. PHP Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“PHP의 시간대”에서 뭘 배우나요?
DateTimeZone과 date_default_timezone_set으로 여러 시간대를 처리합니다. 브라우저에서 직접 실행하는 실습 코드로 PHP Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
PHP Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 PHP Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.
“PHP의 시간대” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 PHP Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 PHP Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.