2010年1月21日木曜日

PHP::いろんな日付のフォーマットを統一するクラス

知り合いがTwitterでつぶやいたので、PHPでさくっと作ってみた。
いろんな日付+時間の入力を統一するクラスです。




使い方:
echo my_datetime::parse_datetime( 'Wed, 21 Jan 2010 11:41:25 +0000' );

出力:
2010-01-27 11:41:25

コード:

class my_datetime {
 /* ------------------------------------------------------------ */
 function parse_datetime( $str )
 {
  $date = self::std_date( $str, $e_part );
  $time = self::std_time( $str );
  
  return trim( "$date $time" );
 }
 /* ------------------------------------------------------------ */
 function std_time( $time )
 {
  if( preg_match( '/([0-9]{1,2})[:]([0-9]{1,2})[:]([0-9]{1,2})/', $time, $regs ) ) {
   list( $h, $m, $s ) = array( $regs[1], $regs[2], $regs[3] );
   $t_part = sprintf( "%4d:%02d:%02d", $h, $m, $s );
  }
  else 
  if( preg_match( '/([0-9]{1,2})時([0-9]{1,2})分([0-9]{1,2})秒/', $time, $regs ) ) {
   list( $h, $m, $s ) = array( $regs[1], $regs[2], $regs[3] );
   $t_part = sprintf( "%4d:%02d:%02d", $h, $m, $s );
  }
  return $t_part;
 }
 /* ------------------------------------------------------------ */
 function std_date( $date, &$e_part )
 {
  if( preg_match( '/([0-9]{4})[-.\/]([0-9]{1,2})[-.\/]([0-9]{1,2})(.*)/', $date, $regs ) ) {
   list( $year, $month, $day ) = array( $regs[1], $regs[2], $regs[3] );
   $d_part = sprintf( "%4d-%02d-%02d", $year, $month, $day );
   $e_part = $regs[4];
  }
  else 
  if( preg_match( '/([0-9]{4})年([0-9]{1,2})月([0-9]{1,2})日(.*)/', $date, $regs ) ) {
   $e_part = NULL;
   list( $year, $month, $day ) = array( $regs[1], $regs[2], $regs[3] );
   $d_part = sprintf( "%4d-%02d-%02d", $year, $month, $day );
   $e_part = $regs[4];
  }
  else 
  if( ereg( '([0-9]{4})([012][0-9])([012][0-9])(.*)', $date, $regs ) ) {
   list( $year, $month, $day ) = array( $regs[1], $regs[2], $regs[3] );
   $d_part = sprintf( "%4d-%02d-%02d", $year, $month, $day );
   $e_part = $regs[4];
  }
  else 
  if( ( $utime = strtotime( $date ) ) !== FALSE ) {
   $d_part = date( 'Y-m-d', $utime );
  }
  return $d_part;
 }
}

すでに似たようなクラスを持ってたので、ちょっと手を加えてみました。
と、ひとまず、こんな感じでどうでしょう?

0 件のコメント: