0Pricing
PHP Academy · レッスン

PHPのタイムゾーン

DateTimeZoneとdate_default_timezone_setを使って複数のタイムゾーンを扱います

「PHPのタイムゾーン」はCoddyKit上の無料PHP Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応の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

Unix タイムスタンプはタイムゾーンに依存しない

Unix タイムスタンプは、タイムゾーンに関係なく特定の時点を表します。比較や計算にはこれを使用します。

<?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() でユーザーのタイムゾーンを検証する
  • Unix タイムスタンプはタイムゾーンに依存しない時点を表す

よくある質問

「PHPのタイムゾーン」レッスンは無料ですか?

はい。「PHPのタイムゾーン」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、PHP Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 PHP Academyコースには全4レッスンが含まれています。

「PHPのタイムゾーン」で何を学びますか?

DateTimeZoneとdate_default_timezone_setを使って複数のタイムゾーンを扱います ブラウザで直接実行するハンズオンコードでPHP Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

PHP Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのPHP Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「PHPのタイムゾーン」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このPHP Academyレッスンでコードを書いて実行できますか?

はい。すべてのPHP Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Unixタイムスタンプとdate()
  2. DateTimeクラス
  3. DateIntervalによる日付の計算
  4. PHPのタイムゾーン
← PHP Academyに戻る