【PHP】MongoDBの日付・時刻(Date型)を正しく扱う方法

【PHP】MongoDBの日付・時刻(Date型)を正しく扱う方法 プログラミング

「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関数については、次の記事で解説しています。

個人的には、こちらを利用しています。

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