0

我遇到了一个问题,如何检查特定日期是否在 php 中允许的工作日数组内。例如,

    function dateIsAllowedWeekday($_date,$_allowed)
    {
    if ((isDate($_date)) && (($_allowed!="null") && ($_allowed!=null))){
    $allowed_weekdays=json_decode($_allowed);
    $weekdays=array();

    foreach($allowed_weekdays as $wd){
    $weekday=date("l",date("w",strtotime($wd)));
    array_push($weekdays,$weekday);
    }
    if(in_array(date("l",strtotime($_date)),$weekdays)){return TRUE;}
    else {return FALSE;}
        }
        else {return FALSE;}
    }
 /////////////////////////////   
    $date="21.05.2010"; //actually is Friday (5)
    $wd="[0,1,2]"; //Sunday,Monday,Tuesday

    if(dateIsAllowedWeekday($date,$wd)){echo "$date is within $wd weekday values!";} 
    else{echo "$date isn't within $wd weekday values!"}

我输入了格式为“dmY”的日期和一个从数据库返回的数组,其中包含工作日数字(格式为“星期几的数字表示”),如 [0,1,2] -(星期日、星期一、星期二)。

从数据库返回的字符串可以是“null”,所以我也检查一下。然后,该isDate函数检查 date 是否为日期,是否正常。

我想检查我的日期,例如 21.05.2010 是否是此数组中允许的工作日。我的函数总是返回 TRUE 并且不知何故工作日总是“星期四”,我不知道为什么......

有没有其他方法可以检查这一点,或者我在上面的代码中的错误是什么?谢谢

4

4 回答 4

2

我不确定为什么你觉得需要将一周中的数字日期转换为字符串(例如“Sunday”),因为你最后只返回一个布尔值;无论如何,我已经删除了该部分,下面的代码应该按预期运行:

function dateIsAllowedWeekday($_date,$_allowed)
{
  if ((isDate($_date)) && (($_allowed!="null") && ($_allowed!=null)))
  {
    $allowed_weekdays = json_decode($_allowed);

    if (in_array(date("w", strtotime($_date)), $allowed_weekdays))
    {
      return TRUE;
    }
  }

  return FALSE;
}

使用21.05.2010(returns false) 和11.05.2010(returns true) 进行测试,使用您的 allowed_weekdays 如上所述 ( [0,1,2])。

于 2010-05-11T10:52:23.617 回答
1

如果你已经运行了 PHP5.3,你也可以这样做:

function date_validWeekday($format, $date, array $weekdays) {
    return in_array(
        DateTime::createFromFormat($format, $date)->format('w'),
        $weekdays);
}

var_dump(date_validWeekday('d.m.Y', '21.05.2010', array(0,1,2))); // FALSE
var_dump(date_validWeekday('d.m.Y', '11.05.2010', array(0,1,2))); // TRUE
于 2010-05-11T10:59:22.043 回答
1

它在星期四继续返回的原因是因为您使用strtotime()的是个位数整数:

$weekday=date("l",date("w",strtotime($wd)));

发生了两件事之一,我想我不确定是哪一个:

  1. 该函数将整数解释为纪元时间戳,或

  2. 该函数返回 false,该date函数将其作为0.

无论哪种情况,您都在原始 Epoch 开始时间的 10 秒内:

Thu, 01 Jan 1970 00:00:00 GMT

这是星期四。

于 2010-05-11T11:00:23.727 回答
0
function dateIsAllowedWeekday($_date,$_allowed){
    if ((isDate($_date)) && (($_allowed!="null") && ($_allowed!=null))){
        return in_array(date("w",strtotime($_date)),json_decode($_allowed));
    }

    return false;
}
于 2010-05-11T11:06:07.023 回答