Question

I'm stuck with a problem how to check if a specific date is within allowed weekdays array in php. For example,

    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!"}

I have input dates formatted as "d.m.Y" and an array returned from database with weekday numbers (formatted as 'Numeric representation of the day of the week') like [0,1,2] - (Sunday,Monday,Tuesday).

The returned string from database can be "null", so i check it too. Then, the isDate function checks whether date is a date and it is ok.

I want to check if my date, for example 21.05.2010 is an allowed weekday in this array. My function always returns TRUE and somehow weekday is always 'Thursday' and i don't know why...

Is there any other ways to check this or what can be my error in the code above? thx

Was it helpful?

Solution

I'm not sure why you feel the need to convert the numeric day of the week into a string (eg "Sunday") as you only return a boolean value in the end; anyway I've removed that part and the below code should function as expected:

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;
}

Tested with 21.05.2010 (returns false), and 11.05.2010 (returns true), with your allowed_weekdays as above ([0,1,2]).

OTHER TIPS

If you got PHP5.3 running already, you can also do:

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

The reason why it keeps returning Thursday is because you are using strtotime() on single digit integer:

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

One of the two things is happening, thought I'm not sure which:

  1. the function interprets the integer as an epoch timestamp, or

  2. the function is returning false, which the date function gets as a 0.

In either case, you are within 10 seconds of the original Epoch start time:

Thu, 01 Jan 1970 00:00:00 GMT

Which is on a Thursday.

function dateIsAllowedWeekday($_date,$_allowed){
    if ((isDate($_date)) && (($_allowed!="null") && ($_allowed!=null))){
        return in_array(date("w",strtotime($_date)),json_decode($_allowed));
    }

    return false;
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top