¿Conoces la clase "DateTime"?

Es muy dificil conocer todas las funcionalidades que nos puede ofrecer un lenguaje, ya que leer el manual con el listado de funciones de arriba a abajo es tan divertido como leer la guía telefónica. Generalmente cuando tenemos un problema para resolver vamos a buscar en la sección correspondiente, según el tema, y listo (arrays, matemáticas, strings, etc). Lo importante muchas veces es, no solo saber de memoria, sino, saber donde buscar (o como dice el viejo dicho, "lo más importante es tener el teléfono de quién sabe", aunque esto lo único que hace es que evitemos aprender a valernos por nosotros mismos ;-)).

Siempre creí que la evolución natural de PHP debería ser juntar todas las funciones "sueltas" del lenguaje en formato "estructurado" y agruparlas en clases "base" como tiene cualquier lenguaje 100% Orientado a Objetos (tienen clases como String, Integer, etc, y si usamos un IDE veremos fácilmente toda la lista de métodos disponibles que se aplican a ese contexto concreto).

Nota al margen: hace unos años hicimos un experimento educativo y varios de mis alumnos de mi primer taller piloto a distancia hicieron un pequeño proyecto final que consistía desarrollar clases de tipo "wrapper" que cumplieran este objetivo (siguiendo el API de Java).

Espero que algún día PHP6 o 7 incorpore por defecto este tipo de organización que nos beneficiará a todos los desarrolladores.

De paso les comento que a veces, en raras ocasiones, podemos descubrir en el manual clases que vienen por defecto en PHP, por ejemplo, DateTime:

date_default_timezone_set('America/Argentina/Buenos_Aires');

$date = new DateTime("2009-02-28");
$date->modify("+1 day");
echo $date->format("Y-m-d");

$date = new DateTime("2009-01-01");
$date->modify("-1 day");
echo $date->format("Y-m-d");

// Salida:
//
// 2009-03-01
// 2008-12-31

Y Netbeans detecta todos sus elementos en la ayuda contextual:


Más información (obviamente): Manual Oficial de PHP

PD: y nunca te olvides de conocer las Standard PHP Library (SPL)

6 comentarios:

gbarce dijo...

Excelente Place, me vino al pelo este post.

gbarce dijo...

Pregunta: Porqué si pruebo poner en la zona horaria: "America/Uruguay/Montevideo" pone una hora más de lo que tenemos en Montevideo? es decir, entiendo que existe esa diferencia entre Uruguay y Argentina, pero no debería poner el horario directamente sin hacer cambio?, me expliqué? Gracias :D

ign dijo...

Justamente decidí utilizar esta clase para un pequeño proyecto hace poco...

Luego de que había avanzado mucho me topé con la necesidad de sumar una fecha. Naturalmente, encontré DateTime::add, pero esta está disponible a partir de 5.3.0! Pasé un buen rato para encontrar DateTime::modify.

Es triste como algo tan básico como una clase Date que encapsule el comportamiento aún esté a medias en php.

Enrique Place dijo...

Que tal gbarce ;-)

El tema es la configuración internacional, entre los países no tenemos diferencia real, solo que ahora en Uruguay modificaron la "hora de verano" y Argentina no, por lo tanto no lo toma en cuenta porque es un período especial por un lapso corto de tiempo y supeditado gobierno de turno ;-)

En si lo correcto sería que te diga la misma hora que Argentina, sin importar el horario de verano... entiendo que sería imposible estar ajustando este tema a nivel mundial ;-), ya creo que es un problema local que debes resolver en tu sistema.

Así entiendo que es el problema. Si encontrás más información sobre el tema, avisame.

Saludos! ;-)

Anónimo dijo...

¿Esto implica que a la hora de definir un atributo de una clase podemos declararlo de tipo DateTime?

Por ejemplo:

private $_nombre = '';
private $_edad = 0;
private $_fecha = new Datetime();

Estoy recien empezando con la poo, disculpen mi ignorancia.

Gracias.

Enrique Place dijo...

Que tal José ;-)

En sí, visto desde el lado de UML, los tipos de datos son genéricos, por lo tanto no dejaría de ser Date, y luego, dependiendo del lenguaje particular y sus capacidades, se podría usar la clase Date si existe, o alguna similar (como es el caso).

Desde el punto de vista de la traducción a PHP5, en los atributos directamente solo puedes inicializarlos con un valor escalar o un array, pero no un objeto. Deberías dejarlo vacío y luego cargarlo desde el constructor.

Cualquier otra duda me avisas y lo discutimos.

Saludos! ;-)

PD: disculpa la demora en responder, a veces me pasan por arriba todos los correos :-(

Entradas populares