sábado, 21 de enero de 2012

¡A navegar!

Con el script creado en la entrada anterior, sólo podemos saber la fecha del día de hoy, de ayer y de mañana.
Si quisiéramos hacer más "navegable" el script y que pudiéramos ir moviéndonos, de a un día, hacia adelante o atrás, podríamos escribir el siguiente script:

<?php
include("funciones.php");
if(!isset($_GET['fechaactual'])) {
$_GET['fechaactual']=time();}
$ayer=mktime(0,0,0,date("m",$_GET['fechaactual']), date("d",$_GET['fechaactual'])-1,date("Y",$_GET['fechaactual']));
$manana=mktime(0,0,0,date("m",$_GET['fechaactual']), date("d",$_GET['fechaactual'])+1,date("Y",$_GET['fechaactual']));
echo "<div style='text-align:center;'>";
echo "<h3>".traducir(date('l d \d\e F \d\e Y',$_GET['fechaactual']))."</h3>";
echo "<a href='index.php?fechaactual=".$ayer."'><< D&iacute;a anterior</a> | ";
echo "<a href='index.php?fechaactual=".$manana."'>D&iacute;a posterior>></a>";
echo "</div>";
?>


Ahora explico las líneas nuevas o diferentes con respecto al script de la entrada anterior:

  • En las líneas 3 agregué un if que pregunta si en la URL no (el signo ! indica negación) está definida (isset) la variable fechaactual
  • Si la respuesta el afirmativa, o sea, vía la URL no se recibió la variable fechaactual, entonces en la línea 4 defino dicha variable con el timestamp actual, o sea del momento en que se ejecuta el script.
  • Entre las líneas 5 y 6 definí las variables $ayer y $manana de forma similar a lo hecho en la entrada anterior, pero con el detalle que a cada ocurrencia de la función date le agregué el parámetro del timestamp guardado en  la variable fechaactual, de forma tal que $ayer y $manana hagan referencia al día actual guardado en  la variable fechaactual.
  • En la línea 8 también agregué a la  función date el parámetro del timestamp guardado en  la variable fechaactual, para que muestre la fecha seleccionada, formateada con la etiqueta <h3> .
  • En la línea 9 escribí un vínculo (etiqueta <a>) que llama a la misma página (index.php) pero agregándole un parámetro (después del signo ?) de nombre fechaactual con el contenido de la variable $ayer. De esta manera el vínculo apunta al día anterior al que se está mostrando.
  • Finalmente, la línea 10, hace básicamente lo mismo que la 9, pero el parámetro de nombre fechaactual contiene la variable $manana. De esta manera el vínculo apunta al día siguiente al que se está mostrando.

Lecturas recomendadas

sábado, 14 de enero de 2012

Mejor usar el español

El script creado en la entrada anterior devolvía las fechas del día actual, el anterior y el siguiente, pero tanto el día de la semana, como el mes, quedaban en inglés.
Para pasarlos al español se podría utilizar una función como la siguiente:

<?php
function traducir($fecha) {
if (strpos($fecha,"Monday")!==false) {
$fecha=preg_replace("/Monday/","Lunes",$fecha);
}
if (strpos($fecha,"Tuesday")!==false) {
$fecha=preg_replace("/Tuesday/","Martes",$fecha);
}
if (strpos($fecha,"Wednesday")!==false) {
$fecha=preg_replace("/Wednesday/","Miércoles",$fecha);
}
if (strpos($fecha,"Thursday")!==false) {
$fecha=preg_replace("/Thursday/","Jueves",$fecha);
}
if (strpos($fecha,"Friday")!==false) {
$fecha=preg_replace("/Friday/","Viernes",$fecha);
}
if (strpos($fecha,"Saturday")!==false) {
$fecha=preg_replace("/Saturday/","Sábado",$fecha);
}
if (strpos($fecha,"Sunday")!==false) {
$fecha=preg_replace("/Sunday/","Domingo",$fecha);
}
if (strpos($fecha,"January")!==false) {
$fecha=preg_replace("/January/","enero",$fecha);
}
if (strpos($fecha,"February")!==false) {
$fecha=preg_replace("/February/","febrero",$fecha);
}
if (strpos($fecha,"March")!==false) {
$fecha=preg_replace("/March/","marzo",$fecha);
}
if (strpos($fecha,"April")!==false) {
$fecha=preg_replace("/April/","abril",$fecha);
}
if (strpos($fecha,"May")!==false) {
$fecha=preg_replace("/May/","mayo",$fecha);
}
if (strpos($fecha,"June")!==false) {
$fecha=preg_replace("/June/","junio",$fecha);
}
if (strpos($fecha,"July")!==false) {
$fecha=preg_replace("/July/","julio",$fecha);
}
if (strpos($fecha,"August")!==false) {
$fecha=preg_replace("/August/","agosto",$fecha);
}
if (strpos($fecha,"September")!==false) {
$fecha=preg_replace("/September/","setiembre",$fecha);
}
if (strpos($fecha,"October")!==false) {
$fecha=preg_replace("/October/","octubre",$fecha);
}
if (strpos($fecha,"November")!==false) {
$fecha=preg_replace("/November/","noviembre",$fecha);
}
if (strpos($fecha,"December")!==false) {
$fecha=preg_replace("/December/","diciembre",$fecha);
}
return $fecha;
}
?>

