#056
posted on 2021.10.22 (Fri) 2023.10.28 (Sat)

MAMP環境でPHPのタイムゾーン設定の確認と変更。

MAMPの新規インストールやPHPのバージョンアップをしたとき、タイムゾーンの設定値が「no value」(未設定)の状態で、デフォルトタイムゾーンとして「UTC」(協定世界時)の時刻が適用されるので、MAMP環境のPHPのデフォルトタイムゾーンの設定値を「Asia/Tokyo」に変更する方法。忘れるのでメモ。

※ WordPressでのタイムゾーンの問題の場合、日付取得にPHPの関数ではなくWordPressの組み込み関数を使用して対処する。(後述。)

※ 「UTC」(協定世界時)の基礎知識は別記事を参照。

 

[ PHPのタイムゾーンの変更方法 ]

  • phpファイルのスクリプト内で臨時対応するだけなら、「date_default_timezone_set()関数」を使う。
  • PHP自体のデフォルトタイムゾーンの設定を変更する場合は、使用しているPHPのバージョンの「php.ini」ファイルを修正する。

※ 「php.ini」は、PHPプログラムの全体的な動作や環境を設定するファイル。

 

macOS Big Sur バージョン 11.7.10

MAMP Version 6.6

PHP 8.0.8 で確認。

 

 

タイムゾーンの現在の設定を確認する方法

現在時刻が正しくない原因がタイムゾーンの設定かどうかを念のために確認。

(PHPの設定情報などを出力する「phpinfo()関数」で現在の設定を確認する。)

 

1. ブラウザにphpinfoを出力して確認する方法

  1. 任意のphpファイルを作成して、下記を記述して保存。
  2. ブラウザからアクセス。
  3. 表示されるタイムゾーンと現在時刻を確認。
  4. 表示されているphpinfoの情報から「date.timezone」の項目欄を検索して設定値を確認。(初期値では「no value」。)

※ 「Default timezone」の項目欄がデフォルト設定として適用されているタイムゾーン。(初期値では「UTC」。)

//現在設定されているデフォルトタイムゾーンを出力
echo 'タイムゾーン : '.date_default_timezone_get().'<br>';
//現在時刻を出力
echo '現在時刻 : '.date('Y年m月d日 H時i分s秒').'<br>';
//phpinfoを出力
phpinfo();

date_default_timezone_get() : 「date_default_timezone_set()関数」での設定、「date.timezoneのiniオプション」での設定、無ければ「UTC」の優先順位でデフォルトのタイムゾーンを取得して返す。

date(‘フォーマット’, ‘Unixタイムスタンプ’) : 指定したタイムスタンプを指定したフォーマットの文字列で返す。タイムスタンプの指定が無い場合、デフォルトタイムゾーンでの現在時刻(「time()」の値と同じ)が使用される。

phpinfo() : 現在のPHPのバージョンやモジュールなどの設定内容を出力する。「INFO_GENERAL」など引数を指定して出力する情報を絞ることもできる。

 

 

2. ターミナルからコマンドでphpinfoを確認する方法

phpファイルを作成して確認するのが面倒な場合は、ターミナルから「php」コマンドで確認する。

  1. MAMPで使用しているPHPの実行ファイルのエイリアスを作成。(エイリアスはターミナルを終了すると削除される。)
  2. 作成したエイリアス(ここでは「ag2php」)で「php」コマンドを実行。
  3. PHPでタイムゾーンの設定と現在時刻を出力して確認。
  4. phpinfoの「timezone」の文字列が含まれる行を検索、出力して確認。

※ MAMPのPHPの実行ファイルは、「/Applications/MAMP/bin/php」ディレクトリに「phpバージョンの番号/bin/php」でバージョンごとのフォルダに分けて配置されている。(ここではバージョン「8.0.8」を使用。)

※ FinderでPHPの実行ファイルを選択、右クリックメニューを表示し、「option」キーを押して「”php”のパス名のコピー」を選択すると該当ファイルのパスがコピーできる。

