LinuxとPHPの時間

  • 投稿者:
  • 投稿カテゴリー:Linux / PHP

Linuxの時間

dateコマンド:システムの日付と時刻を表示・設定する

### システムtimezoneは "dpkg-reconfigure tzdata" で変更する ###
root@hostname:/home/shimizu# dpkg-reconfigure tzdata

Current default time zone: 'Asia/Tokyo'
Local time is now:      Thu Jan 15 21:22:07 JST 2015.# JSTはUTC(協定世界時)を9時間進めたもの
Universal Time is now:  Thu Jan 15 12:22:07 UTC 2015.

root@hostname:/home/shimizu# find /etc/ -type f -cmin 1 # 1分以内に変更されたファイルを確認する
/etc/timezone
/etc/localtime

### (おまけ)localtimeの変更方法 ###
root@hostname:/home/shimizu# cp -p /usr/share/zoneinfo/US/Alaska /etc/localtime
root@hostname:/home/shimizu# date
2015年  1月 15日 木曜日 03:20:07 AKST
root@hostname:/home/shimizu# cp -p /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
root@hostname:/home/shimizu# date
2015年  1月 15日 木曜日 21:20:16 JST

PHPの場合

root@hostname:/home/shimizu# cat /var/www/htdocs/datecheck/1.php
<?php echo date_default_timezone_get();?>
<br>
<?php echo date("Y/m/d (D) H:i:s");?>
root@hostname:/var/www/htdocs# php-cgi -i | grep "timezone"
<tr><td class="e">Default timezone </td><td class="v">Asia/Tokyo </td></tr>
<tr><td class="e">date.timezone</td><td class="v"><i>no value</i></td><td class="v"><i>no value</i></td></tr>

php.iniには何も設定されておらず、defaultはAsia/Tokyoの模様。アクセスすると
2015-01-15_231958

時間を変更すると

root@hostname:/home/shimizu# date -s "01/01 10:00 2015"
2015年  1月  1日 木曜日 10:00:00 JST
root@hostname:/home/shimizu# hwclock --show
2015年01月15日 23時05分17秒  -0.421513 秒

アクセスすると
2015-01-15_232048

つまりシステム時間を見ていることがわかる
時間を元に戻し、システムのtimezoneをAmerica/Anchorageに変更すると、

root@hostname:/var/www/htdocs# dpkg-reconfigure tzdata

Current default time zone: 'America/Anchorage'
Local time is now:      Thu Jan 15 05:22:06 AKST 2015.
Universal Time is now:  Thu Jan 15 14:22:06 UTC 2015.

root@hostname:/var/www/htdocs# date
2015年  1月 15日 木曜日 05:22:08 AKST

root@hostname:/var/www/htdocs# php-cgi -i | grep "timezone"
<tr><td class="e">Default timezone </td><td class="v">America/Anchorage </td></tr>
<tr><td class="e">date.timezone</td><td class="v"><i>no value</i></td><td class="v"><i>no value</i></td></tr>

つまりdefaultのtimezoneはシステムのtimezoneを見ていることがわかる
2015-01-15_232431

php.iniについて

ここでphp.iniにて”Asia/Tokyo”を設定してみる(今まで何も設定していなかった)

root@hostname:/var/www/htdocs# php-cgi -i | grep "php.ini"
<tr><td class="e">Configuration File (php.ini) Path </td><td class="v">/etc/php5/cgi </td></tr>
<tr><td class="e">Loaded Configuration File </td><td class="v">/etc/php5/cgi/php.ini </td></tr>
root@hostname:/var/www/htdocs# vi /etc/php5/cgi/php.ini
====
date.timezone = "Asia/Tokyo"
====
root@hostname:/var/www/htdocs# php-cgi -i | grep "timezone"
<tr><td class="e">Default timezone </td><td class="v">Asia/Tokyo </td></tr>
<tr><td class="e">date.timezone</td><td class="v">Asia/Tokyo</td><td class="v">Asia/Tokyo</td></tr>

2015-01-15_233102
システムtimezoneはAmerica/Anchorageであるが、Asia/Tokyoとなった
つまり、php.iniでの設定が何よりも優先されることがわかる
また時刻的にも問題なかった(23時30分NOW)

CodeIgniterのnow()の場合

now() について
現在時刻をUNIXタイムスタンプで返します
設定ファイル(application/config/config.php)の “time reference” の設定により、サーバのローカル時間またはグリニッジ標準時間を指す時刻になります
local:ローカル時間を基準にする
gmt:グリニッジ標準時を基準にする
マスターの時間を GMT に設定しないつもりなら
(各ユーザが各々のタイムゾーンを設定することができるサイトであれば通常そうすると思います)
PHPの time() 関数を使わずに、この関数を利用する利点はありません

php.iniにて”Asia/Tokyo”を設定していろいろやってみる

root@hostname:/var/www/htdocs# cat CI/system/core/CodeIgniter.php | grep "CI_VERSION"
        define('CI_VERSION', '2.2.0');
root@hostname:/var/www/htdocs# cat CI/application/config/config.php | grep "time_reference"
$config['time_reference'] = 'local';
root@hostname:/var/www/htdocs# cat CI/application/controllers/test.php
<?php
class Test extends CI_Controller {

        public function index()
        {
                $this->load->helper('date');
                echo date_default_timezone_get()."<br>";
                echo unix_to_human(now());
        }
}
?>

アクセスすると
2015-01-16_003238

時間を変更すると

root@hostname:/var/www/htdocs/CI/application/controllers# date -s "01/01 10:00 2015"
2015年  1月  1日 木曜日 10:00:00 JST
root@hostname:/var/www/htdocs# hwclock --show
2015年01月16日 00時40分42秒  -0.826882 秒

アクセスすると
2015-01-16_004137

先ほど同様システム時間を見ていることがわかる
時間を元に戻し、システムのtimezoneをAmerica/Anchorageに変更すると

root@hostname:/var/www/htdocs# dpkg-reconfigure tzdata

Current default time zone: 'America/Anchorage'
Local time is now:      Thu Jan 15 06:44:51 AKST 2015.
Universal Time is now:  Thu Jan 15 15:44:51 UTC 2015.

root@hostname:/var/www/htdocs# date
2015年  1月 15日 木曜日 06:44:53 AKST

2015-01-16_004554
時刻的には問題ない(0時45分NOW)

読んでみる

Linux時刻管理の仕組みと設定 – ハードウェアクロック関連
http://www.atmarkit.co.jp/ait/articles/0812/26/news120.html

参考URL

軽量PHPフレームワーク ‘CodeIgniter’ 徹底ガイド!
http://www.ci-guide.info/practical/helper/date/
CodeIgniter ユーザガイド 日本語版 Version 2.0.3
http://codeigniter.jp/user_guide_ja/helpers/date_helper.html