You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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要识别法语的月份名称。具体步骤如下:

  1. 首先设置PHP的区域设置为法语,确保能解析法语的月份和星期缩写:
    // 设置法语区域(不同服务器可能需要调整,比如fr_FR.UTF-8)
    setlocale(LC_TIME, 'fr_FR', 'fr_FR.utf8', 'fr', 'french');
    
  2. 使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:07:18