[PHP]日本語対応のmb_strtotime()

Read More

日本語に対応したmb_strtotime()ってのを作ってみた。


が、その前にまずPHP関数のstrtotime()のおおまかな説明。

strtotime()は、英文形式の文字列を渡すとタイムスタンプ型に変換してくれるという便利な関数。

だけど曖昧な挙動をするパターンがあるので利用の際には色々と自分で制限をつける必要がある。

■形式の例
<?php
// 基本形
$date = '2011/06/28';

// アメリカ風
$date = '06/28/2011';

// ヨーロッパ風
$date = '28.06.2011';
$date = '28-06-2011';

// 実行
$timestamp = strtotime($date);
echo $timestamp;
?>



■実行結果
> 1309186800



上記のような曖昧さをさけるため、ISO8601形式 (YYYY-MM-DD)を利用することが推奨されている。


これに追加制限を設けて時刻も同様の形式で統一する。
すなわちYYYY-MM-DD HH:MI:SS形式。


こうすることで、より安定した動作をしてくれるようになる。



--
さてここから本題。


日本語対応したstrtotime()を探してみたところ該当するものがなかった。

ならってことでmb_strtotime()を作ってみた。


■mb_strtotime()
<?php
/**
 * strtotime()の日本語対応版
 *
 * @param string $sDate
 * @param boolean $blnNow
 * @return integer 
 */
function mb_strtotime($sDate=null, $blnNow=true) {
 // 日本語版の対応
 if(preg_match('/^([0-9]{4})[年]{1}([0-9]{1,2})[月]{1}([0-9]{1,2})[日]{1}[\s ]([0-9]{1,2})[時]{1}([0-9]{1,2})[分]{1}([0-9]{1,2})[秒]{1}[\s ]*$/u', $sDate, $match)){	// YYYY年MM月DD日HH時MI分SS秒
  $sTimestamp = mktime($match[4], $match[5], $match[6], $match[2], $match[3], $match[1]);
 }elseif(preg_match('/^([0-9]{4})[年]([0-9]{1,2})[月]([0-9]{1,2})[日][\s ]([0-9]{1,2})[時]([0-9]{1,2})[分][\s ]*$/u', $sDate, $match)){	// YYYY年MM月DD日HH時MI分
  $sTimestamp = mktime($match[4], $match[5], 0, $match[2], $match[3], $match[1]);
 }elseif(preg_match('/^([0-9]{4})[年]([0-9]{1,2})[月]([0-9]{1,2})[日][\s ]*$/u', $sDate, $match)){	// YYYY年MM月DD日
  $sTimestamp = mktime(0, 0, 0, $match[2], $match[3], $match[1]);

 // 通常
 }else {
  $sTimestamp = strtotime($sDate, $blnNow);
 }// end if
 return $sTimestamp;
}// end function
?>



■日本語を指定してみる
<?php
// 対応する日本語形式
$date = '2011年06月28日';
$date = '2011年06月28日 00時00分00秒';
$date = '2011年06月28日 00時00分';

$timestamp = mb_strtotime($date);
echo $timestamp;
?>



■実行結果
> 1309186800



上記の例では日時の区切りに半角スペースを入れているが、
これは全角スペースでも良いし、スペースがなくとも良い。



うん、いいんじゃないかな

Comments(3)

1  rararara69  2014/12/06 (土) 21:45 ID:Eh9qNpw15
「日本語対応のmb_strtotime()」を、私のブログ内でDLできるスクリプト内で使用したいのですが、可能ですか?
また、可能な場合著作権の表示等必要な項目があれば、お教え下さい。
下記サイトにて、「アメブロの特定テーマの一覧から新着n件を取得するスクリプト」として公開する予定です。

ご回答の程よろしくお願いいたします。
らららら

2  シラサヤ  2014/12/16 (火) 09:47 ID:MHiZwi615
> rararara69
ご自由にどうぞ

3  rararara69  2014/12/27 (土) 20:23 ID:aUZumBn15
ありがとうございます。
使わせていただきます。
らららら