2010-09-18 35 views
14

Tôi đang truy xuất một mục nhập từ cơ sở dữ liệu có ngày được liên kết với nó.PHP: Làm thế nào để có được chủ nhật trước đó của một ngày cụ thể trong quá khứ ..?

Tôi muốn có thể nhận được chủ nhật trước đó và thứ Bảy tiếp theo liên quan đến ngày cụ thể đó để điền vào một trình đếm ngày tháng jQuery.

tôi biết làm thế nào để làm điều đó với thời gian/ngày thực tế với:

strtotime('last Sunday') 

nhưng tôi không biết làm thế nào để làm điều đó cho một ngày khác hơn bây giờ ...

Cảm ơn.

Trả lời

42

Sử dụng đối số thứ hai của strtotime để xác định ngày để tính toán "chủ nhật tuần trước" và ngày tương đối khác từ:

strtotime('last Sunday', strtotime('09/01/2010')); 

http://us2.php.net/strtotime

Ví dụ:

echo date('m/d/Y', strtotime('last Sunday', strtotime('09/01/2010'))); 

Output:

08/29/2010 
+0

Các công trình lớn.! Cảm ơn. – pnichols

+3

không cần gọi [strtotime] (http://php.net/manual/en/function.strtotime.php) hai lần, nó có thể được thực hiện như 'echo date ('m/d/Y', strtotime (" last Chủ nhật 09/01/2010 "));' –

17

Bạn cũng có thể sử dụng lớp datetime để thực hiện việc này. Đoạn mã dưới đây sẽ làm việc:

 
$date = new DateTime('09/01/2010'); 
$date->modify('last Sunday'); 
echo $date->format('d/m/Y'); 
Output: 29/08/2010 

Có một cái nhìn tại http://ca2.php.net/manual/en/class.datetime.php. Hàm khởi tạo nhận hai đối số tùy chọn, đầu tiên trong số đó là một chuỗi ngày tháng cho đối tượng (mặc định đến bây giờ) và thứ hai là đối tượng DateTimeZone (mặc định là múi giờ được đặt trong PHP.ini). Phương thức sửa đổi sau đó thay đổi ngày bằng cách sử dụng cùng một biểu thức mà strtotime() hỗ trợ và định dạng phương thức định dạng ngày bằng cách sử dụng các chuỗi định dạng giống như ngày(). Về cơ bản, điều này giống như ví dụ của pygorex1 nhưng sử dụng cú pháp hướng đối tượng.

+0

Lưu ý rằng điều này đòi hỏi PHP 5.3. – alexn

+0

@alexn Điều đó không đúng. Lớp datetime có sẵn từ PHP 5.2 trở đi. Có một số phương thức bổ sung có sẵn trong PHP 5.3 (bổ sung và phụ), nhưng tất cả các phương thức tôi đã sử dụng trong ví dụ của mình đều có sẵn trong PHP 5.2.x. – Jeremy

+0

Thú vị ... Tôi thực sự phải bắt đầu nhìn vào OO. Tôi biết đó là phải để cập nhật, nhưng OO dường như quá nhiều/không cần thiết đối với loại/kích thước của dự án mà tôi có ... – pnichols

0

Bạn có thể sử dụng bù trừ ngày trong tuần. Trong PHP cho ngày tùy ý:

<?php 

define('SEC_IN_DAY', (24*60*60)); 

$d = strtotime('2013-04-15'); 
// "w" is the day of the week. 0 for Sunday through 6 for Saturday 
$delta_sun = -date('w', $d); 
$delta_sat = $delta_sun + 6; 

echo 'The day ' . date('Y-m-d H:i:s', $d) . "\n"; 
echo 'Last Sunday '. date('Y-m-d H:i:s', $d + $delta_sun * SEC_IN_DAY) . "\n"; 
echo 'Next Saturday '. date('Y-m-d H:i:s', $d + $delta_sat * SEC_IN_DAY) . "\n"; 

Cùng trong MySQL:

SET @d := '2013-04-15'; 
SET @delta_sun := -DATE_FORMAT(@d, '%w'); 
SET @delta_sat := @delta_sun + 6; 

SELECT 'The day' AS `name`, DATE(@d) AS `date` 
    UNION ALL 
SELECT 'Last Sunday' AS `name`, DATE_ADD(@d, INTERVAL @delta_sun DAY) AS `date` 
    UNION ALL 
SELECT 'Next Saturday' AS `name`, DATE_ADD(@d, INTERVAL @delta_sat DAY) AS `date` 
+0

Hằng số 'SEC_IN_DAY' có lẽ hơi vô nghĩa. '86400' là một số khá phổ biến và được sử dụng trong PHP, bạn chỉ có thể sử dụng trực tiếp. – crmpicco

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