开关语句损坏


Broken switch statement

我已经找了好几个小时了,不知所措。我有下面的代码,当八月日期通过switch(作为AUG)语句时,它会不断为值返回0,而不是8。回波结果位于代码块下方。有什么可能出错的想法吗?它似乎在7月份运行良好,8月1日坏了。

$when=date("Y-m-d");
    $created=date("Ymd");
    $date=explode('-',$emprow->HIRE_DATE);
    echo "<br>hire date is ";print_r($date);echo "<br>";
    switch ($date[1])
    {
        case "JAN":
            $date[1]=01;
            break;
        case "FEB":
            $date[1]=02;
            break;
        case "MAR":
            $date[1]=03;
            break;
        case "APR":
            $date[1]=04;
            break;
        case "MAY":
            $date[1]=05;
            break;
        case "JUN":
            $date[1]=06;
            break;
        case "JUL":
            $date[1]=07;
            break;
        case "AUG":
            $date[1]=08;
            break;
        case "SEP":
            $date[1]=09;
            break;
        case "OCT":
            $date[1]=10;
            break;
        case "NOV":
            $date[1]=11;
            break;
        case "DEC":
        case "Dec":
            $date[1]=12;
            break;
    }
    echo "<br>hire date is ";print_r($date);echo "<br>";
    $startdate=sprintf("%04d%02d%02d",$date[2],$misc->getmonthnum($date[1]),$date[0]);

结果如下:

聘用日期为Array ( [0] => 05 [1] => AUG [2] => 2013 )

聘用日期为Array ( [0] => 05 [1] => 0 [2] => 2013 )

起始日期为20130005

我验证了我在注释中的内容。

08是一个不存在的八进制数。使用"08"或8

当你准备输出时,你可以用零填充。

以下是PHP中使用原始代码的说明

$date[1]=08;
echo $date[1];
echo ' | ';
$date[1]=010;
echo $date[1];

输出:

0 | 8

根据我所见,在调用雇佣日期时,您使用$emprow->Hire_Date。

您将这样的日期分隔符"-"分解为3个数组,y、m、d,然后尝试解析"m"。我建议如下:

$date=$emprow->HIRE_DATE;
$unixtime=strtotime($date);
$newdate=date('m',$unixtime);

这应该会给你一个结果(当回显$newdate时)"08"

TecBrat是正确的。您的数字(08)被解释为八进制文字,由于8进制中没有8位数字,因此该数字无效,因此取为0。要解决这个问题,只需在数字周围加引号,就可以将它们视为字符串。

或者,你可以简单地做一些类似的事情

echo date_create('05-AUG-2013')->format('m'); // prints 08

只需删除左侧多余的零(即将08更改为8,将09更改为9,依此类推)或将它们转换为字符串。如果一个数字的左边有一个额外的零,它将被解释为八进制(基数为8的数字系统),其中数字8和9无效,从而破坏代码。