# 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>";
    ?>
| <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>";
    ?>
| 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

Volver al principio de la página

## 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 RFC2822 | 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>";
    print "<p>Ejemplo 2: ".date("l, F jS Y ")."</p>";
    ?>
| Ejemplo 1: 03/03/05 13:43:48 Ejemplo 2: Thursday, March 3rd 2005

Volver al principio de la página

### 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>";
    ?>
| Ejemplo 1: jueves, 30 de abril de 2009

Volver al principio de la página

## Fecha y hora actual: función localtime()

La funcion 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>";
    ?>
| Hoy es el 10/3/2005.

Volver al principio de la página

## 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>";
    } else {
        print "<p>El día $dia/$mes/$anyo no existe.</p>";
    }
    ?>
| El día 29/2/2008 existe.
    <?php
    $dia = 29;
    $mes = 2;
    $anyo = 2007;
    if (checkdate($mes, $dia, $anyo)) {
        print "<p>El día $dia/$mes/$anyo existe.</p>";
    } else {
        print "<p>El día $dia/$mes/$anyo no existe.</p>";
    }
    ?>
| El día 29/2/2007 no existe.

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

Volver al principio de la página

## 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);
    }

Volver al principio de la página

Esta obra está bajo una licencia de Creative Commons.