単刀直入に言うと、$date = date('Y年m月d日', ($serial - 25569) * 60 * 60 * 24);
でOK
確認をば。
serial.php
<?php
$date = '';
$array = array(
'1990/01/22', // 一般?的な日付の書き方
'2015-08-12',
'19900122',
'20150812',
'32895', // これがExcelのシリアル値
'38576'
);
foreach ((array)$array as $key => $value) {
if (preg_match('/\A[0-9]{4}[\/-]?[0-9]{2}[\/-]?[0-9]{2}\z/i', $value)) {
$date = date('Y年m月d日', strtotime($value));
} elseif (preg_match('/\A[0-9]{5}\z/i', $value)) {
// ここが変換部分。この計算で既にUnix タイムスタンプになるためstrtotime()は不要
$date = date('Y年m月d日', ($value - 25569) * 60 * 60 * 24);
} else {
$date = false;
}
echo '変換前 : '.$value."\n";
if ($date !== false) {
echo '変換後 : '.$date."\n\n";
} else {
echo 'false'."\n\n";
}
}
結果
変換前 : 1990/01/22
変換後 : 1990年01月22日
変換前 : 2015-08-12
変換後 : 2015年08月12日
変換前 : 19900122
変換後 : 1990年01月22日
変換前 : 20150812
変換後 : 2015年08月12日
変換前 : 32895
変換後 : 1990年01月22日
変換前 : 38576
変換後 : 2005年08月12日