在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:00DateTime . 注意:不仅年份设置为83,而且日期日期从31更改为28 .

我可以理解年份部分,因为日期解析器无法确切知道这里的含义 . 但是,那一天我无法理解 .

我想实现以下行为:如果用户输入小于100的年份,则在 FormEvents::SUBMIT 事件处理程序中应用一些手动猜测逻辑 . (例如:如果输入的年份小于或等于当前年份的最后两位数字,则添加2000,否则添加1900.)

但是,如果我不能确定日期的日期和月份那么我怎样才能正确“修复”这样的日期呢?

有人知道(优雅)解决这个问题的方法吗?