2012-11-19 30 views
11

Tôi muốn lưu trữ ngày hiện tại được tạo từ PHP vào bộ sưu tập MongoDB dưới dạng định dạng ngày ISO.Làm cách nào để trả về định dạng ngày ISO trong PHP cho MongoDB?

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

Tuy nhiên tôi không thể tạo ra Kind như vậy ngày trong php mà sẽ được lưu trữ trong MongoDB như một định dạng ISODate.

Đây là những gì tôi đã làm.

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

và nó được xuất ra một cái gì đó như thế nào,

0.00000000 1353305590 

mà không phải là định dạng tôi cần. làm như thế nào?

Trả lời

14

Bạn có thể chạy các __toString chức năng, hoặc sử dụng các sec lĩnh vực

__toString sẽ trả về một dấu thời gian trong usecs, mà bạn có thể vượt qua để date() sau khi tách các giây từ mili giây - đọc ở đây: http://us1.php.net/manual/en/mongodate.tostring.php

HOẶC , Cá nhân tôi muốn có mongodb trở lại chỉ giây, có thể được cắm trực tiếp vào date() - đọc tại đây: http://php.net/manual/en/class.mongodate.php

Ngoài ra, nếu bạn đang tạo Mongo Date() cho ngay bây giờ, bạn không cần phải chỉ định time();

Để trả lại một isodate, bạn cần phải làm điều này:

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

...

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

EDIT: Để tiết kiệm thời ISO của bạn, bạn cần phải làm như sau:

$mongoDateObject = new MongoDate(strtotime("2012-11-02T08:40:12.569Z")); 
+0

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

+0

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. –

2

Để 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.

+0

Điều này làm việc tuyệt vời cho tôi nhờ. Tôi đã chuyển một truy vấn tìm kiếm ngày qua một API riêng mà tôi đã phát triển và cần phải vượt qua một ngày. Tôi đã có thể sử dụng định dạng ngày của bạn và mở rộng JSON để truyền các đối tượng Ngày mongo thông qua API của tôi đúng cách: https://docs.mongodb.com/manual/reference/mongodb-extended-json/ – Mazzy

Các vấn đề liên quan