ошибка strtotime в четверг?

#php #date #strtotime

#php #Дата #strtotime

Вопрос:

Прежде всего, то, что я пытаюсь сделать, это получить даты следующих 7 дней после определенной даты. Для этого первого набора я хочу, чтобы мои результаты были от 11/1/11 до 11/7/11. Вот код и результат, который он мне дает. Это очень, очень странно.

 $date = "October 31, 2011";
$nxtMon = strtotime(date("Y-m-d", strtotime($date)) . "monday"); 
$nxtTue = strtotime(date("Y-m-d", strtotime($date)) . "tuesday");
$nxtWed = strtotime(date("Y-m-d", strtotime($date)) . "wednesday"); 
$nxtThu = strtotime(date("Y-m-d", strtotime($date)) . "thursday");
$nxtFri = strtotime(date("Y-m-d", strtotime($date)) . "friday"); 
$nxtSat = strtotime(date("Y-m-d", strtotime($date)) . "saturday");  
$nxtSun = strtotime(date("Y-m-d", strtotime($date)) . "sunday");
 

И это дает мне:

 2011-10-31    <---    I Want the Next Monday
2011-11-01
2011-11-02
1969-12-31    <---    ???????
2011-11-04
2011-11-05
2011-11-06
 

Итак, я меняю его на это:

 $date = "October 31, 2011";
$nxtMon = strtotime(date("Y-m-d", strtotime($date)) . "next monday"); 
$nxtTue = strtotime(date("Y-m-d", strtotime($date)) . "next tuesday");
$nxtWed = strtotime(date("Y-m-d", strtotime($date)) . "next wednesday"); 
$nxtThu = strtotime(date("Y-m-d", strtotime($date)) . "next thursday");
$nxtFri = strtotime(date("Y-m-d", strtotime($date)) . "next friday"); 
$nxtSat = strtotime(date("Y-m-d", strtotime($date)) . "next saturday"); 
$nxtSun = strtotime(date("Y-m-d", strtotime($date)) . "next sunday");
 

И это дает мне:

 2011-11-07    <---  Wow, it works!
2011-11-01    <---  Wow, it works!
2011-11-02    <---  Wow, it works!
2011-11-03    <---  Wow, it works!
2011-11-04    <---  Wow, it works!
2011-11-05    <---  Wow, it works!
2011-11-06    <---  Wow, it works!
 

Теперь я пробую это с датой, равной сегодняшней дате:

 $date = "October 22, 2011";
$nxtMon = strtotime(date("Y-m-d", strtotime($date)) . "next monday"); 
$nxtTue = strtotime(date("Y-m-d", strtotime($date)) . "next tuesday");
$nxtWed = strtotime(date("Y-m-d", strtotime($date)) . "next wednesday"); 
$nxtThu = strtotime(date("Y-m-d", strtotime($date)) . "next thursday");
$nxtFri = strtotime(date("Y-m-d", strtotime($date)) . "next friday"); 
$nxtSat = strtotime(date("Y-m-d", strtotime($date)) . "next saturday"); 
$nxtSun = strtotime(date("Y-m-d", strtotime($date)) . "next sunday");
 

И я получаю:

 2011-10-24
2011-10-25
2011-10-26
2011-10-27
2011-10-28
2011-10-29
2011-10-23   Hooray, it still works!
 

Кажется, я понял, как получить именно то, что я хочу, но правда в том, что пока я не набрал этот вопрос, он, похоже, не работал правильно. Теперь внезапно это происходит. Кажется, иногда это работает, а в других случаях ничего не меняется. Из-за странности этого 1969 года в первом результате я чувствую, что понятия не имею, что происходит.

Похоже ли это на надежный способ сделать то, что я пытаюсь сделать?

Если кто-нибудь знает лучший способ ввести дату и получить следующие 7 дат, не могли бы вы мне помочь? Или подкиньте мне кость, о чем идет речь в этом 1969 году? Казалось, все работало нормально до вчерашнего дня, когда я заметил, что результаты четверга не отображаются на моей странице, и я проследил это до этого. Спасибо, что уделили мне время.

Ответ №1:

Я думаю, вам нужно сделать перерыв перед днем недели:

 $nxtThu = strtotime(date("Y-m-d", strtotime($date)) . " thursday");
 

Я не знаю, почему вы получаете разные результаты для «четверга» по сравнению с другими днями недели, но вставка пробела в любом случае имеет смысл ( "2011-10-31 thursday" против "2011-10-31thursday" ).

Комментарии:

1. Вы попали в самую точку. Добавлены пробелы, и это перестало быть таким странным.

2. Я не знаком с php, но, вероятно, это ошибка, которая strtotime() принимает так много бессмысленных строк. Если "2011-10-31wednesday" также не удалось, вы могли бы найти ошибку намного быстрее.

Ответ №2:

Эмм … разве ты не хочешь этим заниматься …?

 $dateFrom = strtotime($date);
$nxtMon = strtotime('next monday', $dateFrom);
// ...
$nxtSun = strtotime('next sunday', $dateFrom);
 

Из того, что вы описываете как желание, чтобы конечный результат был выше, мне кажется, что это должно быть все, что вам нужно сделать. Похоже, вы несколько усложняете это для меня, плюс, возможно, вы не полностью прочитали страницу руководства strtotime() — обратите внимание на второй аргумент…

Ответ №3:

Вы просите strtotime интерпретировать довольно бессмысленную строку , например 2011-10-11next monday . Как вы видите, это работает в одних случаях и не работает в других. Я бы не стал на это полагаться. Это более надежно:

 strtotime('next monday', strtotime($date))
 

Это превращается $date в временную метку и запрашивает «следующий понедельник» относительно этой временной метки. Это должно работать намного лучше. В качестве альтернативы, выполните небольшое ручное вычисление:

 $date  = 'October 31, 2011';
$ts    = strtotime($date);
$day   = date('j', $ts);
$month = date('n', $ts);
$year  = date('Y', $ts);

for ($i = 0; $i < 7; $i  ) {
    echo date('Y-m-d', mktime(0, 0, 0, $month, $day   $i, $year)) . PHP_EOL;
}