※ PHPをコマンドラインで実行する場合、出力の改行には改行コードが必要。(ここでは、自動的にOSを判別して改行コードを設定するPHPの定義済みの定数「PHP_EOL」を使用。)

alias ag2php="/Applications/MAMP/bin/php/php8.0.8/bin/php"
ag2php -r "echo 'タイムゾーン : '.date_default_timezone_get().PHP_EOL;"
タイムゾーン : UTC #実行結果
ag2php -r "echo '現在時刻 : '.date('Y年m月d日 H時i分s秒').PHP_EOL;"
現在時刻 : 2023年10月05日 01時01分01秒 #実行結果
ag2php -i | grep timezone
Default timezone => UTC #実行結果
date.timezone => no value => no value #実行結果

alias : コマンドの別名(エイリアス)を登録したり、表示したりするコマンド。「alias 任意の名前=”任意のコマンドの実行ファイル”」でエイリアスの登録。「alias 任意の名前」で、指定した名前にエイリアスが登録されているかの確認。引数に何も指定しない場合は現在登録されているエイリアスをすべて表示。(登録したエイリアスの削除は「unalias」コマンド。)

php : PHPのCLI(Command Line Interface)。オプション「-r」で「'<? ?>’」タグを使わずにPHPのコードを実行、オプション「-i」でphpinfoを出力。

| : パイプ。コマンドの標準出力を別のコマンドの標準入力として繋げる。

grep : ファイル内で指定した文字列や検索パターンが含まれる行を表示するコマンド。指定した文字列を含む行をファイルから検索して、一致した文字列を含んでいる行をすべて表示する。検索パターンには正規表現も使える。

 

 

タイムゾーンの設定を変更する方法

PHPでタイムゾーンを「Asia/Tokyo」に変更する方法。

 

1. 任意のphpスクリプト内で一時的に変更する場合

「date_default_timezone_set()関数」を使う。

引数に使用したいタイムゾーンのIDを指定すると、記述した箇所以降のタイムゾーンの設定が変更される。

※ 有効なタイムゾーンIDの一覧(PHP公式マニュアル)。

※ WordPressの場合、テンプレートで「date_default_timezone_set()関数」を使って「’Asia/Tokyo’」に書き換えると、予約投稿の時刻が正しく動作しなくなるなど不具合が出たので注意。(WordPressの対処方法は後述。)

echo 'タイムゾーン : '.date_default_timezone_get().'<br>';
echo '現在時刻 デフォルト : '.date('Y年m月d日 H時i分s秒').'<br>';
date_default_timezone_set('Asia/Tokyo');
echo 'タイムゾーン : '.date_default_timezone_get().'<br>';
echo '現在時刻 Asia/Tokyo : '.date('Y年m月d日 H時i分s秒');

date_default_timezone_set(‘タイムゾーンID’) : 日付/時刻関数で使用されるデフォルトタイムゾーンを、指定したタイムゾーンに設定する。

 

 

2. 「php.ini」のデフォルトタイムゾーンの設定値を変更する場合

エディターで「php.ini」ファイルを開いて、「date.timezone」の行を修正して上書き保存する。

  1. 「/Applications/MAMP/bin/php/phpバージョンの番号/conf」ディレクトリにある「php.ini」ファイルをエディターで開く。(ここではバージョン「8.0.8」を使用。)
  2. 「[Date]」の項目にある「;date.timezone = “Europe/Berlin”」(今回の環境では949行目)を「date.timezone = “Asia/Tokyo”」に変更して保存。(行頭の「;」でコメントアウトされているので「;」は削除する。)
  3. MAMPを再起動して変更を反映させる。
  4. 先述の、タイムゾーンの現在の設定の確認方法で「Asia/Tokyo」になっているかを確認。

 

[ ターミナルで「php.ini」ファイルを編集する場合 ]

