Estoy usando LAMP en Kubuntu 14.04 con PHP 5.6.23.

Al usar DateTime en los siguientes casos:

1.

print_r((new DateTime('2016-02-31'))->format('M/d/Y')); 
// Mar/02/2016 (no errors, why?)

2.

print_r((new DateTime('2016-02-32'))->format('M/d/Y')); 
// Error - DateTime::__construct(): Failed to parse time string-
// (2016-02-32) at position 9 (2): Unexpected character

¿Por qué el primer caso no me da ningún error, ya que no hay fecha 31 del mes de febrero?

Se solicitan referencias que respalden la respuesta

5
Sohel Ahmed Mesaniya 9 dic. 2016 a las 15:50
2
¿Alguna vez ha visto un mes con más de 31 días?
 – 
Blueblazer172
9 dic. 2016 a las 15:52
El error viene porque no hay meses con más de 31 días. Funciona para febrero porque agrega los días adicionales (2 o 3) y los resultados en marzo. Vea esta respuesta: stackoverflow.com/questions/3602405/…
 – 
Musterknabe
9 dic. 2016 a las 15:53
Porque 32 no es un día legal del mes. El otro caso notará que no hay 31 de febrero y calculará el día siguiente correcto.
 – 
cb0
9 dic. 2016 a las 15:53

1 respuesta

La mejor respuesta

De los php docs:

Es posible desbordar y desbordar el formato dd y DD. El día 0 significa el último día del mes anterior, mientras que los desbordamientos cuentan en el mes siguiente. Esto hace que "2008-08-00" sea equivalente a "2008-07-31" y "2008-06-31" sea equivalente a "2008-07-01" (junio solo tiene 30 días).

Tenga en cuenta que a partir de PHP 5.1.0 el rango de días está restringido a 0-31 como lo indica la expresión regular anterior. Por tanto, "2008-06-32" no es una cadena de fecha válida, por ejemplo.

Esto lo deja bastante claro.

En las notas de usuario Mirek también sugiera usar mktime si lo necesita:

desbordamiento / subdesbordamiento ilimitado para cálculos de fecha (por ejemplo, 2015-01-40 a 2015-02-09)

7
cb0 9 dic. 2016 a las 16:03