時刻の扱い

  • ページ: BugTrack
  • 投稿者: ぱんだ
  • 優先順位: 低
  • 状態: 完了
  • カテゴリー: 本体新機能
  • 投稿日: 2002-11-30 (土) 16:41:38
  • バージョン:

メッセージ

PukiWiki内部で扱う時間(UNIXタイムスタンプ)をGMTに一本化し、書式化するときにローカル時間に変換する仕掛けを考えています。

pukiwiki.ini.phpにZONEおよびZONETIME定数を追加(ローカル時間)

define('ZONE','JST');
define('ZONETIME',9 * 3600); // JST = GMT + 9
//define('ZONE','EST'); PukiWikiをアメリカ東部標準時間(EST)で使う場合の例
//define('ZONETIME',-5 * 3600);

もし、PukiWikiをアメリカで使う、などという場合は、夏時間(EDT)との切替は手動…ということで :)

init.phpにLOCALZONE定数を追加(GMTとサーバのローカル時間との差)

define('LOCALZONE',date('Z'));

内部で扱う数値(UNIXタイムスタンプ)はすべてGMTとする

  • init.php
    -define('UTIME',time())
    +define('UTIME',time() - LOCALZONE)
  • その他のスクリプト time()ではなくUTIMEを使うことが望ましい
    -time()
    +UTIME
    どうしてもその瞬間の時間が欲しいときはLOCALZONEを引いておく
    -time()
    +time() - LOCALZONE
    ファイルの時間を得るときにLOCALZONEを引く
    -filemtime("...")
    +filemtime("...") - LOCALZONE
    mktime()関数はLOCALZONEを引く(calendar*.inc.php内)
    -mktime(.....)
    +mktime(.....) - LOCALZONE

UNIXタイムスタンプを書式化するときに、ZONETIMEを加える

  • date()関数
    -date("...")
    +get_date("...") get_date()関数は下記
  • getdate()関数はgetdate(UTIME+ZONETIME)に
    -getdate()
    +getdate(UTIME+ZONETIME)
  • getdate(timestamp)はgetdate(timestamp+ZONETIME)に
    -getdate(timestamp)
    +getdate(timestamp + ZONETIME)
  • 日付文字列を作るとき(よくあるパターン)
    +	$val += ZONETIME;
     	$ins_date = date($date_format,$val);
     	$ins_time = date($time_format,$val);
     	$ins_week = '('.$weeklabels[date('w',$val)].')';
  • calendar*.inc.phpで使われているパターン
    -getdate(mktime(0,0,0,$m,$d,$y));
    +getdate(mktime(0,0,0,$m,$d,$y) - LOCALTIME + ZONETIME);

そこら中に散らばっている日時書式化ルーチンを関数にしてしまう

  • format_date($val,$paren)
    • $val : UNIXタイムスタンプ(GMT)
    • $paren : TRUE:戻り値を括弧で囲む デフォルト=FALSE
      // 日時文字列を作る
      function format_date($val, $paren = FALSE) {
      	global $date_format,$time_format,$weeklabels;
      
      	$val += ZONETIME;
      
      	$date = date($date_format,$val);
      	$time = date($time_format,$val);
      	$week = '('.$weeklabels[date('w',$val)].')';
      	
      	$str = "$date $week $time";
      	return $paren ? "($str)" : $str;
      }
  • get_date($format,$timestamp) date()関数の代替
    • $format : フォーマット文字列
    • $timestamp : UNIXタイムスタンプ(GMT) 省略時は現在の日時
      // 日時を得る
      function get_date($format,$timestamp = NULL)
      {
      	$time = ($timestamp === NULL) ? UTIME : $timestamp;
      	$time += ZONETIME;
      	
      	$format = preg_replace('/(?<!\\\)T/',preg_replace('/(.)/','\\\$1',ZONE),$format);
      	
      	return date($format,$time);
      }

  • mktime()とgetdate()について追記しました。 -- ぱんだ 2002-12-02 (月) 16:56:14
  • タイムゾーンの扱いを追加しました。どうでしょうか。 -- ぱんだ 2002-12-02 (月) 19:32:13
  • BugTrack2/76 -- 2005-06-11 (土) 16:11:44

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2005-06-11 (土) 16:12:48
Site admin: PukiWiki Development Team

PukiWiki 1.5.2+ © 2001-2019 PukiWiki Development Team. Powered by PHP 5.6.40-0+deb8u7. HTML convert time: 0.187 sec.

OSDN