「MongoDBの日付・時刻がよくわからない・・・」
「PHPでMongoDBの日時がUTCになってしまう・・・」
「MongoDBの日付・時刻をPHPで日本時間として扱いたい」
このような場合に、この記事は参考となります。
この記事では、PHPからMongoDBのDate型を扱う方法を解説しています。
本記事の内容
- PHPでMongoDBの日付・時刻を扱う
- MongoDB\BSON\UTCDateTimeクラス
- MongoDBの日付・時刻を日本時間で表示する
それでは、上記に沿って解説していきます。
PHPでMongoDBの日付・時刻を扱う
PHPからMongoDBに接続済みであることを前提に話を進めます。
もし、まだその設定が済んでいない場合は、次の記事を参考にしてください。
ここで想定する日付・時刻(日時)は、MongoDB上ではDate型になります。
正確には、「BSON Date type」となります。
BSONは、MongoDBで利用されるデータのフォーマットのことを言います。
そして、BSONとは「バイナリ型JSON」の略語です。
明らかに、MySQLなどのDate型とは異なりますね。
その点を理解しないと、混乱してしまいます。
そのこともあり、MongoDBで日付・時刻を扱うのは単純ではありません。
ただ、ライブラリが用意されているので、まだマシと言えますけどね。
そのライブラリにおいて、今回の主役となるのが次のクラスとなります。
MongoDB\BSON\UTCDateTime
このクラスを使えば、MongoDBの日付・時刻を扱えるようになります。
以下では、MongoDB\BSON\UTCDateTimeクラスについて説明します。
MongoDB\BSON\UTCDateTimeクラス
前提条件がクリアできていれば、次のクラスを利用できます。
MongoDB\BSON\UTCDateTimeクラスは、BSONの日付を処理します。
そして、このクラスはMongoDBのDate型(BSON Date type)に対応しています。
また、このクラスではUnixエポック (1970 年 1 月 1 日) からのミリ秒をベースに扱います。
秒ではなく、ミリ秒というところに注意です。
あと、注意すべきポイントがあります。
MongoDBのDate型には、UTCベースのUnixタイムスタンプしか登録できません。
つまり、タイムゾーンの影響は受けないということです。
このことは、必ず覚えておきましょう。
では、理解を深めるために実際の利用シーンを確認しましょう。
引数を省略した場合は、現在時刻のタイムスタンプ(ミリ秒)が設定されます。
<?php require 'vendor/autoload.php'; $bson_datetime = new MongoDB\BSON\UTCDateTime(); var_dump($bson_datetime); ?>
実行した結果は、以下。
object(MongoDB\BSON\UTCDateTime)#3 (1) { ["milliseconds"]=> string(13) "1640054806404" }
これは、BSONです。
そのため、PHPにおける配列のように単純に扱うことはできません。
正直、これではよくわかりません。
そのために、メソッドが用意されています。
ここでは、toDateTime()を利用してみましょう。
<?php require 'vendor/autoload.php'; $bson_datetime = new MongoDB\BSON\UTCDateTime(); var_dump($bson_datetime->toDateTime()); ?>
上記を実行した結果は、以下。
object(DateTime)#2 (3) { ["date"]=> string(26) "2021-12-21 02:51:02.616000" ["timezone_type"]=> int(1) ["timezone"]=> string(6) "+00:00" }
BOSNではなく、DateTime型のオブジェクトです。
これなら、かなり使いやすくなっています。
このように用意されているメソッドを利用すれば、PHPでもBSONを扱えます。
以上、MongoDB\BSON\UTCDateTimeクラスについて説明しました。
次は、MongoDBの日付・時刻を日本時間で表示してみましょう。
MongoDBの日付・時刻を日本時間で表示する
ここでは、2つの方法を説明しておきます。
- DateTime型に変換する方法
- String型に変換する方法
DateTime型に変換する方法
日本時間に変換(表示)するコードは、以下。
<?php require 'vendor/autoload.php'; // MongoDBのDate型データ(UTCベースの現在日時) $bson_datetime = new MongoDB\BSON\UTCDateTime(); // DateTime型に変換 $datetime = $bson_datetime->toDateTime(); var_dump($datetime); // タイムゾーンを適用 $timeZone = new DateTimeZone('Asia/Tokyo'); $datetime->setTimezone($timeZone); var_dump($datetime); ?>
MongoDB\BSON\UTCDateTimeクラスにより、MongoDBの日付・時刻を作成しています。
MongoDBのDate型(BSON Date type)のデータということです。
上記を動かした結果は、以下。
object(DateTime)#2 (3) { ["date"]=> string(26) "2021-12-21 04:09:19.054000" ["timezone_type"]=> int(1) ["timezone"]=> string(6) "+00:00" } object(DateTime)#2 (3) { ["date"]=> string(26) "2021-12-21 13:09:19.054000" ["timezone_type"]=> int(3) ["timezone"]=> string(10) "Asia/Tokyo" }
正しく日本時間に変換されています。
あとは、DateTime型のデータを操作するだけです。
例えば、以下のようなコードを追加します。
echo $datetime->format('Y年m月d日 H:i:s');
String型に変換する方法
<?php require 'vendor/autoload.php'; // MongoDBのData型データ(UTCベースの現在日時) $bson_datetime = new MongoDB\BSON\UTCDateTime(); echo date('Y年m月d日 H:i:s', intval((string)$bson_datetime) / 1000); ?>
これだけです。
ただし、このコードを理解するにはdate関数の理解が必要です。
PHPのdate関数については、次の記事で解説しています。
個人的には、こちらを利用しています。