PHPで日付や時刻を扱う場合、タイムゾーンの設定は非常に重要です。
タイムゾーンが正しく設定されていないと、date() や DateTime で取得した時刻が日本時間とずれたり、ログ・予約投稿・会員登録日時・決済日時などに誤差が出たりする可能性があります。
日本向けのWebサイトやシステムであれば、基本的には以下のタイムゾーンIDを使用します。
Asia/Tokyo
PHPでタイムゾーンを設定する方法は、主に次の2つです。
date.timezone = "Asia/Tokyo"
または、
date_default_timezone_set('Asia/Tokyo');
サーバー全体に適用したい場合は php.ini、アプリケーション単位で設定したい場合はPHPコード内で指定するのが一般的です。
PHPでタイムゾーンを設定する主な方法
PHPのタイムゾーン設定には、いくつかの方法があります。
どの方法を選ぶべきかは、サーバー環境や使用しているフレームワークによって異なります。
php.iniで設定する方法
PHP全体のタイムゾーンを設定したい場合は、php.ini に以下のように記述します。
date.timezone = "Asia/Tokyo"
php.ini に設定しておくと、そのPHP環境で動作するスクリプト全体にデフォルトのタイムゾーンとして適用されます。
日本向けサイトであれば、基本的には以下のように設定して問題ありません。
[Date]
date.timezone = "Asia/Tokyo"
[Date] セクションがすでにある場合は、その中に追記します。
すでに date.timezone の記述がある場合は、値を Asia/Tokyo に変更してください。
php.iniの場所を確認する方法
php.ini の場所は、サーバー環境によって異なります。
どの php.ini が読み込まれているか確認したい場合は、以下のPHPファイルを作成します。
<?php
phpinfo();
ブラウザで表示し、以下の項目を確認します。
Loaded Configuration File
ここに表示されているファイルが、現在読み込まれている php.ini です。
コマンドラインから確認する場合は、以下を実行します。
php --ini
または、
php -i | grep "Loaded Configuration File"
CLI版PHPとWebサーバー経由のPHPでは、読み込まれる php.ini が異なる場合があります。
そのため、Webサイトで使われている設定を確認したい場合は、ブラウザ経由で phpinfo() を確認するのが確実です。
php.ini変更後は再起動が必要
php.ini を編集した後は、WebサーバーやPHP-FPMの再起動が必要になる場合があります。
Apacheの場合は、以下のように再起動します。
sudo systemctl restart apache2
CentOSやRHEL系では、以下のコマンドになることがあります。
sudo systemctl restart httpd
PHP-FPMを使用している場合は、PHPのバージョンに合わせて再起動します。
sudo systemctl restart php8.3-fpm
Nginx + PHP-FPMの環境では、PHP-FPMとNginxの両方を再起動するケースもあります。
sudo systemctl restart php8.3-fpm
sudo systemctl restart nginx
PHPコード内でタイムゾーンを設定する方法
php.ini を編集できない場合や、アプリケーション単位でタイムゾーンを指定したい場合は、PHPコード内で設定します。
date_default_timezone_setを使う方法
PHPコード内でタイムゾーンを設定するには、date_default_timezone_set() を使います。
<?php
date_default_timezone_set('Asia/Tokyo');
echo date('Y-m-d H:i:s');
この設定を行うと、そのスクリプト内で実行される日付・時刻関数のデフォルトタイムゾーンが Asia/Tokyo になります。
設定は初期化ファイルに書く
複数のPHPファイルで同じタイムゾーンを使う場合は、各ファイルに毎回書くのではなく、共通の初期化ファイルに書くのがおすすめです。
例えば、config.php に以下のように記述します。
<?php
date_default_timezone_set('Asia/Tokyo');
各ページで config.php を読み込みます。
<?php
require_once __DIR__ . '/config.php';
echo date('Y-m-d H:i:s');
このようにしておけば、タイムゾーン設定を一元管理できます。
現在のタイムゾーンを確認する方法
タイムゾーンが正しく設定されているか確認したい場合は、date_default_timezone_get() を使います。
date_default_timezone_getで確認する
以下のコードを実行すると、現在のデフォルトタイムゾーンを確認できます。
<?php
echo date_default_timezone_get();
正しく設定されていれば、以下のように表示されます。
Asia/Tokyo
また、現在時刻も合わせて確認したい場合は、以下のように書くと便利です。
<?php
echo 'Timezone: ' . date_default_timezone_get() . PHP_EOL;
echo 'Now: ' . date('Y-m-d H:i:s') . PHP_EOL;
ブラウザで確認する場合は、以下のように <pre> タグを使うと見やすくなります。
<?php
echo '<pre>';
echo 'Timezone: ' . date_default_timezone_get() . PHP_EOL;
echo 'Now: ' . date('Y-m-d H:i:s') . PHP_EOL;
echo '</pre>';
PHPのタイムゾーン設定の優先順位
PHPのデフォルトタイムゾーンには、優先順位があります。
優先順位はコード内設定が最も高い
PHPでは、基本的に以下の順番でタイムゾーンが決まります。
| 優先順位 | 設定方法 | 例 |
|---|---|---|
| 1 | PHPコード内の設定 | date_default_timezone_set('Asia/Tokyo') |
| 2 | php.iniの設定 | date.timezone = "Asia/Tokyo" |
| 3 | 未設定時のデフォルト | UTC |
つまり、php.ini で Asia/Tokyo を設定していても、PHPコード内で別のタイムゾーンが指定されている場合は、コード内の設定が優先されます。
例えば、php.ini に以下のように書いていたとします。
date.timezone = "Asia/Tokyo"
しかし、PHPコード内で以下のように指定している場合、
date_default_timezone_set('UTC');
実際には UTC が使用されます。
設定が反映されない場合の確認ポイント
タイムゾーン設定が反映されない場合は、以下を確認してください。
- 実際に読み込まれている
php.iniを編集しているか - WebサーバーやPHP-FPMを再起動したか
- アプリケーション内で
date_default_timezone_set()が別途呼ばれていないか - フレームワーク側の設定で上書きされていないか
- CLIとWebで異なるPHP設定を見ていないか
特に、CLIで確認した結果とブラウザで確認した結果が異なる場合があります。
これは、CLI版PHPとWebサーバー経由のPHPで、読み込む設定ファイルが違うためです。
Asia/Tokyoを指定する理由
日本時間にしたい場合は、Asia/Tokyo を指定します。
Tokyoだけでは正しくない
PHPでは、タイムゾーンIDを正式な形式で指定する必要があります。
以下のような指定は不正です。
date_default_timezone_set('Tokyo');
正しくは以下です。
date_default_timezone_set('Asia/Tokyo');
Asia/Tokyo は、PHPで使用できる正式なタイムゾーンIDです。
日本向けのサイトやアプリケーションでは、基本的にこの値を使用します。
UTC+9よりAsia/Tokyoがおすすめ
日本時間はUTCより9時間進んでいるため、UTC+9 のように考えることもできます。
ただし、PHPのタイムゾーン設定では、固定オフセットよりも地域名ベースのタイムゾーンIDを使うのが一般的です。
おすすめは以下です。
date_default_timezone_set('Asia/Tokyo');
固定オフセットではなく地域名を使うことで、国や地域ごとのルールに沿った日時管理がしやすくなります。
日本では現在サマータイムはありませんが、他国向けのサイトや多地域対応を考える場合は、Europe/London や America/New_York のような地域名ベースのタイムゾーンを使う方が安全です。
DateTimeでタイムゾーンを扱う方法
PHPでは、date() 関数だけでなく、DateTime や DateTimeImmutable を使って日時を扱うことができます。
実務では、単純な表示だけなら date() でも対応できますが、日時の変換や計算を行う場合は DateTime 系のクラスを使う方が安全です。
デフォルトタイムゾーンを使う例
まず、デフォルトタイムゾーンを設定してから DateTime を使う例です。
<?php
date_default_timezone_set('Asia/Tokyo');
$now = new DateTime();
echo $now->format('Y-m-d H:i:s');
この場合、DateTime はデフォルトタイムゾーンである Asia/Tokyo を使います。
DateTimeZoneを明示する例
より安全に書くなら、DateTimeZone を明示します。
<?php
$timezone = new DateTimeZone('Asia/Tokyo');
$now = new DateTime('now', $timezone);
echo $now->format('Y-m-d H:i:s');
この書き方であれば、PHP全体のデフォルト設定に依存せず、明示的に日本時間を指定できます。
DateTimeImmutableを使う例
日時オブジェクトを安全に扱いたい場合は、DateTimeImmutable を使うのもおすすめです。
<?php
$timezone = new DateTimeZone('Asia/Tokyo');
$now = new DateTimeImmutable('now', $timezone);
echo $now->format('Y-m-d H:i:s');
DateTime は変更可能なオブジェクトですが、DateTimeImmutable は変更不可のオブジェクトです。
日付計算を多用する場合は、意図しない変更を防ぎやすいため、DateTimeImmutable の方が扱いやすいケースがあります。
UTCで保存し、表示時に日本時間へ変換する方法
Webアプリケーションでは、データベースにはUTCで保存し、表示時にユーザーのタイムゾーンへ変換する設計がよく使われます。
DB保存はUTC、表示はAsia/Tokyoが基本
特に、以下のようなシステムではUTC保存が安全です。
- 海外ユーザーがいるサイト
- 多言語・多地域対応のサービス
- API連携があるシステム
- JavaScript側でも日時を扱うアプリ
- 予約投稿機能があるCMS
- バッチ処理や期限管理がある業務システム
- ログ分析を行うシステム
基本的な考え方は以下です。
DB保存:UTC
画面表示:Asia/Tokyo
UTCの日時を作成する
UTCで現在時刻を作成する場合は、以下のように書きます。
<?php
$utc = new DateTimeImmutable('now', new DateTimeZone('UTC'));
echo $utc->format('Y-m-d H:i:s');
UTCから日本時間に変換する
UTCの日時を日本時間に変換する場合は、setTimezone() を使います。
<?php
$utc = new DateTimeImmutable('2026-06-03 00:00:00', new DateTimeZone('UTC'));
$jst = $utc->setTimezone(new DateTimeZone('Asia/Tokyo'));
echo $jst->format('Y-m-d H:i:s');
出力結果は以下のようになります。
2026-06-03 09:00:00
日本時間はUTCより9時間進んでいるため、UTCの 00:00:00 は日本時間では 09:00:00 になります。
.htaccessでタイムゾーンを設定する方法
Apache環境では、.htaccess でPHPの設定を変更できる場合があります。
Apache + mod_phpの場合のみ有効
Apache + mod_php の環境では、.htaccess に以下のように記述できます。
php_value date.timezone Asia/Tokyo
ただし、この方法はすべての環境で使えるわけではありません。
PHP-FPMやFastCGI環境では、.htaccess に php_value を書いても反映されないことがあります。
環境によっては、500エラーになる場合もあります。
そのため、.htaccess で設定する場合は、Apache + mod_php の環境かどうかを確認してから使用してください。
PHP-FPMやFastCGIでは別の方法を使う
PHP-FPMやFastCGIの環境では、以下の方法を検討します。
php.iniに設定する.user.iniに設定する- PHP-FPMのpool設定で指定する
- サーバー管理画面から設定する
- アプリケーション側で
date_default_timezone_set()を使う
現在のレンタルサーバーやVPSではPHP-FPM構成も多いため、.htaccess よりも .user.ini や php.ini の方が適しているケースがあります。
.user.iniでタイムゾーンを設定する方法
共有サーバーでは、php.ini を直接編集できない場合があります。
そのような環境では、.user.ini を使って設定できることがあります。
.user.iniに設定を書く
対象ディレクトリに .user.ini を作成し、以下のように記述します。
date.timezone = "Asia/Tokyo"
.user.ini は、PHP-FPMやFastCGI系の環境で利用されることがあります。
ただし、サーバーによって使用可否が異なるため、利用しているレンタルサーバーやホスティング環境の仕様を確認してください。
.user.iniは反映に時間がかかることがある
.user.ini は、編集してもすぐに反映されない場合があります。
環境によっては、数分程度待つ必要があります。
設定後は、以下のようなコードで反映されているか確認します。
<?php
echo date_default_timezone_get();
Asia/Tokyo と表示されれば、設定は反映されています。
Docker環境でタイムゾーンを設定する方法
DockerでPHPを動かしている場合は、コンテナ内のPHP設定にタイムゾーンを追加します。
iniファイルを追加する方法
例えば、timezone.ini を作成します。
date.timezone = "Asia/Tokyo"
Dockerfileで以下のようにコピーします。
COPY ./docker/php/timezone.ini /usr/local/etc/php/conf.d/timezone.ini
公式PHP Dockerイメージ系では、/usr/local/etc/php/conf.d/ に .ini ファイルを配置する方法がよく使われます。
Dockerfileに直接書く方法
Dockerfileに直接記述することもできます。
RUN echo 'date.timezone = "Asia/Tokyo"' > /usr/local/etc/php/conf.d/timezone.ini
設定後は、コンテナを再ビルドします。
docker compose build
docker compose up -d
Docker環境で設定を確認する方法
コンテナ内で以下を実行すると、設定を確認できます。
php -i | grep date.timezone
または、PHPファイルで以下を実行します。
<?php
echo date_default_timezone_get();
Asia/Tokyo と表示されれば、PHP側のタイムゾーン設定は反映されています。
WordPressでタイムゾーンを設定する方法
WordPressでは、通常のPHPアプリケーションと少し考え方が異なります。
WordPressではdate_default_timezone_setを避ける
WordPressでは、テーマやプラグイン、functions.php などで以下のように書くのは基本的に避けるべきです。
date_default_timezone_set('Asia/Tokyo');
WordPress本体は、PHPレベルではUTCで動作する前提があります。
そのため、PHPのデフォルトタイムゾーンを直接変更すると、WordPress本体やプラグインの日時処理に影響が出る可能性があります。
WordPress管理画面で設定する
WordPressでタイムゾーンを設定する場合は、管理画面から行います。
設定 → 一般 → タイムゾーン
日本向けサイトであれば、「東京」を選択します。
コード側で日時を表示する場合は、WordPressの日時関数を使います。
wp_date('Y-m-d H:i:s');
タイムゾーンオブジェクトを取得したい場合は、以下を使います。
wp_timezone();
現在日時を取得したい場合は、以下も使えます。
current_datetime();
WordPressでは、PHPの date() や date_default_timezone_set() に頼るのではなく、WordPressが用意している日時APIを使うのが安全です。
Laravelでタイムゾーンを設定する方法
Laravelでは、config/app.php にタイムゾーン設定があります。
config/app.phpで設定する
日本時間を使いたい場合は、以下のように設定できます。
'timezone' => 'Asia/Tokyo',
ただし、LaravelではUTCで保存・処理し、表示時に必要なタイムゾーンへ変換する設計もよく使われます。
特に、API連携や海外ユーザー対応がある場合は、アプリケーション全体のタイムゾーンを Asia/Tokyo に変更するよりも、UTCを維持した方が扱いやすいケースがあります。
.envで管理する方法
.env で管理したい場合は、以下のように記述します。
APP_TIMEZONE=Asia/Tokyo
config/app.php 側では、以下のように読み込みます。
'timezone' => env('APP_TIMEZONE', 'UTC'),
ただし、Laravelでは設定キャッシュを使う場合があります。
設定を変更した後は、必要に応じて以下を実行します。
php artisan config:clear
本番環境で設定キャッシュを作成する場合は、以下を実行します。
php artisan config:cache
LaravelではUTC運用も検討する
Laravelで日時を安全に扱うなら、以下のようにUTCを維持する設計もおすすめです。
'timezone' => 'UTC',
表示時に日本時間へ変換します。
$user->created_at
->timezone('Asia/Tokyo')
->format('Y-m-d H:i:s');
日本国内だけの小規模な管理画面であれば Asia/Tokyo に設定しても運用しやすいですが、将来的に外部連携や多地域対応を考えるなら、UTC保存・表示時変換の方が安全です。
よくあるエラーと対処法
PHPのタイムゾーン設定では、設定漏れやタイムゾーンIDの誤りによってエラーや警告が出ることがあります。
タイムゾーンが未設定の場合
環境によっては、タイムゾーンが未設定のままだと以下のような警告が出ることがあります。
It is not safe to rely on the system's timezone settings.
この場合は、php.ini またはPHPコード内でタイムゾーンを明示します。
date.timezone = "Asia/Tokyo"
または、
date_default_timezone_set('Asia/Tokyo');
タイムゾーンIDが間違っている場合
以下のような指定は正しくありません。
date_default_timezone_set('Tokyo');
正しくは以下です。
date_default_timezone_set('Asia/Tokyo');
Tokyo だけではなく、PHPで定義されている正式なタイムゾーンIDを使う必要があります。
php.iniを編集しても反映されない場合
php.ini を編集しても反映されない場合は、以下を確認しましょう。
<?php
phpinfo();
確認すべき項目は以下です。
Loaded Configuration File
実際に読み込まれている php.ini を編集しているか確認してください。
また、設定変更後にWebサーバーやPHP-FPMを再起動しているかも確認しましょう。
CLIでは正しいのにブラウザでは違う場合
ターミナルで以下を実行したときは正しいのに、
php -i | grep date.timezone
ブラウザでは違うタイムゾーンになることがあります。
これは、CLI版PHPとWebサーバー経由のPHPで、読み込んでいる設定ファイルが異なるためです。
Webサイト側の設定を確認したい場合は、ブラウザから phpinfo() を表示して確認してください。
タイムゾーン設定の確認用サンプルコード
タイムゾーン設定が正しいか確認するには、以下のコードを使うと便利です。
CLI向けの確認コード
<?php
echo 'Timezone: ' . date_default_timezone_get() . PHP_EOL;
echo 'Now: ' . date('Y-m-d H:i:s') . PHP_EOL;
$now = new DateTimeImmutable();
echo 'DateTimeImmutable: ' . $now->format('Y-m-d H:i:s T P') . PHP_EOL;
期待される表示例は以下です。
Timezone: Asia/Tokyo
Now: 2026-06-03 15:30:00
DateTimeImmutable: 2026-06-03 15:30:00 JST +09:00
ブラウザ向けの確認コード
ブラウザで見やすく表示したい場合は、以下のように書きます。
<?php
echo '<pre>';
echo 'Timezone: ' . date_default_timezone_get() . PHP_EOL;
echo 'Now: ' . date('Y-m-d H:i:s') . PHP_EOL;
$now = new DateTimeImmutable();
echo 'DateTimeImmutable: ' . $now->format('Y-m-d H:i:s T P') . PHP_EOL;
echo '</pre>';
このコードを実行し、Timezone が Asia/Tokyo になっていれば、日本時間として正しく設定されています。
環境別のおすすめ設定方法
PHPのタイムゾーン設定は、環境に合わせて選ぶことが大切です。
自分でサーバー管理している場合
VPSや専用サーバーなど、自分でPHP設定を管理できる場合は、php.ini に設定するのがおすすめです。
date.timezone = "Asia/Tokyo"
サーバー全体で設定を統一できるため、管理しやすくなります。
共有サーバーの場合
共有サーバーでは、php.ini を直接編集できないことがあります。
その場合は、以下の方法を検討します。
- サーバー管理画面でタイムゾーンを設定する
.user.iniを使う- PHPコード内で
date_default_timezone_set()を使う
.htaccess の php_value は使える環境が限られるため、サーバー仕様を確認してから使用してください。
フレームワークを使っている場合
LaravelやWordPressなどのフレームワークを使っている場合は、フレームワークの設定方法に従うのが基本です。
Laravelであれば、config/app.php を確認します。
'timezone' => 'Asia/Tokyo',
WordPressであれば、管理画面から設定します。
設定 → 一般 → タイムゾーン
フレームワーク側の日時管理がある場合、PHPのデフォルトタイムゾーンを不用意に変更すると不具合につながることがあります。
PHPのタイムゾーン設定でおすすめの考え方
PHPのタイムゾーン設定は、単に「日本時間にすればよい」というだけではありません。
サイトやシステムの規模、ユーザーの地域、使用しているフレームワークによって、適切な設計が変わります。
日本向けの小規模サイトならAsia/Tokyoで問題ない
日本国内向けの小規模なPHPサイトであれば、以下の設定で問題ないケースが多いです。
date_default_timezone_set('Asia/Tokyo');
または、php.ini に以下を設定します。
date.timezone = "Asia/Tokyo"
お問い合わせフォーム、簡単な管理画面、社内ツールなどであれば、この設定で十分なことが多いです。
中〜大規模システムではUTC保存が安全
一方で、以下のようなシステムではUTC保存を検討するべきです。
- 海外ユーザーがいる
- API連携がある
- 複数サーバーで動作する
- JavaScript側でも日時を扱う
- 予約・期限・課金など日時の正確性が重要
- 将来的に多地域対応する可能性がある
この場合は、DBにはUTCで保存し、表示時に Asia/Tokyo へ変換する設計が安全です。
$utc = new DateTimeImmutable('now', new DateTimeZone('UTC'));
$jst = $utc->setTimezone(new DateTimeZone('Asia/Tokyo'));
WordPressではWordPressの日時APIを使う
WordPressの場合は、PHPの date_default_timezone_set() で直接変更するのではなく、管理画面のタイムゾーン設定とWordPressの日時関数を使います。
wp_date('Y-m-d H:i:s');
current_datetime();
WordPressでは、独自の日時処理ルールがあるため、PHP側のタイムゾーンを直接変更しない方が安全です。
PHPのタイムゾーン設定まとめ
PHPで日本時間を使いたい場合、基本は以下のどちらかです。
date.timezone = "Asia/Tokyo"
または、
date_default_timezone_set('Asia/Tokyo');
サーバー全体で統一したい場合は php.ini、アプリケーション単位で設定したい場合は date_default_timezone_set() を使います。
ただし、WordPressやLaravelなどのフレームワークでは、それぞれの設定方法に従うことが重要です。
WordPressでは、date_default_timezone_set() を使わず、管理画面のタイムゾーン設定と wp_date() などの日時APIを使います。
Laravelでは、config/app.php で Asia/Tokyo に設定できますが、システム規模や外部連携を考えるなら、UTCで保存・処理し、表示時に日本時間へ変換する設計も検討しましょう。
最後に、設定が反映されているか確認するには、以下を実行します。
echo date_default_timezone_get();
Asia/Tokyo と表示されれば、PHPのタイムゾーン設定は正しく反映されています。
以上、PHPのタイムゾーンの設定方法についてでした。
最後までお読みいただき、ありがとうございました。









