2016-04-01 32 views
6

tôi cần một chút giúp đỡ để tìm kiếm bất kỳ sai có thể có của máy chủ hoặc php, bởi vì tôi có một hành vi kỳ lạ của phương pháp "setDate" DateTime của:lạ Datetime :: setDate() hành vi

$datetime = new DateTime('2016-01-01 23:59:59'); 
$datetime->setDate(2016, 2, 28); 
print_r($datetime); 

/* 
DateTime Object 
(
    [date] => 2016-01-28 23:59:59 
    [timezone_type] => 3 
    [timezone] => Europe/Berlin 
) 
date should actually be february! 
*/ 

Vâng, ít nhất nó là phù hợp, bởi vì, khi tôi đặt ngày tháng ba (3) kết quả là tháng hai (2).

$datetime = new DateTime('2016-01-01 23:59:59'); 
$datetime->setDate(2016, 3, 28); 
print_r($datetime); 

/* 
DateTime Object 
(
    [date] => 2016-02-28 23:59:59 
    [timezone_type] => 3 
    [timezone] => Europe/Berlin 
) 
date should actually be march! 
*/ 

Trong PHP múi giờ mặc định được thiết lập

// "Europe/Berlin" 
echo date_default_timezone_get(); 

Server hiện đang chạy với

php version 5.3.2 (unfortunately i cannot upgrade) 

thời gian máy chủ được thiết lập một cách chính xác và múi giờ cũng là Châu Âu/Berlin.

Ai đó có thể giúp tôi/tư vấn cho tôi những gì tôi có thể làm hoặc kiểm tra không?

+2

Ban đầu tôi nghĩ đó là một câu hỏi DSL khác do hàm ngày PHP quá thông minh nhưng sau đó tôi đã thử mã của bạn và tôi đơn giản [không thể tạo lại vấn đề] (https: // 3v4l) .org/Ne2qi). Đây có phải là mã thực 100% không? hệ thống kỹ thuật của bạn là gì? –

+0

Xin lỗi, tôi luôn quên nút * + phiên bản không được hỗ trợ *. Vui lòng kiểm tra [bản demo cập nhật] (https://3v4l.org/nPsle). Tất cả tôi có thể nghĩ là cơ sở dữ liệu ngày nội bộ của bạn bị hỏng hoặc một cái gì đó. –

+0

Cảm ơn bạn đã trả lời. Điều này thực sự là những gì xảy ra trên máy chủ đó (trong một số máy ảo thử nghiệm nó hoạt động hoàn hảo). Bạn có biết cách kiểm tra cơ sở dữ liệu ngày nội bộ không? – Ryo

Trả lời

1

Đối với hành vi lạ, tôi thấy một giải pháp lạ. Tôi nghĩ và hy vọng những người khác sẽ không gặp lỗi này (xem câu trả lời cho câu hỏi), nhưng chỉ trong trường hợp:

Bạn cần phải khởi tạo lại DateTime-Class thành biến. Xin đừng hỏi tôi tại sao! f -, -

$datetime = new DateTime(); 
$datetime = new DateTime('2016-01-01 23:59:59'); 

$datetime->setDate(2016, 2, 28); 
print_r($datetime); 

/* 
DateTime Object 
(
    [date] => 2016-02-28 23:59:59 
    [timezone_type] => 3 
    [timezone] => Europe/Berlin 
) 
*/