CodeIgniterの学習 33 - 日付フォーマットの変換をMySQL_DATETIME_Helper改を組み込んで楽にしてみる

今日はCodeIgniterにMySQL_DATETIME_Helper( http://codeigniter.com/wiki/MySQL_DATETIME_Helper/ )を組み込んで、
日付ヘルパを拡張してみる。ついでに日本用に少々改造してみた。

日付の変換って面倒だ。mktimeとか使いだすと、頭が混乱するので嫌いなのだ。


導入

ソースはwikiから取ってくる。
http://codeigniter.com/wiki/MySQL_DATETIME_Helper/
のソースを2つ共コピーして、
application/helpers/MY_date_helper.phpとして保存すればよい。

改造してみる

日本向けのフォーマットに一部改造した。
以下抜粋

1)デフォルトフォーマットの変更

-function mysqldatetime_to_date( $datetime = "", $format = "d.m.Y, H:i:s" )
+function mysqldatetime_to_date( $datetime = "", $format = "Y/m/d H:i:s" )
-function timestamp_to_date( $timestamp = "", $format = "d/m/Y H:i:s" )
+function timestamp_to_date( $timestamp = "", $format = "Y/m/d H:i:s" )

の2カ所


2)「年」「月」「日」「時」「分」「秒」の区切りに対応

<?php
//上略

function date_to_timestamp( $datetime = "" )
{

  if ( !preg_match( "/^(\d{2}(\d{2})?)[.\- \/年](\d{1,2})[.\- \/月](\d{1,2})日?( (\d{1,2})(時|[:時](\d{1,2})(|分|([:分](\d{1,2})秒?)?)))?$/iu", $datetime, $date ) )
  {
    return FALSE;
  }

  $year = $date[1];
  $month = $date[3];
  $day = $date[4];

  $hour = ( empty( $date[6] ) ) ? 0 : $date[6];
  $min = ( empty( $date[8] ) ) ? 0 : $date[8];
  $sec = ( empty( $date[11] ) ) ? 0 : $date[11];

  /*
    //元ネタはこうなっている
    if (!preg_match("/^(\d{1,2})[.\- \/](\d{1,2})[.\- \/](\d{2}(\d{2})?)( (\d{1,2}):(\d{1,2})(:(\d{1,2}))?)?$/", $datetime, $date))
      return FALSE;

    $day = $date[1];
    $month = $date[2];
    $year = $date[3];
    $hour = (empty($date[6])) ? 0 : $date[6];
    $min = (empty($date[7])) ? 0 : $date[7];
    $sec = (empty($date[9])) ? 0 : $date[9];
  */

  return mktime( $hour, $min, $sec, $month, $day, $year );
}
//下略
 ?>

に変更した。(ソースはUTF-8で保存)


動作確認

コントローラ側で、

  • 適当なダミーテーブルに日付を突っ込んで、これを変換してみた。(1,2,3)
  • 現在時刻を変換してみた。(4,5)
  • 埋め込みの日付を変換してみた。(6,7)
<?php
//上略

    // 日付ヘルパ
    $this -> load -> helper( 'date' ); 

    // データ取得
    $q = $this -> db -> get( 'dummytable' ); 
    // テーブルのヘッダ
    $this -> table -> set_heading('id',
                   '1)作成日<br>mysqlのDATETIME型 $row -> created',
                   '2)DATETIME型を日付に<br>mysqldatetime_to_date($row -> created,"y/m/d H:i")',
                   '3)DATETIME型をタイムスタンプに mysqldatetime_to_timestamp($row -> created)', 
                   '4)タイムスタンプをDATETIME型に<br>timestamp_to_mysqldatetime(time())',
                   '5)タイムスタンプを日付に<br>timestamp_to_date(time(),"y年m月d日 H時i分")',
                   '6)日付をタイムスタンプに<br>date_to_timestamp("88年12/24 12時00分")',
                   '7)日付をDATETIME型に<br>date_to_mysqldatetime("1988年12月24日 12時00分03秒")'
                   ); 
    // テーブルの生成
    foreach ( $q -> result() as $row ) {
      $this -> table -> add_row( 
        $row -> id ,
        $row -> created,
        mysqldatetime_to_date($row -> created,"y/m/d H:i") ,
        mysqldatetime_to_timestamp($row -> created) ,
        timestamp_to_mysqldatetime(time()) ,
        timestamp_to_date(time(),"y年m月d日 H時i分") ,
        date_to_timestamp("88年12/24 12時00分"),
        date_to_mysqldatetime("1988年12月24日 12時00分03秒")
        ) ;
    } 

    $data['tblList'] = $this -> table -> generate(); 
//下略
 ?>

画面






なんとなく良い感じ。