Introducción
Un punto importante en los Sistemas de Información es el manejo de la fecha y hora como datos para registrar eventos. PHP tiene varios elementos para manejar estos tipos de datos.
Funciones para Manejo de Fechas
Definiendo el Ahora
Uno de los elementos más utilizados cuando se habla del tiempo, es establecer el instante actual, esto es debido a que para localizar en el tiempo transacciones, operaciones, logs, etc. es necesario establecer un punto de origen.
Función getdate()
La primera es utilizando la función getdate()[[http://php.net/manual/es/function.getdate.php]], la cual nos permite obtener un array donde tenemos información concerniente al instante actual.
<?php
$hoy = getdate();
print_r($hoy);
/*Este código retornaría lo siguiente (el valor cambia de acuerdo a la fecha):
Array
(
[seconds] => 58
[minutes] => 56
[hours] => 14
[mday] => 19
[wday] => 1
[mon] => 9
[year] => 2016
[yday] => 262
[weekday] => Monday
[month] => September
[0] => 1474318618
)*/
Función date()
Otra posibilidad es utilizando la función date()[[http://php.net/manual/es/function.date.php]], con sus múltiples parámetros de formato para obtener un string con los valores del instante actual.
<?php
// Imprime la fecha actual con el formato yyyy-mm-dd
echo date('Y-m-d');
?>
Clases para el Manejo de Fechas
Clase DateInterval
Es una clase que sirve para representar la duración de un instante. El constructor de esta clase necesita un cadena, la cual representa dicho instante, cuyo patrón es el siguiente: PYMDTHMS.
- P: Periodo
- Y: Años
- M: Meses
- D: Días
- T: Tiempo
- H: Horas
- M: Minutos
- S: Segundos
Donde P es el único elemento requerido.[[http://sixrevisions.com/web-development/php-dateinterval-class/]]. Por ejemplo: para representar un intervalo de 1 año, la cadena es P1Y, para 45 minutos: PT45M, para representar 2 meses 4 días 10 horas y 23 minutos con 2 segundos: P2M4DT10H23M2S.
Por otro lado, es posible obtener un string a partir del formato que se requiera mediante la función format().[[http://php.net/manual/es/dateinterval.format.php]]
<?php
$_1Semana = new DateInterval('P7D');
var_dump($_1Semana);
// Formato de DateInterval
echo $_1Semana->format('%R%d dias'), PHP_EOL;
?>
Clase DateTime
Es una clase que sirve para representar fecha y hora. Como una clase, DateTime maneja una serie de funciones que permiten la manipulación de este tipo de datos.
Crear un DateTime
Constructor
Cuando se construye un DateTime, utilizando la función constructora DateTime::__construct()[[http://php.net/manual/es/datetime.construct.php]], es posible establecer el instante actual o una fecha en el pasado o futuro a través de expresiones válidas.
<?php
// Establecer la zona horaria por defecto
date_default_timezone_set('America/Tegucigalpa');
// Construcción por defecto
$obj1 = new DateTime() // Retorna el instante actual
// Utilizar el constructor del DateTime
$obj2 = new DateTime('2016-09-09');
// Tambien pueden utilizarse expresiones variables
$obj3 = new DateTime('now'); // Instante actual
$obj4 = new DateTime('tomorrow'); // Mañana
$obj5 = new DateTime('noon'); // Hoy, al mediodía
$obj6 = new DateTime('last day of September 2016'); // Ultimo día de 09/2016
$obj7 = new DateTime('3 days 12 hours ago'); // Hace 3 días y 12 horas
$obj8 = new DateTime('3 days ago 12 hours'); // Hace 3 días, 12 horas después
$obj9 = new DateTime('+3 weeks'); // Sumar 3 semanas al instante actual
$obj10 = new DateTime('last day of this month'); // Ultimo día del mes
$obj11 = new DateTime('last monday of 3 months'); // Ultimo lunes de dentro de 3 meses
?>
Función createFromFormat()
La función DateTime::createFromFormat()[[http://php.net/manual/es/datetime.createfromformat.php]] nos permite establecer un DateTime con el formato que se desee. Simplemente se define cuál es ese formato.
<?php
// Establecer la zona horaria por defecto
date_default_timezone_set('America/Tegucigalpa');
// Creando un objeto DateTime, utilizando la función estática CreateFromFormat
$obj1 = DateTime::createFromFormat('d/m/Y', '31/12/2016');
var_dump($obj1);
?>
Formateo de un DateTime
Si necesitamos obtener una cadena a partir de un objeto DateTime, podemos utilizar el método DateTime::format(), como parámetro con el formato a utilizar.
<?php
// Objeto DateTime con la fecha actual
$obj1 = new DateTime();
// Formatear la salida del DateTime, devuelve un string
echo 'Formato (d/m/Y): ', $obj1->format('d/m/Y'), PHP_EOL;
echo 'Formato (Y-m-d): ', $obj1->format('Y-m-d'), PHP_EOL;
echo 'Formato (H:i:s): ', $obj1->format('H-i-s'), PHP_EOL;
?>
Agregar y Quitar a un DateTime un intervalo de tiempo con DateInterval
También se puede modificar un DateTime utilizando los métodos add(), sub(), en conjunto con la clase DateInterval, para obtener una fecha correspondiente a la suma o resta de un intervalo, respectivamente.
<?php
date_default_timezone_set('America/Tegucigalpa');
$fecha = new DateTime('2016-09-21');
// Funcion add()
$fecha->add(new DateInterval('P10Y3M'));
echo 'Agregados 10 años y 3 meses: ', $fecha->format('Y-m-d'), PHP_EOL;
// Funcion sub()
$fecha->sub(new DateInterval('P2D'));
echo 'Restados 2 dias: ', $fecha->format('Y-m-d'), PHP_EOL;
?>
Diferencia entre DateTime
De igual forma se puede establecer la diferencia entre dos objetos DateTime. El comportamiento de esta función se denota de la siguiente forma: $obj1->diff($obj2), lo cual implica $obj2 - $obj1
<?php
date_default_timezone_set('America/Tegucigalpa');
$primero2016 = new DateTime('2016-01-01');
$ultimo2016 = new DateTime('2016-12-31');
$diferencia = $primero2016->diff($ultimo2016);
echo 'Los dias transcurridos son: ', $diferencia->days, PHP_EOL;
echo $diferencia->format('%r%a dias'), PHP_EOL;
$diferencia = $ultimo2016->diff($primero2016);
echo 'Los dias transcurridos son: ', $diferencia->days, PHP_EOL;
echo $diferencia->format('%r%a dias'), PHP_EOL;
?>
Clase DatePeriod
Esta clase nos permite generar un periodo de fechas de acuerdo a 3 factores[[http://php.net/manual/es/class.dateperiod.php]]:
- Valor inicial periodo
- Intervalo del periodo o cada cuánto se repetirá el periodo
- Valor final del periodo
<?php
// Establecer un periodo semanal a partir del 22/sep/2016
// hasta llegar al 31/12/2016
$inicio = new DateTime('2016-09-22');
$final = new DateTime('2016-12-31');
$intervalo = new DateInterval('P7D');
$periodo = new DatePeriod($inicio, $intervalo, $final);
// Nota: DatePeriod no crea un array, sin embargo puede realizar el
// recorrido por medio de un foreach.
foreach($periodo as $fecha) {
echo $fecha->format('Y-m-d'), PHP_EOL;
}
?>
Clase DateTimeZone
Esta clase nos permite manejar diversas zonas horarias. [[http://php.net/manual/es/class.datetimezone.php]]
<?php
// Establecer las zonas horarias de Tegucigalpa y Berlin
// obteniendo los valores del instante actual
$tegucigalpa = new DateTimeZone('America/Tegucigalpa');
$berlin = new DateTimeZone('Europe/Berlin');
$timeTEG = new DateTime('now', $tegucigalpa);
$timeBRL = new DateTime('now', $berlin);
echo 'La hora en Tegucigalpa es: ', $timeTEG->format('d/m H:i:s'), PHP_EOL;
echo 'La hora en Berlin es: ', $timeBRL->format('d/m H:i:s'), PHP_EOL;
?>