2010-02-05 24 views
7

Tôi đã sử dụng phương thức strtotime() của PHP để chấp nhận trường ngày trên biểu mẫu. Tôi thích sức mạnh của nó như thế nào, trong cách nó sẽ chấp nhận "Ngày mai", "Thứ năm tới", hoặc (được cho là) ​​bất kỳ đại diện ngày nào và chuyển đổi nó thành dấu thời gian Unix.PHP strtotime() có vẻ như đang chờ định dạng Euro

Nó đã hoạt động rất tốt - cho đến ngày hôm qua. Ai đó đã nhập "2-4-10" và thay vì đăng nhập vào ngày 4 tháng 2 năm 2010, nó đã đăng nhập ngày 10 tháng 4 năm 2002! Vì vậy, nó dự kiến ​​Y-M-D thay vì M-D-Y.

Tôi nghĩ có thể vấn đề chỉ là sử dụng năm có 2 chữ số, vì vậy chúng tôi đã thử lại với "2-4-2010". Đã đăng nhập ngày 2 tháng 4 năm 2010! Tại thời điểm đó tôi chỉ không hiểu những gì strtotime() đang làm. PHP.net cho biết họ hy vọng một định dạng ngày tiếng Anh của Hoa Kỳ. Tại sao nó lại giả định D-M-Y?

Có cách nào khác không? Hay tôi phải ngừng sử dụng strtotime()?

Lưu ý: Tôi vừa thực hiện kiểm tra. Khi bạn sử dụng dấu gạch chéo thay vì dấu gạch nối/dấu gạch ngang, nó hoạt động tốt, ngay cả với 2/4/10. Tại sao điều đó lại quan trọng? Và nếu đó là tất cả nó, tôi nên chỉ cần chạy str_replace ("-", "/", $ đầu vào) trên đầu vào hình thức trước khi vượt qua nó để strtotime()?

+1

Có, cố gắng bình thường hóa ngày theo một cách nào đó trước khi xử lý bằng strtotime có vẻ như là một ý kiến ​​hay đối với tôi. – JAL

+0

Chỉ cần đợi cho đến khi bạn cố gắng sử dụng strtotime để phân tích * lần *, sau đó bạn sẽ có một số Fun thực sự. (Hãy suy nghĩ múi giờ, DST, v.v.) –

Trả lời

7

Các - chỉ một ngày theo tiêu chuẩn ISO:

03-02-01 => 1. february 2003 (ISO) 
01.02.03 => 1. february 2003 (European) 
02/01/03 => 1. february 2003 (US) 
6

Hành vi của strtotime() dựa phần lớn vào GNU date input định dạng spec. Nhưng mạnh mẽ như nó được, nó không nên được dự kiến ​​sẽ đọc tâm trí. Cho phép đầu vào ngày của người dùng dạng tự do yêu cầu sự cố vĩnh viễn.

+0

+1 Rất quan trọng là câu cuối cùng. – alex

1

Tôi đã gặp sự cố này và giải quyết vấn đề bằng cách thực hiện chính xác những gì bạn đã đề xuất - thực hiện str_replace vào ngày do người dùng nhập để thay thế dấu gạch ngang bằng dấu gạch chéo. Điều này ngăn không cho strtotime sử dụng ngày ISO và giải quyết vấn đề.

0

strtotime là do bản chất của nó mờ, vì vậy bạn không thể giả định rằng nó sẽ luôn làm những gì bạn muốn. Nếu bạn nhập 2010-04-02 thì bạn sẽ mong đợi rằng để trở lại ngày 2 tháng 4 năm 2010, đó là những gì strottime đang cố gắng làm. Chạy một str_replace từ dấu gạch nối đến dấu gạch chéo có thể có nghĩa là những người nhập vào định dạng đó có ngày sai.

Nếu bạn đang chạy PHP 5.3 trở lên, hãy xem xét date_parse_from_format() hoặc cho PHP 5.1 trở lên trên Unix xem strptime(). Cả hai chức năng đều có định dạng, do đó loại bỏ khả năng mơ hồ (nếu bạn cho người dùng biết định dạng bạn đang mong đợi - nếu bạn đang chạy một trang web quốc tế và có một hộp văn bản có nhãn ngày mà người dùng nhập vào 2/4/2010 vào thì không có cách để biết ngày dự định của họ là gì).

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