首页 > 解决方案 > PHP日期“上一个工作日”输出错误的月份

问题描述

我正在尝试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;
?>

标签: phpdate

解决方案


看来您对“最后”在这里的实际含义有错误的理解。

这与一个月的最后一天或最后一周无关——它是“最后一天”,就像“最近的前一天”一样。

你可以从类似的东西开始strtotime('last day of 2020-03')- 这会给你31 Mar 2020,这是一个星期二。

如果您然后检查这是一周中的哪一天,它可能是星期六或星期日 -那么您可以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

推荐阅读