Để rõ ràng, hãy xem xét trường hợp sử dụng sau:
Bạn cần chuyển đổi một chuỗi ở định dạng được mở rộng theo định dạng ISO 8601 được đơn giản hóa được đơn giản hóa (ví dụ: được trả về bởi Javascript Date.prototype.toISOString()
) đến và đi từ đối tượng của PHP, đồng thời duy trì độ chính xác tối đa trong khi chuyển đổi.
Ở định dạng này, chuỗi luôn dài 24 ký tự: YYYY-MM-DDTHH:mm:ss.sssZ
. Múi giờ luôn bằng 0 UTC, được biểu thị bằng hậu tố Z
.
Để giữ mili giây, chúng tôi sẽ phải tận dụng đối tượng DateTime
của PHP.
Từ chuỗi MongoDate
:
$stringDt = "2015-10-07T14:28:41.545Z";
Phương pháp 1 (sử dụng 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'));
Phương pháp 2 (sử dụng strtotime
):
$MongoDt= new \MongoDate(strtotime ($stringDt),
1000*intval(substr($stringDt, -4, 3)) // cut msec portion, convert msec to usec
);
Từ MongoDate
chuỗi:
$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
Hope this helps.
Nguồn
2015-10-07 17:32:44
nhưng nếu tôi lưu trữ kết quả trong bộ sưu tập, nó sẽ được lưu trữ dưới dạng ISODate ("2012-11-02T08: 40: 12.569Z") hay đơn giản là 2012-11-02T08: 40: 12.569Z ??? – user1518659
Tôi đã đọc sai câu hỏi ban đầu của bạn. Xin lỗi vì điều đó. Tôi đã cập nhật câu trả lời. –