Etiqueta: fechas

  • Cómo pasar datos de tipo DateTime a través de $_GET

    Cómo pasar datos de tipo DateTime a través de $_GET

    Tenés una fecha guardada en un objeto DateTime y necesitás enviarla a otra página… incluso puede que sea una página de otro sitio (un servicio web por ejemplo).

    Suponiendo que la URL del destino es algo como http://otrositio.com?fecha=dd-mm-YYYY, sólo se trata de tomar el string http://otrositio.com?fecha= y concatenar el objeto.

    No parece muy complicado, ¿no?

    No es que sea una ciencia oculta tampoco, pero no es tan simple.

    ¿Cuál es el problema?

    La clase DateTime no cuenta con un método __toString, con lo cual, si intentás algo como:

    <?php
    
    $d = new DateTime();
    $url = 'http://otrositio.com?fecha='.$d;

    Te vas a encontrar con un error:

    PHP Warning:  Uncaught Error: Object of class DateTime could not be converted to string

    El punto es que no existe una única forma de expresar una fecha como una cadena.

    Por ejemplo:

    • 22-12-1977
    • 22 de Diciembre de 1977
    • Jueves 22 Dic. 1977

    Y unas cuantas más son, en rigor, la misma fecha.

    De modo que PHP no es capaz de adivinar cuál de todos estos formatos querés usar.

    Cómo formatear una fecha usando PHP

    Claro que, siendo un problema tan común, no es extraño asumir que existe una solución estándar.

    Esta solución es precisamente el método format.

    Por ejemplo, para darle formato dd-mm-YYYY a una fecha se puede usar:

    <?php
    
    $d = new DateTime();
    $s = $d->format('d-m-Y');

    Y luego usar el resultado para generar la URL:

    <?php
    
    $d = new DateTime();
    $s = $d->format('d-m-Y');
    $url = 'http://otrositio.com?fecha='.$s;

    Cómo transformar un string recibido por $_GET en un DateTime

    Y ahora… qué pasaría si tu situación es la inversa, es decir, ¿qué deberías hacer si necesitás tomar una fecha como parámetro desde la URL?

    Pues bien, aquí tu aliado será el constructor de la clase DateTime:

    <?php
    
    $d = new DateTime($_GET['fecha']);

    O bien, para evitar problemas, el método estático createFromFormat:

    <?php
    
    $d = DateTime::createFromFormat('d-m-Y', $_GET['fecha']);

    Y una vez convertido en objeto ya puedes usar todo el resto de los métodos que seguro te harán mucho más cómodo el trabajo con datos de tipo fecha.

  • Cuál es la mejor forma de almacenar fechas en MySQL

    Cuál es la mejor forma de almacenar fechas en MySQL

    ¿Tenés que desarrollar una aplicación que maneja fechas?

    Tal vez un portal para reserva de turnos, o quizás algún sistema de membresías por tiempo limitado o por qué no un programa que le pregunte al visitante su fecha de nacimiento y le diga el signo del horóscopo chino al que pertenece.

    Más allá de cuál sea el objetivo de la aplicación en algún lado vas a necesitar almacenar fechas.

    Y ese lado será probablemente una base de datos relacional y, más aún, si estás usando PHP, seguramente sea MySQL.

    Existen varias opciones que podrías usar para definir el tipo de datos del campo en cuestión y la decisión puede no ser trivial.

    Usar un VARCHAR para almacenar un dato fecha

    Si bien técnicamente podrías guardar una fecha en un campo de tipo VARCHAR (O cualquier otro tipo string), esto te hará difícil resolver algunos problemas como por ejemplo ordenar un set de resultados en función de la línea de tiempo.

    Es decir, si una fecha es '2020-02-01' y la otra es '19000-02-01' el motor te dirá que la primera es posterior a la segunda.

    Esto sucede porque, en lugar de tomar el valor como una fecha, se lo está tratando como una simple cadena de caracteres y, por lo tanto, se está aplicando el orden lexicográfico.

    Esto significa que para comparar se están tomando los caracteres y se comparan uno a uno, de este modo:

    20200201
    190000201

    Por otra parte, como se trata de cadenas, el motor no será capaz de determinar que '2020-13-35' no es un valor aceptable.

    Así que… no te lo recomiendo

    Usar un TIMESTAMP para almacenar un dato fecha

    Un segundo tipo de datos que podrías usar para guardar fechas es el TIMESTAMP.

    Este seguramente va a funcionar mejor que el VARCHAR, pero tampoco es el ideal.

    El TIMESTAMP es, internamente, un número muy grande que mide cuántos segundos pasaron desde segundo uno de UNIX (1970-01-01 00:00:01).

    Usualmente este tipo de datos se utiliza para operaciones que requieren altísima precisión, como procesos de tiempo real… un poco exagerado cuando se quiere saber la fecha en que una persona recibió su último aumento de sueldo, ¿no?

    Usar un DATE para almacenar un dato fecha

    La mejor opción es usar un campo de tipo DATE.

    Este tipo de datos modela una fecha mediante una estructura que tiene separados los componentes del mes, día y año.

    Si bien al momento de visualizarlo no será distinguible de un VARCHAR que tenga el mismo contenido, a nivel funcional será muy diferente.

    Entre otras, el tener los datos almacenados usando el tipo correcto permitirá realizar consultas como:

    SELECT * FROM usuarios WHERE subscription_date BETWEEN '2020-01-10' AND '2020-01-20';

    Y obtener como resultado aquellos usuarios que se han suscrito a nuestro sitio entre el 10 y el 20 de Enero de 2020.

    Usar un DATETIME para almacenar un dato fecha

    Si necesitas almacenar, además de la fecha, la hora exacta en que sucedió algo, lo mejor es utilizar el tipo de datos DATETIME que se comporta igual que DATE pero agregando la información de horas, minutos y segundos.