strtotime函数(PHP)的奇怪问题 - 如何修复?

时间:2014-10-23 05:04:10

标签: php

我在PHP中遇到了strtotime函数的奇怪问题。

这是我的代码:

$firstregdate = null;
if (! is_null($item["refer_date"])) {
    $temp = explode("/", $item["refer_date"]);
    $firstregdate = date("d/m/y", mktime(0, 0, 0, $temp[1], $temp[0], $temp[2]));
}
$epsstartdate = null;
if (! is_null($item["start_date"])) {
    $temp = explode("/", $item["start_date"]);
    $epsstartdate = date("d/m/y", mktime(0, 0, 0, $temp[1], $temp[0], $temp[2]));
}
$epsclosedate = null;
if (! is_null($item["end_date"])) {
    $temp = explode("/", $item["end_date"]);
    $epsclosedate = date("d/m/y", mktime(0, 0, 0, $temp[1], $temp[0], $temp[2]));
}

echo $firstregdate." | ".$epsstartdate." | ".$epsclosedate."<br>";
echo strtotime($firstregdate)." | ".strtotime($epsstartdate)." | ".strtotime($epsclosedate)."<br>";

这是输出:

08/02/13 | 13/02/13 | 05/03/14
1375367400 | | 1399041000

正如你所看到的,strtotime($ epsstartdate)并没有给我任何价值。但是看看这个值,它是一个日期数据类型,它似乎是正确的格式。

有什么想法吗?感谢

3 个答案:

答案 0 :(得分:1)

strtotime如果您使用mm/dd/yy分隔符,则预期日期格式为/。您可以通过将来电更改为date()来解决此问题:

$epsstartdate = date("m/d/y", mktime(0, 0, 0, $temp[1], $temp[0], $temp[2]));

或者您可以使用DateTime::createFromFormat()以您拥有的格式解析日期:

echo DateTime::parseFromFormat('d/m/y', $firstregdate)." | ".DateTime::parseFromFormat('d/m/y', $epsstartdate)." | ".DateTime::parseFromFormat('d/m/y', $epsclosedate)."<br>";

答案 1 :(得分:0)

您可以声明一个处理自定义日期格式的函数

function format_date($str,$format,$convertTo){
    switch($format){
        case "d/m/y":
            list($d,$m,$y) =  explode("/",$str);
            break;
        case "m/d/y":
            list($m,$d,$y) =  explode("/",$str);
            break;
        //You can customize your own format here
    }

    $timestamp = ($format) ? strtotime("$y-$m-$d") : strtotime($str);

    return date($convertTo,$timestamp);
}

// Date is same but with different format
$date_a = "2014-02-01"; //  Y-m-d
$date_b = "01/02/2014"; //  d/m/y
$date_c = "02/01/2014"; //  m/d/y

$convertTo = "Y-m-d";
echo format_date($date_a,false,$convertTo);
echo "<br/>";
echo format_date($date_b,"d/m/y",$convertTo);
echo "<br/>";
echo format_date($date_c,"m/d/y",$convertTo);

结果:

2014-02-01
2014-02-01
2014-02-01

答案 2 :(得分:0)

strtotime manual说,

通过查看各个组件之间的分隔符来消除m / d / y或d-m-y格式的日期:如果分隔符是斜杠(/),则假设为美国m / d / y;而如果分隔符是破折号( - )或点(。),则假定为欧洲d-m-y格式。 为避免潜在的歧义,最好尽可能使用ISO 8601(YYYY-MM-DD)日期或DateTime :: createFromFormat()。

在您的情况下,日期被视为m / d / y格式,这使得strtotime返回false,因为月份无效。