PHP中如何将Bootstrap日期选择器日期转为MySQL存储格式
解决法语日期格式转换为数据库兼容格式的问题
我明白你遇到的麻烦了——Bootstrap日期选择器输出的是法语格式的日期字符串,直接用strtotime或者把字符串当DateTime对象处理都行不通,这是因为PHP默认的日期解析对非英语格式支持有限。下面给你一步步解决的方案:
为什么之前的方法失效?
- 代码1报错:
$_REQUEST['delivery_date']获取到的是纯字符串,不是PHP的DateTime对象,所以直接调用format()方法肯定会报错「Call to a member function format() on string」。 - 代码2返回1970日期:
strtotime()无法识别法语的月份名称(比如Janvier是法语的一月,而strtotime默认只认识英语的January),解析失败后就返回了Unix时间戳0,对应日期就是1970-01-01。
正确的转换方法
我们可以用DateTime::createFromFormat()方法,手动指定输入日期的格式,同时告诉PHP要识别法语的月份名称。具体步骤如下:
- 首先设置PHP的区域设置为法语,确保能解析法语的月份和星期缩写:
// 设置法语区域(不同服务器可能需要调整,比如fr_FR.UTF-8) setlocale(LC_TIME, 'fr_FR', 'fr_FR.utf8', 'fr', 'french'); - 使用
createFromFormat解析输入的日期字符串,指定输入格式为D. d MM yyyy:$deliverydate = $_REQUEST['delivery_date']; // 创建DateTime对象,第二个参数是区域设置(这里用系统默认的即可) $dateObj = DateTime::createFromFormat('D. d MM yyyy', $deliverydate); // 转换为数据库需要的Y-m-d格式 $deliverydate_conv = $dateObj->format('Y-m-d');
整合到你的hook函数里
注意你的代码里$id变量没有定义,你需要从$postdata或者其他地方获取订单ID,比如$id = $postdata['orderID'];(根据你的实际字段调整)。完整的修正代码如下:
public function hook_before_add(&$postdata) { # START POPULATE the deliverydate FIELD // 获取提交的日期字符串 $deliverydate = $_REQUEST['delivery_date']; // 设置法语区域,确保能解析法语日期 setlocale(LC_TIME, 'fr_FR', 'fr_FR.utf8', 'fr', 'french'); // 解析日期并转换格式 $dateObj = DateTime::createFromFormat('D. d MM yyyy', $deliverydate); $deliverydate_conv = $dateObj->format('Y-m-d'); // 注意:这里需要确保$id有正确的订单ID值,比如从postdata里获取 $id = $postdata['orderID']; // 根据你的实际字段调整 # UPDATE THE deliverydate FIELD WITH THE RETURNED VALUE DB::table('orders') ->where('orderID', '=', $id) ->update(array('deliverydate' => $deliverydate_conv)); # END POPULATE the deliverydate FIELD }
额外提醒
如果服务器上没有安装法语区域包,setlocale可能会失效,这时候你可以手动创建一个月份映射数组,把法语月份转换成英语的,再用strtotime解析,比如:
$monthMap = [ 'Janvier' => 'January', 'Février' => 'February', 'Mars' => 'March', 'Avril' => 'April', 'Mai' => 'May', 'Juin' => 'June', 'Juillet' => 'July', 'Août' => 'August', 'Septembre' => 'September', 'Octobre' => 'October', 'Novembre' => 'November', 'Décembre' => 'December' ]; // 替换法语月份为英语 $deliverydate = str_replace(array_keys($monthMap), array_values($monthMap), $deliverydate); // 现在strtotime就能正确解析了 $deliverydate_conv = date('Y-m-d', strtotime($deliverydate));
这个方法不需要依赖服务器的区域设置,兼容性更好。
内容的提问来源于stack exchange,提问作者marcq
相关产品推荐
相关产品推荐

