2009-02-02 40 views
15

Tôi nghĩ rằng nó có thể nhưng tôi không thể đưa ra các thuật toán đúng cho nó.làm thế nào để có được ngày của tuần trước (thứ ba hoặc bất kỳ ngày nào khác) trong php?

gì tôi muốn làm là:

Nếu hôm nay là thứ hai ngày 2 tháng 2 năm 2009, làm thế nào tôi biết ngày thứ ba tuần trước? Sử dụng mã cùng 2 ngày sau đó, tôi sẽ tìm thấy cùng ngày thứ ba tuần trước với ngày hiện tại là Thứ tư Tháng Hai 4 năm 2009.

Trả lời

17

Tôi biết có một câu trả lời được chấp nhận, nhưng imho nó không đáp ứng yêu cầu thứ hai đã được yêu cầu. Trong trường hợp trên, strtotime sẽ mang lại ngày hôm qua nếu được sử dụng vào thứ tư. Vì vậy, chỉ để được chính xác mà bạn vẫn sẽ cần phải kiểm tra cho điều này:

$tuesday = strtotime('last Tuesday'); 
// check if we need to go back in time one more week 
$tuesday = date('W', $tuesday)==date('W') ? $tuesday-7*86400 : $tuesday; 

Như davil chỉ ra trong bình luận của ông, đây là loại một cách nhanh chóng-shot của tôi. Việc tính toán trên sẽ bị tắt một lần mỗi năm do thời gian tiết kiệm ánh sáng ban ngày. Giải pháp đủ tốt sẽ là:

$tuesday = date('W', $tuesday)==date('W') ? $tuesday-7*86400+7200 : $tuesday; 

Nếu bạn cần thời gian là 0: 00h, bạn sẽ cần thêm một chút nỗ lực.

+2

Điều này sẽ không hoạt động 1 tuần mỗi năm khi Chủ Nhật chỉ có 23 giờ do chuyển đổi DST (dấu thời gian kết quả sẽ cho Thứ Hai 23:00). Thay thế "7 * 86400" bằng "7 * 86400 + 7200". Tất nhiên trong trường hợp đó thời gian sẽ không phải lúc nào cũng là 0:00, nhưng ngày sẽ là DST an toàn! – davil

+0

Bạn nói đúng, đây là một cảnh quay nhanh. Cảm ơn bạn đã chỉ ra điều đó! –

+0

cảm ơn vì điều đó, tôi đã không nhận thấy nó cho đến hôm nay (thứ tư của nó bây giờ) T_T tôi nợ bạn nhiều hơn bây giờ hehe – lock

13

PHP thực sự làm điều này thực sự dễ dàng:

echo strtotime('last Tuesday'); 

Xem strtotime tài liệu.

+0

TT Tại sao tôi chưa thấy trong tài liệu hướng dẫn TT thanks a lot tôi nợ bạn – lock

+1

này thực sự không cung cấp cho bạn "thứ ba của tuần trước", nhưng cuối cùng Thứ ba (có thể là cùng tuần ... nếu là thứ sáu) – garyee

+0

Chính xác @ sugaree - hãy kiểm tra câu trả lời của tôi bên dưới – smo0f

0

bạn đã quên strtotime cho đối số thứ hai của ngày ('W', $ thứ ba) hmm.

chuyển đổi $ tuesday thành dấu thời gian trước "$ tuesday-7 * 86400 + 7200"

mde.

3

giải pháp làm việc:

$z = date("Y-m-d", strtotime("last Saturday")); 
$z = (date('W', strtotime($z)) == date('W')) ? (strtotime($z)-7*86400+7200) : strtotime($z); 
print date("Y-m-d", $z); 
1
// test: find last date for each day of the week 
foreach (array('Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun') as $day) { 
    print $day . " => " . date('m/d/Y', last_dayofweek($day)) . "\n"; 
} 

function last_dayofweek($day) 
{ 
    // return timestamp of last Monday...Friday 
    // will return today if today is the requested weekday 
    $day = strtolower(substr($day, 0, 3)); 
    if (strtolower(date('D')) == $day) 
     return strtotime("today"); 
    else 
     return strtotime("last {$day}"); 
} 
0
<?php 
    $currentDay = date('D'); 
    echo "Today-".$today = date("Y-m-d"); 
    echo "Yesterday-".$yesterday = date("Y-m-d",strtotime('yesterday')); 
    echo "Same day last week-".$same_day_last_week = date("Y-m-d",strtotime('last '.$currentDay)); 
?> 
13

Hầu hết các câu trả lời được hoặc là quá nhiều, hoặc về mặt kỹ thuật không chính xác bởi vì "thứ Ba tuần trước" không có nghĩa là ngày Thứ Ba tuần trước, nó chỉ có nghĩa là thứ Ba trước đó, có thể trong cùng một tuần "hiện tại".

Câu trả lời đúng là:

strtotime('tuesday last week') 
+2

của tôi đúng là câu trả lời được chấp nhận –

+0

@STTLCU vâng tôi không biết tại sao lá phiếu được bầu chọn cao nhất được coi là chính xác khi bạn chạy nó vào ngày thứ Tư tuần, đó không phải là những gì OP yêu cầu – smo0f

+1

Tôi đồng ý với @STT LCU. Đây sẽ là câu trả lời được chấp nhận khi tôi gặp phải vấn đề tương tự đang sử dụng 'thứ hai tuần trước' mà đã chọn ngày hôm qua – AdRock

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