Funciones de fecha y hora

Huso horario: función date_default_timezone_set()

La función date_default_timezone_set($identificador_de_zona_horaria) establece el huso horario que utilizan las funciones de fecha y hora. El manual de PHP contiene la lista de identificadores de zonas horarias válidas.

<?php
date_default_timezone_set("Europe/Madrid");
print "<p>" . date("Y") . "</p>\n";
?>
<p>2007</p>

Cuando la directiva error_reporting tiene establecido el valor E_STRICT, PHP genera un aviso si no se ha establecido el huso horario antes de utilizar cualquier función de fecha y hora.

<?php
print "<p>" . date("Y") . "</p>\n";
?>
Strict Standards: date() [function.date]: It is not safe to rely on the system's timezone settings. Please use the date.timezone setting, the TZ environment variable or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Europe/Paris' for '1.0/no DST' instead in ejemplo.php on line 2

2007

Generar cadena con fecha y hora

Función date()

La función date($formato) permite generar una cadena que incluye la fecha y/o la hora del sistema. La función date() espera uno o dos argumentos. El primer argumento define el formato de la cadena y el segundo el instante que se quiere convertir (si no se indica el segundo argumento, la función trabaja con la fecha y hora actual del sistema).

Para definir el formato de la cadena se utilizan, entre otros, los siguientes caracteres:

día mes año
números con ceros delante d m y (2 cifras)
Y (4 cifras)
números sin ceros delante j n
nombre corto (3 letras) D M
nombre largo (completo) l F
hora (12h) hora (24 h) minutos segundos
números con ceros delante h H i s
números sin ceros delante g G

Además, se pueden utilizar los siguientes valores:

carácter
fecha completa en formato RFC 2822 r
fecha completa en formato ISO 8061 c
número de días total del mes actual t
número del día de la semana (domingo: 7, lunes: 1, etc.) N
número del día de la semana (domingo: 0, lunes: 1, etc.) w
Número de día del año z
<?php
date_default_timezone_set("Europe/Madrid");
print "<p>Ejemplo 1: " . date("d/m/y H:i:s") . "</p>\n";
print "<p>Ejemplo 2: " . date("l, F jS Y ") . "</p>\n";
?>
<p>Ejemplo 1: 03/03/05 13:43:48</p>
<p>Ejemplo 2: Thursday, March 3rd 2005</p>

Función strftime()

La función strftime($formato) permite generar una cadena que incluye la fecha y/o la hora del sistema en el idioma deseado. La función strftime() espera uno o dos argumentos. El primer argumento define el formato de la cadena y el segundo el instante que se quiere convertir (si no se indica el segundo argumento, la función trabaja con la fecha y hora actual del sistema).

Para definir el formato de la cadena se utilizan, entre otros, los siguientes caracteres:

día mes año
números con ceros delante %d %m %y (2 cifras)
%Y (4 cifras)
nombre corto (3 letras) %a %b
nombre largo (nombre completo) %A %B
hora (12h) hora (24 h) minutos segundos
números con ceros delante %I %H %M %S

Además, se pueden utilizar los siguientes valores:

carácter
fecha y hora (dd/mm/aaaa hh:mm:ss) %c
fecha (dd/mm/aaaa) %x
hora (hh:mm:ss) %X
<?php
date_default_timezone_set("Europe/Madrid");
setlocale(LC_TIME, "spanish");
print "<p>" . strftime("Ejemplo 1: %A, %d de %B de %Y") . "</p>\n";
?>
<p>Ejemplo 1: jueves, 30 de abril de 2009</p>

Fecha y hora actual: función localtime()

La función localtime() devuelve una matriz con información detallada de la fecha y hora actual. Para que devuelva esa información de la hora actual, se pasa como argumento la función time(). El segundo argumento indica si la matriz tiene índices asociativos.

<?php
$fecha_actual = localtime(time(), 1);
$anyo_actual  = $fecha_actual["tm_year"] + 1900;
$mes_actual   = $fecha_actual["tm_mon"] + 1;
$dia_actual   = $fecha_actual["tm_mday"];
print "<p>Hoy es el $dia_actual/$mes_actual/$anyo_actual.</p>";
?>
<p>Hoy es el 10/3/2005.</p>

Validación de fecha: función checkdate()

La función checkdate($mes, $dia, $anyo) devuelve el valor true si la fecha enviada es correcta en el calendario Gregoriano y false si no lo es.

<?php
$dia  = 29;
$mes  = 2;
$anyo = 2008;
if (checkdate($mes, $dia, $anyo)) {
    print "<p>El día $dia/$mes/$anyo existe.</p>\n";
} else {
    print "<p>El día $dia/$mes/$anyo no existe.</p>\n";
}
?>
<p>El día 29/2/2008 existe.</p>
<?php
$dia  = 29;
$mes  = 2;
$anyo = 2007;
if (checkdate($mes, $dia, $anyo)) {
    print "<p>El día $dia/$mes/$anyo existe.</p>\n";
} else {
    print "<p>El día $dia/$mes/$anyo no existe.</p>\n";
}
?>
<p>El día 29/2/2007 no existe.</p>

Hay que tener en cuenta que el calendario Gregoriano se estableció (en algunos países) a partir del 15 de octubre de 1582, por lo que no tiene sentido aplicar esta función a fechas anteriores a esa fecha. Por ejemplo, la función checkdate() no tiene en cuenta que hay unos días (del 5 al 14 de octubre de 1582) que no existieron en el calendario Gregoriano. Por otra parte, si el año es negativo o cero, la función checkdate() devuelve siempre false.

<?php
$dia  = 12;
$mes  = 10;
$anyo = 1582;
if (checkdate($mes, $dia, $anyo)) {
    print "<p>El día $dia/$mes/$anyo existe.</p>\n";
} else {
    print "<p>El día $dia/$mes/$anyo no existe.</p>\n";
}
?>
<p>El día 12/10/1582 existe.</p>
<?php
$dia  = 1;
$mes  = 1;
$anyo = 0;
if (checkdate($mes, $dia, $anyo)) {
    print "<p>El día $dia/$mes/$anyo existe.</p>\n";
} else {
    print "<p>El día $dia/$mes/$anyo no existe.</p>\n";
}
?>
<p>El día 1/1/0 no existe.</p>

Convertir cadenas de fechas

Para convertir las cadenas de fechas del formato dd-mm-aaaa al formato aaaa-mm-dd y viceversa se pueden definir estas funciones:

function fechaDma($amd)
{
    return substr($amd, 8, 2) . "-" . substr($amd, 5, 2) . "-" . substr($amd, 0, 4);
}

function fechaAmd($dma)
{
    return substr($dma, 7, 4) . "-" . substr($dma, 4, 2) . "-" . substr($dma, 1, 2);
}