我在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)并没有给我任何价值。但是看看这个值,它是一个日期数据类型,它似乎是正确的格式。
有什么想法吗?感谢
答案 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)
通过查看各个组件之间的分隔符来消除m / d / y或d-m-y格式的日期:如果分隔符是斜杠(/),则假设为美国m / d / y;而如果分隔符是破折号( - )或点(。),则假定为欧洲d-m-y格式。 为避免潜在的歧义,最好尽可能使用ISO 8601(YYYY-MM-DD)日期或DateTime :: createFromFormat()。
在您的情况下,日期被视为m / d / y格式,这使得strtotime返回false,因为月份无效。