如何将PHP日期格式转换为MySQL日期格式?优化转换代码方案
更优雅的日期格式转换方案
针对你要把dd/mm/yyyy格式的日期转换成MySQL支持的Y-m-d格式的需求,这里有几种更简洁优雅的实现方式,比你现在的两步替换+转换要更可靠(毕竟strtotime对某些格式的解析可能有歧义):
方法一:使用DateTime类(推荐)
PHP的DateTime类处理日期时间更灵活且不易出错,尤其是面对非标准格式的时候:
$start = $_POST['start']; // 输入格式:22/03/2018 // 直接按照输入格式解析,然后输出目标格式 $starttime = DateTime::createFromFormat('d/m/Y', $start)->format('Y-m-d');
这种方式的好处是明确指定了解析规则,不会像strtotime那样因为地区设置或者格式歧义导致解析错误,比如如果输入是03/22/2018,strtotime可能会当成m/d/Y来解析,而createFromFormat完全按照你指定的规则来,更可靠。
如果担心输入格式不正确,可以加上错误处理:
$start = $_POST['start']; $date = DateTime::createFromFormat('d/m/Y', $start); if ($date && $date->format('d/m/Y') === $start) { $starttime = $date->format('Y-m-d'); } else { // 处理日期格式错误的情况,比如返回提示或者默认值 $starttime = null; }
方法二:使用strptime(适合简单场景)
strptime可以直接解析指定格式的字符串为时间数组,再拼接成目标格式:
$start = $_POST['start']; $timeArr = strptime($start, '%d/%m/%Y'); $starttime = sprintf('%04d-%02d-%02d', $timeArr['tm_year'] + 1900, $timeArr['tm_mon'] + 1, $timeArr['tm_mday']);
不过要注意strptime在Windows系统上可能有兼容性问题,所以如果你的部署环境是跨平台的,还是优先用DateTime类。
对比原实现的优势
你原来的代码通过str_replace把/换成-,再用strtotime解析,虽然能工作,但存在隐患:比如当输入是03/04/2018时,strtotime可能会根据服务器的地区设置,当成m/d/Y或者d/m/Y,导致解析出错误的日期。而上面的两种方法都是显式指定解析格式,避免了这种歧义,代码也更简洁。
内容的提问来源于stack exchange,提问作者JulianJ
相关产品推荐
相关产品推荐

