爲了清楚起見,我們考慮以下用例:
您需要轉換簡化的擴展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
希望這有助於。
但如果我將結果存儲在一個集合中,它會被存儲爲ISODate(「2012-11-02T08:40:12.569Z」)還是簡單地2012-11-02T08:40:12.569Z? – user1518659
我誤解了您的原始問題。對於那個很抱歉。我已經更新了答案。 –