I was running into some date validation problems between jQuery datepicker and ZF1. My client wanted one date picker to use a “January 01, 2000” format, and the others a “01/02/2000” format. Seems simple enough.

So I went digging into Zend_Validate_Date. It winds up checking Zend_Date::isDate, so I figured that would be a good place to see what the valid formats were to describe my form.
$long = new ZendX_JQuery_Form_Element_DatePicker('LONGDATE');
$long->setLabel('Long Date')
->setRequired(false)
->setOptions(array('jQueryParams'=>array(
'dateFormat'=>'MM dd, yy',
'changeYear'=>'1',
'defaultDate'=>'January 01, '.date('Y'))))
->addValidator(new Zend_Validate_Date('MMMM dd, yyyy'));
$compact = new ZendX_JQuery_Form_Element_DatePicker('COMPACT');
$compact->setLabel('Compact Date')
->setRequired(false)
->setOptions(array('jQueryParams'=>array(
'changeYear'=>'1',
'defaultDate'=>'01/01/'.date('Y'))))
->addValidator(new Zend_Validate_Date('MM/dd/yyyy'));
As you can see, jQuery uses a different formatting system than Zend_Date but that is okay.
Whenever I tried to save the form, the $long element would error out that ‘January 01, 2013’ was not in a valid ‘MMMM dd, yyyy’ format. That didn’t make sense.
Turns out that other have had similar problems. If fact, there is even a few bug reports on the subject. The problem goes from Zend_Validate_Date to Zend_Date to Zend_Locale_Format, at which point I got tired. Alas, even if it does work in ZF2, I can’t migrate this massive codebase fast enough.
I wanted to see how deep the rabbit hole went but there were too many gnomes. If you want to see how odd things get, try this out for kicks:
$dateTests = array(
'January 12, 2012', 'Jan 12, 2012',
'Feb 23, 1975', 'December 33, 3344',
'01/02/2012', '01-02-2012',
'20120102', '2012',
'13012012', '122903',
);
$formatsTest = array(
'G','GG','GGG','GGGG','GGGGG',
'y','yy','yyy','yyyy','yyyyy',
'Y','YY','YYY','YYYY','YYYYY',
'M','MM','MMM','MMMM','MMMMM',
'w','ww',
'd','dd',
'D','DD','DDD',
'E','EE','EEE','EEEE','EEEEE',
'e','ee',
'a',
'h','hh',
'H','HH',
'm','mm',
's','ss',
'S',
'z','zz','zzz','zzzz',
'Z','ZZ','ZZZ','ZZZZ',
'A',
'b7',
'MMMM dd, yyyy',
'MMMM/dd/yyyy',
'dd-MM-yyyy'
); ?>
<table>
<thead><tr><th>ZVD Format</th><th>Test Date</th><th>Valid?</th><th>IsDate?</th><th>Errors</th></tr></thead>
<tbody>
<?php
foreach ($formatsTest as $f){
$v = new Zend_Validate_Date($f);
foreach ($dateTests as $d){
$valid = $v->isValid($d);
$isDate = Zend_Date::isDate($d, $f, 'en');
$fail='';
if (count($v->getErrors())>0){
$fail = array_shift($v->getErrors());
}?>
<tr style="<?php if (!$valid) {?>background:#daa;<?php }
if (!$isDate){?>color:#500;<?php } ?>">
<td><?php echo $f; ?></td>
<td><?php echo $d; ?></td>
<td><?php echo ($valid?"Y":'N')?></td>
<td><?php echo ($isDate?"Y":"N")?></td>
<td><?php echo $fail; ?></td>
</tr>
<?php
}
}
?>
</tbody></table>