câu trả lời John Conde là đúng, nhưng đây là một giải pháp hiệu quả hơn và mathy:
$start = new DateTime('2013-01-06');
$end = new DateTime('2013-01-20');
$days = $start->diff($end, true)->days;
$sundays = intval($days/7) + ($start->format('N') + $days % 7 >= 7);
echo $sundays;
Hãy để tôi phá vỡ nó xuống cho bạn.
$start = new DateTime('2013-01-06');
$end = new DateTime('2013-01-20');
Trước tiên, hãy tạo một số đối tượng PHP được xây dựng sẵn có nghĩa là chính xác loại sự cố này.
$days = $start->diff($end, true)->days;
Tiếp theo, sử dụng DateTime::diff để tìm sự khác biệt từ $start
để $end
(đi qua true
ở đây là tham số thứ hai đảm bảo rằng giá trị này luôn luôn là tích cực), và nhận được số ngày giữa chúng.
$sundays = intval($days/7) + ($start->format('N') + $days % 7 >= 7);
Đây là một ứng dụng lớn nhưng thực sự không phức tạp lắm. Đầu tiên, chúng tôi biết có một Chủ Nhật cho mỗi tuần, vì vậy chúng tôi có ít nhất $days/7
Chủ Nhật để bắt đầu, được làm tròn xuống số int
gần nhất với intval
.
Ngày đầu đó, có thể có một ngày chủ nhật trong một khoảng thời gian ít hơn một tuần; ví dụ: Thứ Sáu đến Thứ Hai của tuần tiếp theo có 4 ngày; một trong số họ là chủ nhật. Vì vậy, tùy thuộc vào thời điểm chúng ta bắt đầu và kết thúc, có thể có khác. Đây là dễ dàng để giải thích cho:
$start->format('N')
(thấy DateTime::format) cho chúng ta ISO-8601 ngày trong tuần cho ngày bắt đầu, đó là một con số 1-7 (1 là Thứ Hai, 7 là chủ nhật) .
$days % 7
cung cấp cho chúng tôi số ngày còn lại không phân chia đồng đều thành các tuần.
Nếu ngày bắt đầu của chúng tôi và số ngày còn lại thêm tối đa 7 hoặc nhiều hơn, thì chúng tôi đã đến Chủ nhật. Biết rằng, chúng tôi chỉ cần thêm biểu thức đó, sẽ cung cấp cho chúng tôi 1
nếu đúng hoặc 0
nếu sai, vì chúng tôi sẽ thêm nó vào giá trị int
.
Và ở đó bạn có nó! Ưu điểm của phương pháp này là nó không yêu cầu lặp lại mỗi ngày giữa thời gian đã cho và kiểm tra xem đó có phải là chủ nhật hay không, điều này sẽ giúp bạn tiết kiệm rất nhiều, và nó cũng sẽ khiến bạn trông rất thông minh. Hy vọng rằng sẽ giúp!
bạn có thể sử dụng một vòng lặp for trên một chuỗi ngày như thế? – andrewsi
Bạn không thể tăng chuỗi như vậy. Hãy xem cách người khác làm điều đó: http://stackoverflow.com/search?q=php+number+of+sundays –
Đây có phải là một [vấn đề về dự án euler (19)] (http://projecteuler.net/problem=19)? – HamZa