在关于用户个人资料的Symfony表单中,我想以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
的{{1}}。
但是,如果有人在此表单字段中输入1983-05-31 00:00:00
,您将获得内容为31.5.83
的{{1}}。注意:不仅年份设置为83,而且日期日期从31更改为28。
我可以理解年份部分,因为日期解析器无法确切知道这里的含义。但是,那天我无法理解。
我想实现以下行为:如果用户输入小于100的年份,则在DateTime
事件处理程序中应用一些手动猜测逻辑。 (例如:如果输入的年份小于或等于当前年份的最后两位数字,则添加2000,否则添加1900.)
但是,如果我不能确定日期的日期和月份部分,那么我该如何正确“修复”这样的日期呢?
有人知道(优雅)解决这个问题吗?