14

PHP から生成された現在の日付を MongoDB コレクションに ISO 日付形式として保存したいと考えています。

ISODate("2012-11-02T08:40:12.569Z")

ただし、MongoDB にISODate形式で格納されるような種類の日付を php で生成することはできません。

これは私がやったことです。

 $d = new MongoDate(time());
 echo $d;

そして、それは次のようなものを出力しています、

0.00000000 1353305590

これは私が必要とする形式ではありません。これを行う方法?

4

4 に答える 4

17

__toString関数を実行するか、secフィールドを使用できます

__toStringdate()ミリ秒から秒を分離した後に渡すことができる usecs のタイムスタンプを返します - ここを読んでください: http://us1.php.net/manual/en/mongodate.tostring.php

または、私は個人的にmongodbが秒だけを返すことを好みます。これは直接プラグインできますdate()-ここを読んでください:http://php.net/manual/en/class.mongodate.php

また、現時点で MongoDate() を生成している場合は、time(); を指定する必要はありません。

イソデートを返すには、次のようにする必要があります。

echo date(DATE_ISO8601, (new MongoDate())->sec);

...

$exampleDate = new MongoDate();
echo date(DATE_ISO8601, $exampleDate->sec);

編集: ISO 日付を保存するには、次の手順を実行する必要があります。

$mongoDateObject = new MongoDate(strtotime("2012-11-02T08:40:12.569Z"));
于 2012-11-19T06:24:16.673 に答える
2

わかりやすくするために、次の使用例を考えてみましょう。

単純化された拡張 ISO 8601 形式(Javascript の によって返されるものDate.prototype.toISOString()など) の文字列を PHP のオブジェクトとの間で変換する必要がありますが、変換MongoDate中は最大の精度を維持します。

この形式では、文字列の長さは常に 24 文字です: YYYY-MM-DDTHH:mm:ss.sssZ. 接尾辞 で示されるように、タイムゾーンは常にゼロ UTC オフセットZです。

ミリ秒を維持するには、PHP のDateTimeオブジェクトを利用する必要があります。

文字列からMongoDate:

$stringDt =  "2015-10-07T14:28:41.545Z";

方法 1 (を使用date_create_from_format):

$phpDt = date_create_from_format('Y-m-d\TH:i:s.uP', $stringDt);
$MongoDt = new \MongoDate($phpDt->getTimestamp(), $phpDt->format('u'));

方法 2 (を使用strtotime):

$MongoDt= new \MongoDate(strtotime ($stringDt),
   1000*intval(substr($stringDt, -4, 3)) // cut msec portion, convert msec to usec
);

からMongoDate文字列へ:

$MongoDt = new \MongoDate(); // let's take now for example
$stringDt =
   substr(
      (new \DateTime())
       ->setTimestamp($MongoDt->sec)
       ->setTimeZone(new \DateTimeZone('UTC'))
       ->format(\DateTime::ISO8601),
   0, -5)  // taking the beginning of DateTime::ISO8601-formatted string
   .sprintf('.%03dZ', $MongoDt->usec / 1000); // adding msec portion, converting usec to msec

お役に立てれば。

于 2015-10-07T17:32:44.640 に答える