2009年1月26日月曜日

PHPの DateTimeZoneオブジェクトで時差のある時間を計算

日本の時間でDateTimeオブジェクトを生成して、時差のある地域の現地時間を求める方法。

setTimeZone('EST') とかできそうだけど、わざわざDateTimeZoneオブジェクトを生成しないといけない。

//日本の現在の時刻とアメリカ東海岸の現地時刻の比較
$dt = new DateTime('now');
echo $dt->format('r'); //日本の時間(デフォルトはAsiz/Tokyoにしてあるので)
echo "<hr />\n";
$dt->setTimeZone(new DateTimeZone('America/New_York'));
echo $dt->format('r'); //アメリカ東海岸の時間

//向こうの現地時刻から日本の時刻に変換する場合
$dt = new DateTime('2008-12-09 23:22:44', new DateTimeZone('America/New_York'));
$dt->setTimeZone(new DateTimeZone('Asia/Tokyo'));
echo $dt->format('r');
このあたりのマニュアル、分かり辛い。

また、夏時間も自動で考慮してくれるようだ。
for ($i = 1; $i < 13; $i++) {
 $dt = new DateTime("2008-$i-11 0:00");
 echo '[日本] ' . $dt->format('Y-m-d H:i:s');

 $dt->setTimezone(new DateTimeZone('America/New_York'));
 echo ' [EST] ' . $dt->format('Y-m-d H:i:s');

 echo ' [offset] ' . ($dt->getOffset() / 60 / 60) . '時間<br />';
}
(結果)アメリカのサマータイムって3月から10月なんだ。
[日本] 2008-01-11 00:00:00 [EST] 2008-01-10 10:00:00 [offset] -5時間
[日本] 2008-02-11 00:00:00 [EST] 2008-02-10 10:00:00 [offset] -5時間
[日本] 2008-03-11 00:00:00 [EST] 2008-03-10 11:00:00 [offset] -4時間
[日本] 2008-04-11 00:00:00 [EST] 2008-04-10 11:00:00 [offset] -4時間
[日本] 2008-05-11 00:00:00 [EST] 2008-05-10 11:00:00 [offset] -4時間
[日本] 2008-06-11 00:00:00 [EST] 2008-06-10 11:00:00 [offset] -4時間
[日本] 2008-07-11 00:00:00 [EST] 2008-07-10 11:00:00 [offset] -4時間
[日本] 2008-08-11 00:00:00 [EST] 2008-08-10 11:00:00 [offset] -4時間
[日本] 2008-09-11 00:00:00 [EST] 2008-09-10 11:00:00 [offset] -4時間
[日本] 2008-10-11 00:00:00 [EST] 2008-10-10 11:00:00 [offset] -4時間
[日本] 2008-11-11 00:00:00 [EST] 2008-11-10 10:00:00 [offset] -5時間
[日本] 2008-12-11 00:00:00 [EST] 2008-12-10 10:00:00 [offset] -5時間


タイムゾーンは"EST"とかの方が分かりやすいが、
ここに挙げられているタイムゾーン (UTC 以外のもの) は使用しないでください。 これらは過去のバージョンとの互換性のためにのみ残されています。
とあるのでやめましょう。


参考:
 PHP: timezone_open - Manual
 PHP: date_timezone_set - Manual

.htaccessでPHPのエラーログ設定をする方法

例えばこんな感じで。
flagとvalueを使い分ける。

php_flag display_errors On
php_flag log_errors On
php_value error_log /var/www/log/php_error.log

参考:PHPのエラーログについて PEAR::Logでエラーログを取りたいです(中略)人力検索はてな

CakePHPで pagesを使う

基本
CakePHPでContorllerを使うまでもないページ(静的な表示が中心のページ)を作りたい場合、pagesを使うと便利。
(例:サイトの紹介ページ、利用規約、などなど。)
views/pagesの中にxxxx.ctpというファイル名でVIEWテンプレートを入れておけば、/pages/xxxx というURLでアクセスできる。
Controllerは作成しなくてOK。
(config/routes.phpに下記設定があるため。PagesControllerはCakeの標準機能として装備されている。)

Router::connect('/pages/*', array('controller' => 'pages', 'action' => 'display'));
このpages内のVIEWテンプレートにもlayoutsは適用される。


タイトルタグをセットする
VIEWテンプレート内で、<?php $this->pageTitle = 'タイトル' ?> とすればタイトルタグをセットできる。


pagesからModelを呼び出す
pagesのVIEWテンプレートの中でimportする。
App::import('Model', 'Member');
後は普通のPHPクラスと同じようにnewすれば使えた。


セキュリティ上の注意
デフォルトでは /pages/home というURLで内部情報を表示してしまう。
pagesを使わない場合は、config/routes.phpのpagesへの設定を削除すればOK。
pagesを使う場合は、view/pagesにhome.ctpを作ればとりあえず害は無くなる。


参考:
 CakePHP 静的なページの作成方法 | Sun Limited Mt.
 CakePHP 公開する時はデバッグ情報を出さない | Shin x blog

PHPの file_get_contents()が成功する HTTPステータスコード

PHPのfile_get_contents()でhttp経由でデータを取得する場合、HTTPステータスコードによっては取得が失敗になる。(Warningが出て、戻り値がfalseになる。)
取得が失敗しないHTTPステータスは以下の通り。(数字の部分で判断するので、後ろの文字列は何でもよいが参考までに載せておく。)

  • 200 OK
  • 206 Partial Content
  • 301 Moved Permanently
  • 302 Moved Temporarily
  • 303 See Other

206が意外。

WWW SQL Designer 2.3.2 変更メモ

WWW SQL Designerのバージョンが2.3.2に上がっていたのでUPDATE。
そこで、自分でカスタマイズした点を反映するメモ。やりたい変更内容は以前のバージョンと同じ。

参考:
 floatingdays: WWW SQL Designerのインストール&設定
 floatingdays: WWW SQL Designerの Save ・ Loadをスマートに改良


変更箇所
(全角のスペースは普通のインデントに変換してから使うこと!)

  • js/config.js
    • 9行目の変更:デフォルトの保存方法をファイルに変更
      DEFAULT_BACKEND:["php-mysql"],
      ↓
      DEFAULT_BACKEND:["php-file"],
  • js/wwwsqldesigner.js
    • 1201行目を変更:保存時のプロンプトにURLから保存名を取得して表示する
      var name = prompt(_("serversaveprompt"),"");
      ↓
      var name = prompt(_("serversaveprompt"), location.href.split("=")[1]);
    • 1212行目に追加:ロード時のURLの後ろにに保存名を付ける
      if (!keyword) {
       var name = prompt(_("serverloadprompt"),"");
       if (name) {
        location.href = "?keyword=" + encodeURIComponent(name);
       }
       return;
      }
    • 1538~1539行目の変更:外部キーはどのフィールドでも作成可能にする
      this.dom.foreigncreate.disabled = !(this.selected.isPrimary());
      this.dom.foreignconnect.disabled = !(this.selected.isPrimary());
      ↓
      this.dom.foreigncreate.disabled = false;
      this.dom.foreignconnect.disabled = false;

ブログ アーカイブ

tags