Manejo de fechas en PHP y MySQL con DreamWeaver

dreamweaver
Creando Cursos con CourseBuilder y DreamWeaver
25 diciembre, 2014
dreamweaver
Comprobar Ortografía en DreamWeaver
25 diciembre, 2014

Manejo de fechas en PHP y MySQL con DreamWeaver

dreamweaver

Este es el primero de una serie de 3 tutoriales sobre manipulacion de fechas en PHP y MySQL, orientado sobre todo a los usuarios de Dreamweaver (especialmente el tercero), aunque los que esten comenzando con PHP y MySQL puede que tambien lo encuentren de utilidad.

El tutorial se basa en un caso prático: tu sitio ofrece una oferta durante un tiempo limitado a los usuarios suscritos y quieres recordarles en cada entrada el tiempo que aún les queda para disfrutarla.

Un ejemplo de lo que mostraría sería ésto:

“Hola Juan: la oferta de subscripción gratuita durante 90 días (a la que se apuntó el 20/07/2004) terminará dentro de 80 días(20/10/2004)”.

Si prestas atención al ejemplo, verás que necesitamos 5 variables:

1.-Cuándo se apuntó el usuario?
Es la fecha de subscripción (20/07/2004). Es una variable que debería estar alojada en la base de datos.

2.-Qué día es hoy?
Necesitaremos saber la fecha actual, ya que nos servirá para calcular el tiempo restante.

3.-Cuánto dura la subscpripión?
Son los 90 días del ejemplo. Podría estar recogida en la base de datos o simplemente declarada en el código, que será el método que utilizaremos para simplificar el ejemplo.

4.-Cuándo termina la subscripción (20/10/2004)?
Lo podemos calcular: Será la fecha de subscripción más la duración de la misma.

5.- Cuál es el tiempo restante (80 días)?
También lo podemos calcular: Será la diferencia entre la fecha de expiración (obtenida en el punto 4) y la fecha actual.

Es decir: Los únicos valores que necesitamos aportar son la fecha de subscripción y la duración de la misma; todos los demas valores los podemos obtener.

Para nuestro ejemplo, hemos guardado la fecha de subscripción en un campo llamado “fecha_subscrip”, que forma parte de una tabla llamada “tbl_usuarios” con un formato del tipo “date” (para ver de paso un poco sobre este tipo de campo y como manejarlo). El nombre de usuario se aloja en el campo ”nombreUsuario”.

La sentencia SQL, vista en DWMX, podría tener este aspecto. No es un modelo muy ortodoxo, pero nos permitirá concentrarnos en lo que nos interesa:

recordset

SELECT nombreUsuario, UNIX_TIMESTAMP(fecha_subscrip) AS fecha_subscrip FROM tbl_usuarios WHERE nombreUsuario=’unParametro’

En esta consulta hay ciertos detalles:

1.- El uso de la función ‘UNIX_TIMESTAMP(campo)’: Esta función devuelve el valor del campo indicado en formato UNIX (segundos transcurridos desde 1/1/1970). Este formato UNIX es el más indicado para manejar fechas en PHP, por lo que es altamente recomendable (en mi opinion) reconvertir cualquier fecha a este formato si se desea manipularla en PHP.

Algunos ya sabréis que MySQL también posee funciones para manejo de fechas y el segundo artículo, basado en este mismo ejemplo, se dedicará al tema. De hecho, frente a la flexibilidad del método utilizando PHP, realizar los cálculos directamente en la consulta puede en ocasiones optimizar el rendimiento.

2.- Hemos definido un alias:

(UNIX_TIMESTAMP(fecha_subscrip) AS fecha_subscrip)

Esto permitirá a DWMX mostrar correctamente el nombre, ya que no entiende muy bien los nombres de campos envueltos por una función pero maneja perfectamente el uso de alias.

3.- Hemos incluído un parámetro para filtrar el dato: puedes utilizar el sistema que prefieras, por lo que aqui simplemente lo hemos definido como una variable de sesión.

