.  

 

 

.
.

26 / 10 / 2014

Usuarios conectados: 18

Cargando documento...

Buscar:

.

Este Sitio:

Principal

Dreamweaver

Fireworks

JavaScript

CSS

Sonido

Artículos

Links

E-ufemismos

Descargas

Historial

 

Mailing List:

Suscríbete a la lista de correo, No practico spamming y ofrece algunas ventajas.

Pulsa aquí para saber más y suscribirte.

 

Recomendados:

Tecnorama >Tutoriales Dreamweaver

 

Manejo de fechas en PHP y MySQL

Versión para imprimir | Translate this page

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:



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)?>

En el siguiente tutorial obtendremos el mismo resultado, pero directamente desde la consulta a MySQL.

¿Comentarios? 45, de momento. Mostrando 1 ->5

1.- The system I was wnoikrg on was importing the timestamps and the DST information wasn't being applied correctly.My solution may be a temporary hack but it was a fun exercise playing with strtotime() and realizing how good I have it with PHP's date functions. http://myzjhvp.com [url=http://sutszgybnyf.com]sutszgybnyf[/url] [link=http://rggghwn.com]rggghwn[/link]

2.- Not sure if it is the best way to do what I need, but I used this to determine how many hours to ofsfet the server time for the apps I am building, so the user sees local time. It worked like a charm, thanks.

3.- Thanks for the tip! This is really hepflul for one of my programms. I have a newsletter that pulls events for the next four weeks out of a calendar system. The system stores the event timestamps as GMT/UTC, but we are in either EST or EDT. If the current newsletter straddles the time change, the times for events after the time change are shown an hour off! By checking the event date against the time change boundary calculation, I can compensate for the discrepancy.

4.- support/generally being more easy ness. I'm also toying with the idea of putitng up an old post notice. Anyway, since my blog isn't (yet) sentient I can't really buy it a gift, and therefore http://ttwmdtysvrh.com [url=http://ugcyhqu.com]ugcyhqu[/url] [link=http://xgvlkzufmwx.com]xgvlkzufmwx[/link]

5.- Thanks for the info! That's actually kind of cool. I was wrnedoing why you haven't blogged in so long. I mean, even though you never say much, you always have something interesting to show us!

« Previous | 1 - 5 | 6 - 10 | 11 - 15 | 16 - 20 | 21 - 25 | 26 - 30 | 31 - 35 | 36 - 40 | 41 - 45 | Next »

Añade tu comentario



Escribe el código de la imagen superior:

:

Tutoriales Dreamweaver

-El muy buscado Menú desplegable

-¿Qué $%&$% es 'SSI'?

-Utilizar tablas de excel para actualizar tablas en html.

-Plantillas en DW MX: Regiones opcionales.

-Adaptar tablas a la ventana.

-Vista diseño para formatos no reconocidos

-Carga de imagenes en orden

-Mi primera Extensión

-Rollover remoto ('Disjointed Rollover')

-Iframes vs. Frames

-Contenido dinámico en celdas

-DW MX: Repeating Tables

-DW MX: Practica el Cloaking

-DW MX: CSS en tiempo Diseño

-Buscar y Reemplazar en Dreamweaver

-Menú dinámico

-Collaborative Dreamweaver: Design Notes and Files Panel

-Using PHP Server Formats and MySQL Dates

-Creando un Newsticker

-Generate Excel files with DWMX/PHP/MySQL (part 1)

-Manejo de fechas en PHP y MySQL

-Generate Excel files with DWMX/PHP/MySQL (part 2)

-Manejo de Fechas en consultas a MySQL

-Showing all records by default in a results page (PHP)

-Retrieving data using AHAH (1)

-Retrieving data using AHAH (2)

-Retrieving data using AHAH (3)

TECNORAMA es simplemente una página personal. No sirve ni de promoción del autor ni cosas por el estilo.
Todos los códigos, textos y tutoriales son de libre uso mientras se mencione al autor (no es mucho pedir)
Este sitio es compatible con IE6/NS6/Mozilla1.0
Para contactar, puedes enviarme un e-mail a tecnorama@hotmail.com