↓の記事でも触れたけど、UNIXタイムスタンプってのは1970/1/1 00:00:00からの経過秒数のことである。
一方、EXCELでは日時を「シリアル値」という、UNIXタイムスタンプとは異なる値で管理している(デフォルトではUNIXタイムスタンプを扱えない)。このシリアル値ってのは1900/1/1を1とした「経過日数」であり、例えば1900/1/2は2となる。
![](https://blog.extend-col.org/cms/wp-content/uploads/2022/02/image-38.png)
![](https://blog.extend-col.org/cms/wp-content/uploads/2022/02/image-39.png)
時間、分、秒については小数点で管理されている。
![](https://blog.extend-col.org/cms/wp-content/uploads/2022/02/image-40.png)
つまり、シリアル値×60×60×24でUNIXタイムスタンプと同じく秒数に変換できるわけだが、Excelのシリアル値とUNIXタイムスタンプは基準となる日付が違うため、実際のUNIXタイムスタンプとは大幅なズレが生じてしまう。
ではどうするか。
何度も述べているように、UNIXタイムスタンプってのは1970/1/1 00:00:00からの経過秒数である。つまり、タイムスタンプに変換したい日時のシリアル値と1970/1/1 00:00:00のシリアル値の差を求め、その値に60×60×24を掛けることで、タイムスタンプになるって寸法よ。
![](https://blog.extend-col.org/cms/wp-content/uploads/2022/02/image-41.png)
![](https://blog.extend-col.org/cms/wp-content/uploads/2022/02/image-42.png)
良さげ。本当にこれがタイムスタンプとして正しいかPHPで検証してみる。
<?php
echo date('Y-m-d H:i:s', 1644364800);
これを実際に動かしてみると…ドン。
![](https://blog.extend-col.org/cms/wp-content/uploads/2022/02/image-43.png)
あれ? なんか9時間ズレてる…
よく考えたら日本の時計は世界標準時より9時間進んでるんだからそれを考慮しないといけないんだわ。つまり9時間(60×60×9)分の秒数を引けばいいわけで…
![](https://blog.extend-col.org/cms/wp-content/uploads/2022/02/image-46.png)
![](https://blog.extend-col.org/cms/wp-content/uploads/2022/02/image-47.png)
<?php
echo date('Y-m-d H:i:s', 1644332400
);
これを実行すると…
![](https://blog.extend-col.org/cms/wp-content/uploads/2022/02/image-48.png)
無事に変換できた!!!
![](https://blog.extend-col.org/cms/wp-content/uploads/2022/02/image-49.png)
こうでもいいっちゃいい。