システムとITのはざまで

自分のITノウハウを誰かのために役立てたくて

PHPで扱う日付や時間データ

php.ini から始まる

なんちゃってPHPエンジニアの私ですが、未だにちょこちょこネットを参照しつつ作業をしているので、知識が全く体系化されておりません。が、備忘も兼ねて少しまとめます。

作業中、phpがうまく反応しない場合、おおよそiniファイルをチューニングすると解決するものです。が、そのiniファイルはどこ?

本来であれば、環境構築時にそういうモジュール構成など意識しつつ作業するのかもしれませんが、日曜エンジニアは行き当たりばったりです。

$ php -i | grep ini  
〜略〜  
Configuration File (php.ini) Path => /etc  
Loaded Configuration File => /etc/php.ini  
〜略〜  

こういうレベルで解決できます。私同様、なんちゃって or 日曜エンジニアの方は騙されたと思って、コマンド叩いて確認してみてください。きっと役立つ日があるかと思います。

余談ですが、バージョンの確認はこちらです。

$ php --version  
PHP 5.5.14 (cli) (built: Sep  9 2014 19:09:25)  
Copyright (c) 1997-2014 The PHP Group  
Zend Engine v2.5.0, Copyright (c) 1998-2014 Zend Technologies

タイムゾーンの設定

さて、何故私がphp.iniファイルのありかを探していたかと申せば、タイムゾーンを設定したかったがためです。

phpで日付に関するクラスを利用したところ、次のエラーを受けてしまいました。

DateTime::__construct(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected the timezone 'UTC' for now, but please set date.timezone to select your timezone.

なお、こういうiniファイルを変更した場合はApacheの再起動を忘れずに。

日曜エンジニアでも、過去Webサーバー系の仕事で地獄を体験した私は、頭は忘れていても身体が覚えているから、iniファイルをいじるとすぐにサーバーの再起動をするので、少し助かってます。

さて本題に戻りまして、このエラーの解決方法はタイムゾーンを設定することでした。なので、php.iniに設定します。

[Date]  
; Defines the default timezone used by the date functions  
; http://php.net/date.timezone  
date.timezone = Asia/Tokyo

これでエラー出力されずになりました。

日付型をなめちゃいけないよ

最近の私はデータの取り扱いとなると、ExcelAccessがほとんどですが、本当はOracleとかMySQLとかRDBでも自由自在になりたいです。むかーしむかしは、かなりOracleを使いこなしていたものの、その知識は私の若さと一緒にどこかへ消え去りました。

若さを取り戻すことはできませんが、知識くらいは取り戻そうと頑張ります。

さて本題に戻りまして、そもそもは次のような文字列情報となっていた時間に関するデータを、Date型としてMySQLに格納することが目的でした。幸いにも単なる文字列情報でも時間フォーマットに則っているだけに助かります。

Sun Aug 28 19:31:16 +0000 2011

次のとおり、時間フォーマットに対応しているので、strtotimeで変換することで、いかようにも表示フォーマットを変えることは可能です。

date('Y年m月d日', strtotime('Sun Aug 28 19:31:16 +0000 2011'));

しかし、これでは世界標準時間(+0000)のままなので日本の時刻からは9時間遅れています。残念ながら、strtotime関数ではタイムゾーンのコントロールまではできなかったのです。

そこで見つけた(?)のが、DateTimeZoneというクラスだったのですが、php.iniにタイムゾーンを設定せずに利用して食らったエラーが上記のものだったのです。

$date->setTimezone(new DateTimeZone('Asia/Tokyo'));
$formattedDate = $date->format('H:i, M d');  

まだまだ私は未熟者ですが、折々日付型には敏感に引き続きノウハウを身につけていくよう努力します。不特定多数の記事からお勉強させていただき恐縮ですが、この場をかりてざっくり感謝の気持ちをお伝えさえてください。ありがとうございます。

上へ戻る