2009-02-02 2 views
15

Я думаю, что его возможно, но я не могу придумать правильный алгоритм для него.как получить дату прошлой недели (вторник или любой другой день) в php?

Что я хотел сделать:

Если сегодня понедельник 2 февраля 2009, как бы я знать дату вторника на прошлой неделе? Используя тот же самый код 2 дня после того, как, я нашел бы ту же дату вторник на прошлой неделе с текущей датой является Среда, 4 февраля 2009

ответ

17

Я знаю, что есть уже принятый ответ, но imho он не отвечает второму требованию, которое было предложено. В приведенном выше случае strtotime даст вчера, если будет использоваться в среду. Так, только чтобы быть точным вам еще нужно будет проверить это:

$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; 

Как DAVIL отметил в своем комментарии, это был своего рода быстрый выстрел из шахты. Вышеуказанный расчет будет отключен один раз в год из-за летнего времени. Достаточно хорошее решение было бы:

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

Если вам нужно время, чтобы быть 0: 00h, вам нужно дополнительные усилия, конечно.

+2

Это не сработает 1 неделя в год, когда в воскресенье только 23 часа из-за переключения DST (результирующая временная метка будет быть в понедельник 23:00). Замените «7 * 86400» на «7 * 86400 + 7200». Конечно, в этом случае время не всегда будет 0:00, но дата будет DST безопасной! – davil

+0

Вы правы, это было довольно быстро. Спасибо что подметил это! –

+0

спасибо за это, я не заметил его до сегодняшнего дня (его среда сейчас) T_T я должен вам больше сейчас hehe – lock

13

PHP на самом деле делает это очень просто:

echo strtotime('last Tuesday'); 

См strtotime документация.

+0

TT почему я не видел, что в документации TT спасибо я должен вам – lock

+1

это на самом деле не дает вам «вторник на прошлой неделе», но последней (это может быть на той же неделе ... если это пятница) – garyee

+0

Точно @garyee - проверьте мой ответ ниже – smo0f

0

вы забыли strtotime для второго аргумента даты ('W', $ tuesday) hmm.

новообращенного $ вторник на отметку время перед "$ вторнику-7 * 86400 + 7200"

MDE.

3

Рабочий раствор:

$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

Большинство из этих ответов, либо слишком много, либо технически неверно, потому что «последний вторник» не обязательно означает, что вторник на прошлой неделе, это просто означает предыдущий вторник, который может быть на той же неделе «сейчас».

Правильный ответ:

strtotime('tuesday last week') 
+2

Это должен быть принятый ответ –

+0

@STTLCU Да, я не знаю, почему самый высокий голос считается правильным, если, если вы запустите его в среду, он в основном вернет вчерашний вторник, а не последний неделю, что не то, что ОП просит – smo0f

+1

Я согласен с LCST. Это должен быть принятый ответ, поскольку я столкнулся с той же проблемой, которая использовала «последний понедельник», который вчера поднялся – AdRock

Смежные вопросы