ターミナル上でファイル編集する場合は、下記の処理をするコマンドを順番に実行する。

  1. MAMPを終了。(起動していた場合。)
  2. 「php.ini」ファイルがあるディレクトリに移動。(ここではバージョン「8.0.8」の「conf」フォルダ。)
  3. 「php.ini」ファイルのバックアップを作成。(ここでは「php_backup.ini」として同じディレクトリに複製。)
  4. ターミナル上でCUIエディターのVimを起動して「php.ini」ファイルを開く。
  5. Vim起動時は「ノーマルモード」(カーソル移動などをするモード)で立ち上がるので、「949G」と入力して該当の行(今回の環境では949行目)に移動。
  6. 「i」キーで「インサートモード」(テキスト入力ができるモード)にして、「;date.timezone = “Europe/Berlin”」を「date.timezone = “Asia/Tokyo”」に書き換える。
  7. 記述変更が完了したら「esc」キーを押して「インサートモード」から「ノーマルモード」に戻り、「:wq」(「編集を保存して終了」のVimの終了コマンド)を入力して「enter」キーで実行してVimを終了。
  8. MAMPを起動。
  9. 設定変更の動作確認後、不要ならバックアップとして作成した「php_backup.ini」ファイルは削除。
killall MAMP #MAMPを終了
cd /Applications/MAMP/bin/php/php8.0.8/conf #ディレクトリを移動
cp -i php.ini php_backup.ini #「php.ini」を「php_backup.ini」として複製
vim php.ini #Vimで「php.ini」を開く
open -a MAMP #MAMPを起動
rm -i php_backup.ini # 「php_backup.ini」ファイルを削除

killall : 指定したプロセスに終了や停止命令のシグナルを送る。デフォルトでは「TERM」(プロセスの終了命令のシグナル)を送り、指定したプロセス名に該当するすべてのプロセスを終了させる。(プロセスIDで終了させる場合は、「kill」コマンドを使う。)

cd : カレントディレクトリを変更するコマンド。指定したディレクトリがカレントディレクトリになる。ディレクトリの指定が無ければ、ホームディレクトリがカレントディレクトリになる。

cp : ファイルをコピーするコマンド。指定したファイルを指定したファイル名でコピー(存在すれば上書き)する。コピー先のディレクトリの指定もできる。オプション「i」で、同名ファイルが存在する場合に上書きの確認を表示。

vim : vimを起動するコマンド。指定したファイルをvimで開く。

open : ディレクトリ(Finderで開く)、ファイル(デフォルトアプリケーションで開く)、URL(デフォルトブラウザで開く)を開くコマンド。オプション「-a」で、アプリケーションを指定してファイルを開く。(ファイルを指定しなければアプリケーションの起動のみ。)

rm : ファイルやディレクトリを削除するコマンド。オプション「-i」で削除前に確認を表示。(rmコマンドで削除すると復元できないので指定を間違えないように注意。)

 

 

WordPressの対処方法

上述のサーバーのPHP設定変更をしても、WordPressサイト上で動作するPHPのタイムゾーンが思ったように変更されなかったので、その対処方法。

※ 「WordPress バージョン 6.3.1」で確認。

 

1. 実際の挙動

  • WordPressの「管理画面」 > 「設定」 > 「一般」 >「タイムゾーン」の項目は「東京」(または「UTC+9」)にしている。
  • WordPressの「管理画面」 > 「ツール」 > 「サイトヘルス」 > 「情報」 >「WordPress」 > 「タイムゾーン」の項目は「Asia/Tokyo」になっている。
  • 投稿日や予約投稿などには「東京」の日時が正しく反映される。
  • WordPress上でPHPの「date()」関数を実行すると「UTC」での日時が返る。(設定している「東京」から時差-9時間での時刻が返る。)
  • WordPress上で「date_default_timezone_get()」を出力すると「UTC」が返る。
  • WordPress上で「phpinfo()」を出力して確認すると、「date.timezone」の項目は「Asia/Tokyo」だが「Default timezone」の項目が「UTC」になっている。
  • サーバーのWordPressではないディレクトリに適当なファイルを上げて「phpinfo()」を出力して確認すると、「Default timezone」も「date.timezone」も「Asia/Tokyo」になっている。

