[PHP] PhpSpreadsheetで日付のセルを読み込むとシリアル値になる

PhpSpreadsheetでExcelシートからデータを取得できるようになりましたが、ちょっと困ってしまったのが、日付が入力されたセル。

このセルの値をPhpSpreadsheetで読み込むと、シリアル値で取得されてしまいます。

UNIXタイムスタンプとも違う、このシリアル値。この数値から、日付形式に変換する方法をメモメモ。

シリアル値は秒ではなく日

UNIXタイムスタンプは、協定世界時刻(UTC)1970年1月1日午前0時0分0秒からの経過秒数がカウントされますが、Excelで使われているシリアル値は、1900年1月1日午前0時0分0秒と1とし、1日増えるとカウントが1増える仕組みになっています。

つまり、シリアル値では時刻部分が小数点以下で表記されるということですね。

そのため、PHP上でシリアル値から日付形式に直したい場合は、以下のようにします。

$str_date = date( 'Y-m-d', strtotime( '1900-01-01 +'.[シリアル値を代入した変数 - 1].'days' ) );

これで、シリアル値から日付が取得できました。

シリアル値から-1しているのは理由があります。基準日である1900年1月1日0時0分0秒がシリアル値で1なので、-1しないまま計算すると、1日ずれて(多くなって)しまうためです。

もちろん、日付だけでなく日時で取得することもできます。

$str_date = date( 'Y-m-d H:i:s', strtotime( '1900-01-01 +'.[シリアル値を代入した変数 - 1].'days' ) );

これで、日時を含めた処理も行けそうですね!

初稿:2019年11月22日

コメント

タイトルとURLをコピーしました