PHP дата "последнего дня недели", выводящая неправильный месяц - PullRequest
0 голосов
/ 06 марта 2020

Я пытаюсь получить last weekday текущего месяца, используя приведенный ниже код.

Я ожидал, что он будет вести себя так же, как и все другие операторы, такие как last friday of, и выведет последний день недели. этого месяца но вместо этого выводит последний день недели предыдущего месяца.

Я знаю, что могу исправить это, используя modify( '+1 month' ), но почему? Почему другие операторы, такие как last tuesday of, работают нормально, а last weekday должен быть установлен на 1 месяц?

<?php
// outputs the previous months date
$gettoday = date( "Y-m-01" );
$freqdate = date( 'Y-m-d', strtotime( 'last weekday '.$gettoday ) );
echo 'next '.$freqdate;

//get the correct date
$gettoday = new DateTime( $gettoday );
$gettoday->modify( '+1 month' );
$gettoday = date_format( $gettoday, 'Y-m-01' );
$freqdate = date( 'Y-m-d', strtotime( $gettoday . ' last weekday' ) );
echo 'next '.$freqdate;
?>

1 Ответ

2 голосов
/ 06 марта 2020

Похоже, вы неправильно поняли, что на самом деле означает здесь «последний».

Это не имеет никакого отношения к последнему дню или неделе месяца - оно «последнее», как в «ближайшем» Предыдущая".

Вы можете начать с чего-то вроде strtotime('last day of 2020-03') - это даст вам 31 Mar 2020, что является вторником.

Если вы тогда отметите , какой день недели это так, и это может быть либо суббота, либо воскресенье - , затем , вы можете go last friday снова на этом значении, чтобы приземлиться в последний день недели месяца.

Редактировать:

Пример для всех месяцев 2020 года

for($i=1; $i<13; ++$i) {
  $year_month = '2020-'.$i;
  $last_of_month = strtotime('last day of '.$year_month);
  $weekday = date('N', $last_of_month);
  if($weekday < 6) {
    echo 'last weekday of ', $year_month, ' is ', date('Y-m-d, l', $last_of_month), "<br>\n";
  }
  else {
    $last_weekday_of_month = strtotime('last friday', $last_of_month);
    echo 'last day of ', $year_month, ' is ', date('Y-m-d, l', $last_of_month), ' - last weekday of ', $year_month, ' is ', date('Y-m-d, l', $last_weekday_of_month), "<br>\n";
  }
}

Это даст вам следующий вывод:

last weekday of 2020-1 is 2020-01-31, Friday
last day of 2020-2 is 2020-02-29, Saturday - last weekday of 2020-2 is 2020-02-28, Friday
last weekday of 2020-3 is 2020-03-31, Tuesday
last weekday of 2020-4 is 2020-04-30, Thursday
last day of 2020-5 is 2020-05-31, Sunday - last weekday of 2020-5 is 2020-05-29, Friday
last weekday of 2020-6 is 2020-06-30, Tuesday
last weekday of 2020-7 is 2020-07-31, Friday
last weekday of 2020-8 is 2020-08-31, Monday
last weekday of 2020-9 is 2020-09-30, Wednesday
last day of 2020-10 is 2020-10-31, Saturday - last weekday of 2020-10 is 2020-10-30, Friday
last weekday of 2020-11 is 2020-11-30, Monday
last weekday of 2020-12 is 2020-12-31, Thursday
...