※ WordPressは、設定ファイル(「wp-settings.php」)にデフォルトで記述されている「date_default_timezone_set( ‘UTC’ );」を実行してタイムゾーンを上書きすることによって、サーバーのPHPのタイムゾーン設定には影響されないように設計されているようなので、PHPでの関数とWordPressの組み込み関数とではタイムゾーンが異なり、取得される日付に違いが発生する。

※ おそらく、「wp-settings.php」での設定と管理画面でのタイムゾーン設定を元にして内部的に日付を算出するように設計されている。

 

2. 対処方法

対処方法は下記のいずれか。

  1. PHPの「date()」関数などは使用しない。
    日付系の関数では、PHPの「date()」関数などは使用せずに、「wp_date()」などWordPressの組み込み関数を使用する。(PHPの関数だと「UTC」で取得されるが、組み込み関数だと「管理画面で設定しているタイムゾーン」で取得される。)
  2. WordPressのコアファイルを修正する。
    WordPressの設定ファイル(「wp-settings.php」)をテキストエディターで開いて、「date_default_timezone_set( ‘UTC’ );」の記述の引数を「’Asia/Tokyo’」に修正して上書き保存する。

※ 「wp-settings.php」の設定を変更する方法は影響の範囲が不明なので、WordPressで日付を扱うときは「wp_date()」などのWordPressの組み込み関数を使用して対処する方が無難。

※ wp_date()関数のWordPress.orgの公式ドキュメント。(「wp_date()」は、非推奨になった「date_i18n()」の代替。)

 

3. WordPressの日付関連の主な組み込み関数

管理画面で設定されているタイムゾーンでの情報を取得するためのWordPressの主な組み込み関数。

//現在時刻を出力
echo wp_date('Y年m月d日 H時i分s秒');

//設定されているタイムゾーンを出力
echo wp_timezone_string();

//設定されているタイムゾーンの情報をDateTimeZoneオブジェクトとして取得
$ag2timezone = wp_timezone();
//タイムゾーンを出力
echo $ag2timezone->getName();

//設定されているタイムゾーンでの現在時刻のDateTimeImmutableオブジェクトを取得
$ag2current_datetime = current_datetime();
//タイムゾーンを出力
echo $ag2current_datetime->getTimezone()->getName();
//現在時刻を出力
echo $ag2current_datetime->format('Y年m月d日 H時i分s秒');
//現在時刻のUnixタイムスタンプを出力
echo $ag2current_datetime->getTimestamp();
//設定されているタイムゾーンのオフセットを秒数で出力
echo $ag2current_datetime->getOffset();

wp_date(‘フォーマット’, ‘Unixタイムスタンプ’, ‘タイムゾーン’) : WordPressの組み込み関数。指定したタイムスタンプを指定したタイムゾーンの時刻での指定したフォーマットの文字列で返す。タイムスタンプの指定が無い場合、デフォルトタイムゾーンでの現在時刻(「time()」の値と同じ)が使用される。タイムゾーンの指定が無い場合、デフォルトのタイムゾーンが使用される。

 

 

この記事のURL

https://memo.ag2works.tokyo/post-2571/

Copyコピー
この記事のタイトル

MAMP環境でPHPのタイムゾーン設定の確認と変更。 | memo メモ [AG2WORKS]

Copyコピー
この記事のリンクタグ

<a href="https://memo.ag2works.tokyo/post-2571/" target="_blank" rel="noopener">MAMP環境でPHPのタイムゾーン設定の確認と変更。 | memo メモ [AG2WORKS]</a>

Copyコピー
※ フィールドをクリックでコピーするテキストの編集ができます。

この記事へのコメント

コメントの書き込みはまだありません。

  • コメント内のタグはエスケープ処理され、文字列として出力されます。
  • セキュリティーのため、投稿者のIPアドレスは取得されます。
  • 管理者が内容を不適切と判断したコメントは削除されます。
  • このフォームにはスパム対策として、Googleの提供するreCAPTCHAシステムが導入されています。
    (Google Privacy Policy and Terms of Service.)