ошибка в четверг? - PullRequest
       5

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

2 голосов
/ 23 октября 2011

Прежде всего я пытаюсь получить даты следующих 7 дней после определенной даты.Для этого первого набора я хочу, чтобы мои результаты были с 11/11 по 11/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 год?Казалось, все работало нормально до вчерашнего дня, когда я заметил, что результаты четверга не появляются на моей странице, и я проследил это до этого.Спасибо за ваше время.

Ответы [ 3 ]

3 голосов
/ 23 октября 2011

Я думаю, вам нужен пробел перед днем ​​недели:

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

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

2 голосов
/ 23 октября 2011

Вы просите 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;
}
2 голосов
/ 23 октября 2011

Хм ... разве вы не хотите этим заниматься??

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

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

...