Вычисление относительных дат в php с использованием strtotime()

Я ищу надежный способ вернуть полную дату указанного дня недели (например, "Пн") для текущей недели.

Поскольку сегодня среда, 13 июня 2012 г., я ожидал, что <?php echo date("Y-m-d", strtotime('Mon this week')); ?> приведет к 2012-06-11, но вместо этого php возвращает 2012-06-18, как если бы он интерпретировал эту неделю как значение следующей недели. Почему такое поведение и что мне делать?

Спасибо.

--Джефф


person jalperin    schedule 13.06.2012    source источник
comment
Как вы определяете эту неделю? Понедельник хоть воскресенье? С воскресенья по субботу? С субботы по пятницу? Или что-то совсем другое?   -  person Ben Lee    schedule 13.06.2012
comment
интересный. Я только что запустил его под PHP5.4 и получил 11-е число для «Пн на этой неделе» и 18-е для «этого понедельника». Какую версию PHP вы используете?   -  person dnagirl    schedule 14.06.2012
comment
Кроме того, я предположил, что неделя началась либо в воскресенье, либо в понедельник, поскольку форматы date() дают варианты для обоих   -  person jalperin    schedule 14.06.2012
comment
Как насчет <?php echo date("Y-m-d", strtotime('last Mon',time())); ?>?   -  person j08691    schedule 14.06.2012
comment
дает ли он ту же неправильную дату, когда вы используете объект DateTime? например $d=new DateTime('Mon this week'); echo $d->format('Y-m-d');   -  person dnagirl    schedule 14.06.2012


Ответы (3)


date( 'Y-m-d', strtotime( 'last Monday', strtotime( 'Sunday' ) ) );

Это ищет понедельник, предшествующий следующему воскресенью.

person Jeff Jenkins    schedule 13.06.2012

Согласно документации относительные форматы даты php.

Затем Monday this week сначала переходит к next Monday, а затем обрабатывает относительный текст this week.

название дня: переход к следующему дню с этим названием, если это не текущий день, тогда он не будет продвигаться вперед. Другими словами, если текущая дата была 11 июня, то strtotime('Monday this week') вернет 11 июня, тогда как если текущая дата была 13 июня, то strtotime('Monday this week') вернет 19 июня.

person Stu    schedule 13.06.2012

я думаю, что это решение для вашей проблемы:

$monday_date = date("Y-m-d", mktime(0,0,0, date("m"), date("j")-(date("w")+1), date("Y")));
person silly    schedule 13.06.2012