Como se ve, el script precedente, declara una función de nombre traducir, a la que hay que pasarle un parámetro $fecha. Luego, busca con strpos, si en el contenido de $fecha está, por ejemplo, la palabra "Friday". En caso que la función no devuelva false, quiere decir que Friday sí está dentro de $fecha. Entonces, sustituye Friday por viernes con la función preg_replace. Y repite el mismo procedimiento con los nombres de los siete días de la semana y de los doce meses del año.
Para poder usar esta función se podría declararla dentro del mismo script de la entrada anterior o, mejor aún, declararlo en un script aparte y luego incluirlo. Para ello se debe guardar el script recién creado con un nombre, por ejemplo, funciones.php, y luego incluirlo en el script como se ve a continuación:

<?php
include("funciones.php");
$ayer=mktime(0,0,0,date("m"),date("d")-1,date("Y"));
$manana=mktime(0,0,0,date("m"),date("d")+1,date("Y"));
echo "<div style='text-align:center;'>";
echo "<h3>Hoy es ".traducir(date('l d \d\e F \d\e Y'))."</h3>";
echo "Ayer fue ".traducir(date('l d \d\e F \d\e Y',$ayer))."<br>";
echo "Ma&ntilde;ana ser&aacute; ".traducir(date('l d \d\e F \d\e Y',$manana))."</div>";
?>

Las diferencias con respecto al script de la entrada anterior son:

  • la inclusión (con la función include) del script funciones.php en la línea 2,
  • el llamado, o invocación, a la función traducir (declarada en el script funciones.php) en las líneas 6, 7 y 8.

Al ejecutar este script el 13 de enero de 2012, da el siguiente resultado:


Lecturas recomendadas

sábado, 7 de enero de 2012

¿Qué día fue ayer? ¿Y hoy? ¿Y mañana?

La función date() permite darle formato a una fecha u hora. Como parámetro de formato se le puede pasar más de una veintena de opciones. Por ejemplo, la "l" ("L" minúscula) muestra el día de la semana en texto completo. Opcionalmente se le puede pasar otro parámetro, el timestamp. En caso de no existir, toma el valor de time ().
Entonces, al ejecutar el siguiente script:
<?php
echo "Hoy es ".date("l");
?>
el viernes 6 de enero de 2012, el resultado sería:


Si se usa la función date() en combinación con la función mktime(), se pueden calcular fechas futuras o pasadas:

<?php
$ayer=mktime(0,0,0,date("m"),date("d")-1,date("Y"));
$manana=mktime(0,0,0,date("m"),date("d")+1,date("Y"));
echo "<div style='text-align:center;'>";
echo "<h3>Hoy es ".date('l d \d\e F \d\e Y')."</h3>";
echo "Ayer fue ".date('l d \d\e F \d\e Y',$ayer)."<br>";
echo "Ma&ntilde;ana ser&aacute; ".date('l d \d\e F \d\e Y',$manana)."</div>";
?>

Al ejecutar ese scritp el 6 de enero de 2012, el resultado es el siguiente:


Explico el script, línea por línea:
  1. Marca de apertura del script PHP
  2. Define la variable $ayer. La misma contiene la función mktime con los seis parámetros que recibe:
    1. hora
    2. minutos
    3. segundos
    4. mes
    5. día
    6. año
    Los tres primeros (hora, minutos, segundos) están en cero, pues no interesan para este script. Los demás llaman a la función date(), cada uno con un parámetro de formato distinto: "m" para el número del mes, "d" para el número del día y "Y" para el año con cuatro dígitos. Todos hacen referencia a la fecha en que se ejecuta el script, menos el día, ya que como dice date("d")-1, la variable $ayer guarda la información del día anterior al que se ejecuta el script.
  3. Es igual a la línea anterior, con la diferencia que como dice date("d")+1, la variable $manana guarda la información del día siguiente al que se ejecuta el script.
  4. Imprime en la pantalla una etiqueta HTML <div> para abrir una caja con un estilo en línea aplicado para que el texto que va a contener quede centrado.
  5. Imprime en la pantalla una etiqueta HTML de apertura de subtítulo <h3> y luego el texto Hoy es .
    Con el punto concatena el resultado de ejecutar la función date con los siguientes parámetros de formato:
    • l - para mostrar en forma textual en inglés el día de la semana.
    • d - para mostrar el número del día del mes.
    • \d\e - las barras invertidas son caracteres de escape, para conseguir que el caracter inmediatamente después de la barra no se procese y se muestre tal cual. Con esto se logra que en la pantalla se vea la palabra "de".
    • F - para mostrar el nombre del mes completo en inglés.
    • \d\e - lo mismo ya explicado dos líneas más arriba.
    • Y - para mostrar el año.
    Como no aplica un timestamp, usa el del momento en que se ejecuta el script
    Por último, concatena la etiqueta HTML de cierre del subtítulo </h3>.
  6. Hace algo muy similar a la línea anterior, pero, como le aplica un timestamp diferente, el resultado será otro. En este caso, el timestamp guardado en la variable $ayer que había sido definida en la línea 2.
  7. Lo mismo que la línea anterior, pero con la variable $manana definida en la línea 3.
  8. Marca de cierre del script PHP

Lecturas recomendadas