2010-08-05 22 views
5

Tôi có một vấn đề rất lạ, Zend_Date đang chuyển đổi dấu thời gian của tôi thành một năm trước đó.Lỗi trong Zend_Date (trở lại trong thời gian)

Trong hành động của tôi:

// Timestamp 
$intTime = 1293922800; 

// Zend_Date object 
$objZendDate = new Zend_Date($intTime); 

// Get date 

echo date('Y-m-d',$intTime).'<br>'; 
echo $objZendDate->get('YYYY-MM-dd'); 

này kết quả đầu ra: 2011-01-02 2010-01-02

bất cứ ai có thể cho tôi biết những gì tôi đang làm sai?

Trả lời

13

Từ theo dõi vấn đề ZF có vẻ như đây là một vấn đề được biết:

Gần đây rất nhiều người dùng ZF được nộp một lỗi Zend_Date trả về năm sai, 2009 thay vì năm 2008. Tuy nhiên đây là hành vi, và KHÔNG PHẢI LÀ BUG!

Từ FAQ:

Khi sử dụng định dạng riêng trong mã của bạn, bạn có thể đi đến một tình huống mà bạn có được ví dụ 2009/12/29, nhưng bạn mong đợi để có được 2008/12/29.

Có một sự khác biệt một năm: 2009 thay vì năm 2008. Bạn nên sử dụng hằng số năm có năm thấp hơn. Xem ví dụ này:

$ date-> toString ('dd.MM.yyyy');

thay vì

$ date-> toString ('dd.MM.YYYY');

Từ hướng dẫn sử dụng

Lưu ý rằng định dạng ISO mặc định khác với định dạng của PHP có thể gây khó chịu nếu bạn chưa sử dụng trước đó. Đặc biệt các định dạng thông số cho Năm và Phút thường không được sử dụng theo cách dự định.

Trong năm có hai thông số có sẵn thường bị nhầm lẫn. Bộ định danh Y cho năm ISO và trình chỉ định y cho năm thực. Sự khác biệt là nhỏ nhưng đáng kể. Y tính toán năm ISO, thường được sử dụng cho các định dạng lịch. Xem ví dụ ngày 31 tháng 12 năm 2007. Năm thực sự là năm 2007, nhưng đó là ngày đầu tiên của tuần đầu tiên trong tuần 1 của năm 2008. Vì vậy, nếu bạn đang sử dụng 'dd.MM.yyyy' bạn sẽ nhận được '31 .December.2007 'nhưng nếu bạn sử dụng' dd.MM.YYYY ', bạn sẽ nhận được '31.Tháng mười hai.2008'. Như bạn thấy đây không phải là lỗi nhưng hành vi mong đợi tùy thuộc vào các thông số đã sử dụng.

Đối với phút, sự khác biệt không quá lớn. ISO sử dụng chỉ số m cho phút, không giống như PHP sử dụng i. Vì vậy, nếu bạn đang nhận được không có phút trong kiểm tra định dạng của bạn nếu bạn đã sử dụng đúng specifier.

+0

Cảm ơn, ngu ngốc của tôi rằng tôi không nhìn xa hơn nữa. –

+1

Tôi ước gì tôi đã thấy điều này 4 giờ trước! – ashurexm

+0

Điều này phải được đánh dấu là câu trả lời – Sonny

0

Để thêm vào zwip's answer, những gì xảy ra đằng sau hậu trường là định dạng ngày tháng của bạn YYYY-MM-dd thực sự là dịch sang o\-m\-d, sau đó được truyền cho date() chức năng của PHP trong nội bộ với timestamp bạn cung cấp.

Như đã đề cập trong câu trả lời khác và trong tài liệu về định dạng o trên trang date format, việc tính toán năm dựa trên tuần ISO đôi khi có thể dẫn đến năm khác với giá trị bạn mong đợi.

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