Как получить этот день в прошлом году в PHP?

Итак, в настоящее время я использую Carbon для получения дат, времени и сравнений. Я могу сделать subYear () достаточно легко, чтобы получить эту дату в прошлом году. Теперь мне нужно что-то, чтобы получить тот же день в то же время в прошлом году, например среду второй недели апреля.

Я ожидал, что мне придется сделать что-то, что работает в текущий день недели, например, 3, и текущую неделю года, а затем получить такое же значение в прошлом году.

Просто подумал, что проверю, есть ли что-нибудь, что уже делает это в Carbon или других инструментах PHP? Спасибо


person sturrockad    schedule 05.05.2015    source источник
comment
Посмотрите здесь stackoverflow.com/questions/1990321/date-minus-1-year. Может быть это ты хочешь   -  person splash58    schedule 05.05.2015
comment
Спасибо, всплеск, но это будет «свидание» в прошлом году, которое я уже могу получить с помощью subYear ()   -  person sturrockad    schedule 06.05.2015
comment
Вы искали там более простой способ :) Я написал это в своем ответе   -  person splash58    schedule 06.05.2015
comment
Проблема с кодами. Прочтите мое обновление, чтобы ответить   -  person splash58    schedule 06.05.2015


Ответы (4)


Я думаю, что DateTime::setISODate() - это именно то, что вам нужно:

$today = new \DateTime();

$year  = (int) $today->format('Y');
$week  = (int) $today->format('W'); // Week of the year
$day   = (int) $today->format('w'); // Day of the week (0 = sunday)

$sameDayLastYear = new \DateTime();
$sameDayLastYear->setISODate($year - 1, $week, $day);

echo "Today: ".$today->format('Y-m-d (l, W)').PHP_EOL;
echo "Same week and day last year: ".$sameDayLastYear->format('Y-m-d (l, W)').PHP_EOL;

Результат (на сегодня, 05.05.2015):

Today: 2015-05-05 (Tuesday, 19)
Same week and day last year: 2014-05-06 (Tuesday, 19)
person jeromegamez    schedule 05.05.2015

Для всех, кто использует Carbon, вы можете сделать аналогичное решение для splash's и просто иметь:

Carbon::now()->subWeeks(52)

дает 2014-05-07 14:11:48

person sturrockad    schedule 06.05.2015
comment
помните, что в некоторые годы 53 недели - person Denis Solakovic; 19.02.2021

Сделать это легче :)

echo date('Y-m-d (l, W)', strtotime("-52 week"));

Изменить: я забыл написать вывод: :)

2014-05-07 (Wednesday, 19)

ОБНОВЛЕНИЕ 2:

Возникла проблема с кодом jeromegamez. В году может быть 52 или 53 недели. С 3 января 2016 г .:

$today = new \DateTime();
$today->setDate ( 2016 , 1 , 3 );

$year  = (int) $today->format('Y');
$week  = (int) $today->format('W'); // Week of the year
$day   = (int) $today->format('w'); // Day of the week (0 = sunday)

$sameDayLastYear = new \DateTime();
$sameDayLastYear->setISODate($year - 1, $week, $day);

echo "Today: ".$today->format('Y-m-d (l, W)').PHP_EOL;
echo "Same week and day last year: ".$sameDayLastYear->format('Y-m-d (l, W)').PHP_EOL;

результат:

Today: 2016-01-03 (Sunday, 53) 
Same week and day last year: 2015-12-27 (Sunday, 52)

всего пять дней вместо лет :)

person splash58    schedule 06.05.2015
comment
Да, я изучал это и пытался решить, хотим ли мы, чтобы значение даты двигалось на более долгие годы, чтобы увидеть - person sturrockad; 08.05.2015
comment
Это не так далеко, как вы думаете. Установите дату $today->setDate ( 2016 , 1 , 3 ); Получаете Today: 2016-01-03 (Sunday, 53) Same week and day last year: 2015-12-27 (Sunday, 52). всего пять дней вместо лет :) - person splash58; 08.05.2015
comment
Посмотрите на 52 недели назад кажется лучше :) - person splash58; 08.05.2015

Что-нибудь еще проще ‹3

date('Y-m-d', strtotime('last year'))
person Iosif Livadaru    schedule 19.06.2020