在Symfony形式中,用户's profile I'喜欢以 dd.MM.yyyy
形式呈现用户的生日,例如: 31.05.1983
. 但是,我希望应用程序处理案例,其中用户没有优雅地输入生日的完整版本,例如: 31.5.83
应转换为 31.05.1983
.
在表单中我添加了以下字段:
$form->add('dateOfBirth', 'birthday', [
'input' => 'datetime',
'view_timezone' => 'UTC',
'format' => 'dd.MM.yyyy',
'widget' => 'single_text',
'required' => false,
])
注意:我添加了 'view_timezone' => 'UTC'
选项值,因为生日期被解析为 DateTime
(由Symfony)并转换为UTC(由我),我想避免因时区转换而导致的任何日期翻转 . PHP配置为默认时区 CET
,比 UTC
提前一小时 .
有了这个表单字段,当有人输入日期 31.05.1983
时一切都很好 . 在标准化形式中,您将获得 DateTime
,其内容为 1983-05-31 00:00:00
.
但是,当有人在此表单字段中输入 31.5.83
时,您将获得内容为 0083-05-28 23:38:00
的 DateTime
. 注意:不仅年份设置为83,而且日期日期从31更改为28 .
我可以理解年份部分,因为日期解析器无法确切知道这里的含义 . 但是,那一天我无法理解 .
我想实现以下行为:如果用户输入小于100的年份,则在 FormEvents::SUBMIT
事件处理程序中应用一些手动猜测逻辑 . (例如:如果输入的年份小于或等于当前年份的最后两位数字,则添加2000,否则添加1900.)
但是,如果我不能确定日期的日期和月份那么我怎样才能正确“修复”这样的日期呢?
有人知道(优雅)解决这个问题的方法吗?