Ya tenemos todo lo necesario para calcular los 5 valores:

1.- Fecha de Subscripción:
Una sencilla: sólo necesitamos la función date():

echo date(“d/m/Y”,$row_RSusuarios[‘fecha_subscrip’]);

2.-Fecha actual:
Tampoco es dificil: date() dando formato a time() o, más sencillo aún, declarando sólamente el formato (la función asume que nos referimos a la hora actual)

echo date(“d/m/Y”,time());
echo date(“d/m/Y”);

3.- Duración de la oferta:
Para simplificar este paso, la declararemos directamente en el código. Utilizaremos para el ejemplo 90 días.

4.- Fecha de expiración:
Obtener este dato es un poco más complicado, pero para eso existe la función strtotime().

¿ Qué la hace interesante? Pues la capacidad que tiene para entender y manejar fechas en formato más o menos “humano”.

strtotime() requiere 2 parametros:

• Una fecha en formato string: El formato utilizado se debe ser uno de los incluidos en la lista de formatos GNU, incluyendo fechas relativas(como “next Monday”). Puedes ver el listado completo en: http://www.gnu.org/software/tar/manual/html_chapter/tar_7.html

• Una fecha en formato Unix: Este parámetro es opcional. Si no se declara, la función asume por defecto la fecha actual si el primero es una fecha relativa (“next monday”, por ejemplo). Si la fecha del primer parametro es absoluta (“5 August 2002”), no es necesario declararlo. La función devuelve el resultado en formato Unix (es decir, manejable sin problemas por date()).

Veamos algunos ejemplos para entenderlo mejor:

strtotime(“now”);//equivale a time()
strtotime(“5 August 2002”);//Devuelve la fecha Unix del 5 de Agosto de 2002
strtotime(“next Monday”);//Devuelve el próximo lunes
strtotime(“+2 weeks”);//Devuelve la fecha para dentro de 2 semanas a partir de hoy

Algún ejemplo más complejo:

//Buscamos Unix timestamp:
$fecha=strtotime(“5 August 2002”);
//Ahora, el Unix timestamp para el primer lunes
//después del 5 de agosto:
$proximo_lunes=strtotime(“next Monday”,$fecha);
//damos formato…
echo date(“d/m/Y”,$proximo_lunes);

O, si prefieres hacerlo todo en una linea:

echo date(“d/m/Y”,strtotime(“next Monday”,strtotime(“5 August 2002”)));

Por lo tanto, para calcular la fecha de finalización podemos escribir (recuerda que ya habíamos hallado el formato Unix de “fecha_subscrip” en la consulta a la base de datos a través de UNIX_TIMESTAMP()):
$fecha_final=strtotime(“+90 days”,$row_RSusuarios[‘fecha_subscrip’]);
echo date(“d/m/Y”, $fecha_final);

5.- Dias hasta la finalización

Ya sabemos la fecha actual (punto 2) y la final (punto 4), por lo que simplemente dividir la diferencia entre 86400 (número de segundos que tiene un día) nos dará la solución.

Vamos a agruparlo todo:

<?php
//Fecha de inicio, alojada en la BD:
$fecha_inicio=$row_RSusuarios[‘fecha_subscrip’];
//final: dentro de 90 dias
$fecha_final=strtotime(“+90 days”, $fecha_inicio);
//¿Cuanto queda?
$quedan_dias=ceil(($fecha_final-time())/86400);
//damos un poco de formato a los dias restantes…
switch($quedan_dias){
  case 0:
    $dias=”hoy”;
    break;
  case 1:
    $dias=”mañana”;
    break;
  default:
    $dias=”dentro de “.$quedan_dias.” días”;
}
?>

Un párrafo de ejemplo, utilizando las variables:

Tu oferta de prueba durante 90 días, que comenzó el <?php echo date(“d/m/Y”, $fecha_inicio)?>, finaliza <?php echo $dias?>, el <?php echo date(“d/m/Y”, $fecha_final)?>

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *