Symfony 2.8日期表单格式错误:日份无法大于12
解决Symfony 2.8日期输入框日份大于12时的格式错误问题
这个问题的核心是你同时混用了HTML5原生日期输入框和jQuery Datepicker,两者的格式规则冲突导致验证失败,具体来说:
你在表单的attr里设置了'type' => 'date',这会让浏览器渲染原生的日期输入控件。原生控件的行为有两个关键点:
- 它的输入验证规则依赖系统区域设置,如果你的系统是MM/DD/YYYY的区域,日份大于12会被判定为无效月份,直接触发前端报错(输入框变红);
- 原生控件提交给服务器的日期格式固定为
YYYY-MM-DD,但你的Symfony表单配置的是dd/MM/y格式,两者不匹配,服务器端验证也会失败。
解决方案:移除HTML5原生日期类型,让jQuery Datepicker完全接管
修改你的代码如下:
1. 调整控制器中的表单配置
移除attr里的'type' => 'date',确保输入框是纯文本类型,同时可以统一日期格式为四位年份(更清晰):
->add('fecha_inicio', 'date', array( 'label' => "Vigente desde", 'input' => 'datetime', 'widget' => 'single_text', 'format' => 'dd/MM/yyyy', // 改用四位年份,也可保持dd/MM/y 'max_length' => 10, 'mapped' => false, 'required' => false, 'attr' => array( 'data-type' => 'date', 'placeholder' => 'DD/MM/YYYY' ), 'data' => new \DateTime('now') ))
2. 保持Twig中的jQuery Datepicker配置不变(或微调格式统一)
你的Datepicker配置已经是dateFormat: 'dd/mm/yy',和Symfony的dd/MM/yyyy是兼容的(yy对应两位年份,yyyy对应四位,Symfony会自动处理),如果想完全统一,也可以把Datepicker的格式改成dd/mm/yyyy:
$('#form_fecha_inicio').datepicker({ showOtherMonths: true, selectOtherMonths: true, numberOfMonths: 1, dateFormat: 'dd/mm/yyyy', // 可选:和Symfony格式完全统一 required: false, showOn:'button', buttonImageOnly:true, buttonImage:'{{asset('img/icons20px/calendario.png')}}', buttonText:'Seleccionar Fecha', });
额外注意事项
- 清除浏览器缓存:修改表单属性后,浏览器可能会缓存旧的HTML结构,记得强制刷新页面(Ctrl+F5);
- 服务器端验证兜底:如果需要更严格的验证,可以给表单字段添加
Date约束,明确指定格式:
use Symfony\Component\Validator\Constraints\Date; // 在表单add方法的options里添加constraints 'constraints' => array( new Date(array('format' => 'dd/MM/yyyy', 'message' => 'La fecha debe tener el formato DD/MM/AAAA')) )
这样调整后,输入框就会完全由jQuery Datepicker控制,日期格式和Symfony服务器端的验证规则完全匹配,日份大于12的日期也能正常提交和验证了。
内容的提问来源于stack exchange,提问作者M.M.
相关产品推荐
相关产品推荐

