Subtilité de Zend_Date

Je viens de tomber sur un méchant bogue dans mon application. Il est du à une subtilité dans les formats ISO proposés par Zend_Date.

Le problème se situe au niveau des années. Zend_Date propose deux formats différents : yyyy et YYYY. Le premier, celui avec les y en minuscules fournit le résultat auquel on peut s'attendre, alors que le deuxième renvoie l'année dans lequel se situe la semaine !

Si je prends l'exemple du dimanche 3 janvier 2010, YYYY-MM-dd renvoie 2009-01-03 au lieu du 2010-01-03 auquel on pourrait s'attendre, car ce jour fait partie de la semaine 53 de l'année 2009. Comme quoi il faut bien lire la doc :

For year there are two specifiers available which are often mistaken. The Y specifier for the ISO year and the y specifier for the real year. The difference is small but significant. Y calculates the ISO year, which is often used for calendar formats. See for example the 31. December 2007. The real year is 2007, but it is the first day of the first week in the week 1 of the year 2008. So, if you are using 'dd.MM.yyyy' you will get '31.December.2007' but if you use 'dd.MM.YYYY' you will get '31.December.2008'. As you see this is no bug but a expected behaviour depending on the used specifiers.

Une consolation, je ne suis pas le seul à m'y être fait prendre, puisqu'un rapport de bogue a déjà été ouvert : http://framework.zend.com/issues/browse/ZF-8277

A bon entendeur...

Commentaires

Bonjour,

Cette subtilité méritait d'être mise en avant. Merci !
Faut-il en conséquence corriger le billet "Localiser un champ date"

class Wiip_Date extends Zend_Date
{
const MYSQL_DATE = 'YYYY-MM-dd';
const MYSQL_DATETIME = 'YYYY-MM-dd HH:mm:ss';
}

??

Tout à fait. Je m'y attaque dès maintenant.

En fait ce n'est pas la première issue sur le sujet. Elles arrivent par vague tous les ans à cette période de l'année quand les développeurs/utilisateurs voient le 1er janvier apparaître. Et justement avant-hier, c'est ce qui m'est arrivé ;)

Ajouter un commentaire