PHP DateTime
A diferencia de la función date, la clase de PHP DateTime es una clase para la representación de la fecha y la hora.
class DateTime implements DateTimeInterface {
/* Constantaes heredadas constants */
const string DateTimeInterface::ATOM = "Y-m-d\TH:i:sP";
const string DateTimeInterface::COOKIE = "l, d-M-Y H:i:s T";
const string DateTimeInterface::ISO8601 = "Y-m-d\TH:i:sO";
const string DateTimeInterface::RFC822 = "D, d M y H:i:s O";
const string DateTimeInterface::RFC850 = "l, d-M-y H:i:s T";
const string DateTimeInterface::RFC1036 = "D, d M y H:i:s O";
const string DateTimeInterface::RFC1123 = "D, d M Y H:i:s O";
const string DateTimeInterface::RFC2822 = "D, d M Y H:i:s O";
const string DateTimeInterface::RFC3339 = "Y-m-d\TH:i:sP";
const string DateTimeInterface::RFC3339_EXTENDED = "Y-m-d\TH:i:s.vP";
const string DateTimeInterface::RSS = "D, d M Y H:i:s O";
const string DateTimeInterface::W3C = "Y-m-d\TH:i:sP";
/* Métodos */
public __construct(string $time = "now", DateTimeZone $timezone = null)
public add(DateInterval $interval): DateTime
public static createFromFormat(string $format, string $time, DateTimeZone $timezone = ?): DateTime
public static createFromImmutable(DateTimeImmutable $object): DateTime
public static createFromInterface(DateTimeInterface $object): DateTime
public static getLastErrors(): array
public modify(string $modify): DateTime
public static __set_state(array $array): DateTime
public setDate(int $year, int $month, int $day): DateTime
public setISODate(int $year, int $week, int $day = 1): DateTime
public setTime(int $hour, int $minute, int $second = 0): DateTime
public setTimestamp(int $unixtimestamp): DateTime
public setTimezone(DateTimeZone $timezone): DateTime
public sub(DateInterval $interval): DateTime
public diff(DateTimeInterface $datetime2, bool $absolute = false): DateInterval
public format(string $format): string
public getOffset(): int
public getTimestamp(): int
public getTimezone(): DateTimeZone
public __wakeup()
}
Constantes
Veamos primero las constantes que tenemos
| constant name | value | example date |
|---|---|---|
| DateTimeInterface::ATOM | "Y-m-d\TH:i:sP" |
2022-08-09T22:46:19+02:00 |
| DateTimeInterface::COOKIE | "l, d-M-Y H:i:s T" |
Tuesday, 09-Aug-2022 22:46:19 CEST |
| DateTimeInterface::ISO8601 | "Y-m-d\TH:i:sO" |
2022-08-09T22:46:19+0200 |
| DateTimeInterface::RFC822 | "D, d M y H:i:s O" |
Tue, 09 Aug 22 22:46:19 +0200 |
| DateTimeInterface::RFC850 | "l, d-M-y H:i:s T" |
Tuesday, 09-Aug-22 22:46:19 CEST |
| DateTimeInterface::RFC1036 | "D, d M y H:i:s O" |
Tue, 09 Aug 22 22:46:19 +0200 |
| DateTimeInterface::RFC1123 | "D, d M Y H:i:s O" |
Tue, 09 Aug 2022 22:46:19 +0200 |
| DateTimeInterface::RFC2822 | "D, d M Y H:i:s O" |
Tue, 09 Aug 2022 22:46:19 +0200 |
| DateTimeInterface::RFC3339 | "Y-m-d\TH:i:sP" |
2022-08-09T22:46:19+02:00 |
| DateTimeInterface::RFC3339_EXTENDED | "Y-m-d\TH:i:s.vP" |
2022-08-09T22:46:19.854+02:00 |
| DateTimeInterface::RSS | "D, d M Y H:i:s O" |
Tue, 09 Aug 2022 22:46:19 +0200 |
| DateTimeInterface::W3C | "Y-m-d\TH:i:sP" |
2022-08-09T22:46:19+02:00 |
Estas constantes antes expuestas serán constantes que puedes usar en el formato, corra el siguiente ejemplo en su pc.
Ejemplo<!DOCTYPE html>
<html>
<body>
<?php
$objDateTime = new DateTime('NOW');
?>
<h1>my date now <?php echo $objDateTime->format('d-m-Y H:i:s');?></h1>
lets check diferent constants for this date
<h2>DateTimeInterface::ATOM </h2>
<?php echo $objDateTime->format(DateTimeInterface::ATOM);?>
<h2>DateTimeInterface::COOKIE</h2>
<?php echo $objDateTime->format(DateTimeInterface::COOKIE);?>
<h2>DateTimeInterface::ISO8601</h2>
<?php echo $objDateTime->format(DateTimeInterface::ISO8601);?>
<h2>DateTimeInterface::RFC822</h2>
<?php echo $objDateTime->format(DateTimeInterface::RFC822);?>
<h2>DateTimeInterface::RFC850</h2>
<?php echo $objDateTime->format(DateTimeInterface::RFC850);?>
<h2>DateTimeInterface::RFC1036</h2>
<?php echo $objDateTime->format(DateTimeInterface::RFC1036);?>
<h2>DateTimeInterface::RFC1123</h2>
<?php echo $objDateTime->format(DateTimeInterface::RFC1123);?>
<h2>DateTimeInterface::RFC2822</h2>
<?php echo $objDateTime->format(DateTimeInterface::RFC2822);?>
<h2>DateTimeInterface::RFC3339</h2>
<?php echo $objDateTime->format(DateTimeInterface::RFC3339);?>
<h2>DateTimeInterface::RFC3339_EXTENDED</h2>
<?php echo $objDateTime->format(DateTimeInterface::RFC3339_EXTENDED);?>
<h2>DateTimeInterface::RSS</h2>
<?php echo $objDateTime->format(DateTimeInterface::RSS);?>
<h2>DateTimeInterface::W3C</h2>
<?php echo $objDateTime->format(DateTimeInterface::W3C);?>
<!------>
</body>
</html>
Métodos
Veremos todos los métodos que podemos utilizar con la clase DateTime, la mayoría de estos dando DateTime como retorno y también otras clases que veremos más adelante en este blog.
__construct()
https://blastcoding.com/php-datetime/#__constructDevuelve un nuevo objeto DateTime, tiene 2 argumentos, $time con valor por defecto "now" y $timezone con valor por defecto null .
__construct(string $time = "now", DateTimeZone $timezone = null)
Esto quiere decir que en muchos casos no es necesario pasar estos argumentos al constructor.
constructor sin argumentos//blastcoding.com example
//take in consideration that we are using now so your date will be your actual date
<?php
try {
$fecha = new DateTime();
} catch (Exception $e) {
echo $e->getMessage();
exit(1);
}
echo $fecha->format('Y-m-d');
2022-08-09
Veamos unos ejemplos mas para que nos queden las cosas más claras
<?php
// Fecha/hora actuales en la zona horaria Uruguay.
$fecha = new DateTime(null, new DateTimeZone('America/Montevideo'));
echo $fecha->format('Y-m-d H:i:sP') . "\n";
// Fecha/hora actuales en la zona horaria España.
$fecha = new DateTime(null, new DateTimeZone('Europe/Madrid'));
echo $fecha->format('Y-m-d H:i:sP') . "\n";
2022-08-09 20:54:13-03:00 2022-08-10 01:54:13+02:00
add
https://blastcoding.com/php-datetime/#addCon este método add podemos modificar un objeto DateTime agregando años, meses, días, horas, minutos y segundos
$obj en la siguiente sintaxis debe ser un objeto DateTime.
$obj->add(DateInterval $interval): DateTime
En el siguiente ejemplo veremos como utilizar add, haciendo agregándole un año como restándole uno
<?php
$fecha = new DateTime();
echo $fecha->format('Y-m-d H:i:sP');
$fecha2=clone $fecha;
$fecha3=clone $fecha;
$fecha2->add(DateInterval::createFromDateString('1 year'));
echo "\n".$fecha2->format('Y-m-d H:i:sP');
$fecha3->add(DateInterval::createFromDateString('-1 year'));
echo "\n".$fecha3->format('Y-m-d H:i:sP');
DateTime::createFromFormat
https://blastcoding.com/php-datetime/#createFromFormatPrimero veremos la definición en inglés, ya que no me gusta la definición en español, ya que han traducido parse como analiza, y si aunque su traducción literal es analiza, creo que debieron traducirlo como convierte o crea.
Parses a time string according to a specified format
php.net
Yo por mi parte traduciría a: Este método crea o convierte a un datetime un string que representa una fecha.
public static DateTime::createFromFormat(string $format, string $datetime, ?DateTimeZone $timezone = null): DateTime|false
Como podemos observar DateTime::createFromFormat tiene 3 argumentos siendo uno del ellos opcional.
$format es un string que representara el nuevo formato, $datetime es el string a ser analizado y convertido a un objeto DateTime.En caso de fallo devolvera false
Veamos unos ejemplos:
Ejemplo dado en php.net por falundir[at]gmail[dot]com<?php
$date = DateTime::createFromFormat('Y-m-d', '2012-10-17');
var_dump($date->format('Y-m-d H:i:s')); //will print 2012-10-17 13:57:34 (the current time)
?>
No hay que ser un genio para darnos cuenta de que este método puede ayudarnos bastante cuando levantamos datos de una base de datos y convertirlos luego en un formato que nos sirva.
DateTime::createFromImmutable
https://blastcoding.com/php-datetime/#createFromImmutableEste método crea un objeto DateTime a partir de un objeto DateTimeImmutable, teniendo este la data que tenía el objeto inmutable. El objeto inmutable no es cambiado de ninguna manera.
DateTime::createFromImmutable(DateTimeImmutable $object): DateTimecreateFromImmutable example
<?php
$date = new DateTimeImmutable("2014-06-20 11:45 Europe/London");
$mutable = DateTime::createFromImmutable( $date );
?>
DateTime::createFromInterface
https://blastcoding.com/php-datetime/#createFromInterfaceTanto DateTime como DateTimeImmutable utilizan DateTimeInterface yes practico el poder crear un nuevo objeto DateTime desde el objeto que usa esta interfaz.
DateTime::createFromInterface(DateTimeInterface $object): DateTime
<?php
$date = new DateTimeImmutable("2014-06-20 11:45 Europe/London");
$mutable = DateTime::createFromInterface($date);
$date = new DateTime("2014-06-20 11:45 Europe/London");
$also_mutable = DateTime::createFromInterface($date);
?>
DateTime::getLastErrors
https://blastcoding.com/php-datetime/#getLastErrorsEste método estático retorna tanto las alertas como los errores que halla en un array, y falso si no hay ningún error o alerta.
SintaxisDateTime::getLastErrors(): array|false
modify
https://blastcoding.com/php-datetime/#modifyModifica el timestamp de un objeto DateTime, este método retornará false si falla.
En el siguiente código $obj representa un objeto DateTime
$obj->modify(string $modifier): DateTime|falsemodify example
<?php
$date = new DateTime('2006-12-12');
$date->modify('+1 month');
echo $date->format('Y-m-d');
?>
__set_state
https://blastcoding.com/php-datetime/#__set_stateEste método correrá cuando se haga var_export() a nuestro objeto DateTime, tenga en cuenta que var_export es similar a var_dump excepto que el código devuelto es ejecutable.
DateTime::__set_state(array $array): DateTime
Veamos un ejemplo de esto:
Using var_export()<?php
$date = DateTime::createFromFormat('Y-m-d', '2012-10-17');
var_export($date);
DateTime::__set_state(array( 'date' => '2012-10-17 15:28:13.000000', 'timezone_type' => 3, 'timezone' => 'UTC', ))
El código que hemos obtenido en el ejemplo es completamente ejecutable.
setDate
https://blastcoding.com/php-datetime/#setDateMétodo para definir/setear una fecha.
Sintaxis$obj->setDate(int $year, int $month, int $day): DateTime
$year será el año, $month será el mes y $day el día. Este método devolverá DateTime
<?php
$date = new DateTime();
echo "today date: ".$date->format('d-m-Y');
echo "\n new date setted:" ;
$date->setDate(2002, 7, 30);
echo $date->format('Y-m-d');
?>
setISODate
https://blastcoding.com/php-datetime/#setISODateDefine la fecha con base en los estándares ISO 8601 usando semanas y día en vez de fechas específicas.
Sintaxis$obj->setISODate(int $year, int $week, int $dayOfWeek = 1): DateTime
setTime
https://blastcoding.com/php-datetime/#setTimeSetea / define el tiempo
$obj en la siguiente sintaxis representa un objeto DateTime
Sintaxis$obj->setTime(
int $hour,
int $minute,
int $second = 0,
int $microsecond = 0
): DateTime
setTimestamp
https://blastcoding.com/php-datetime/#setTimestampDefine la fecha y tiempo basado en un timestamp de UNIX
Sintaxis$obj->setTimestamp(int $timestamp): DateTime
setTimezone
https://blastcoding.com/php-datetime/#setTimezoneSetea un nuevo Timezone para un objeto DateTime
Sintaxis$obj->setTimezone(DateTimeZone $timezone): DateTime
sub
https://blastcoding.com/php-datetime/#subRealiza la substracción de años, meses, días, horas, segundos de un objeto DateTime
(-)
Sintaxis$obj->sub(DateInterval $interval): DateTimeejemplo del metodo sub
$fecha_hora = new DateTime('2023-04-23 12:00:00');
$intervalo = new DateInterval('PT2H'); // Restar 2 horas
$fecha_hora->sub($intervalo);
echo $fecha_hora->format('Y-m-d H:i:s'); // Imprime "2023-04-23 10:00:00"
2023-04-23 10:00:00
diff
https://blastcoding.com/php-datetime/#diffRetorna la diferencia entre 2 fechas dando como resultado un objeto DateInterval, pudiendo usar el método format para convertirlo a un string y luego para poder imprimir en pantalla.
public diff(DateTimeInterface $datetime2, bool $absolute = false): DateInterval
Como ejemplo podriamos hacer lo siguiente:
ejemplo de diff
$fecha1 = new DateTime('2023-04-23 12:00:00');
$fecha2 = new DateTime('2023-04-23 10:00:00');
$diferencia = $fecha1->diff($fecha2);
echo $diferencia->format('%H:%I:%S');
02:00:00
format
https://blastcoding.com/php-datetime/#formatCon este método podremos formatear la fecha de un objeto DateTime, DateTimeImmutable o que use la interface DateTimeInterface
public format(string $format): string
Aunque tenemos ya un montón de ejemplos sobre format en las constantes, dejaré un ejemplo aquí:
Ejemplo de format
$fecha_hora = new DateTime('2023-04-23 12:00:00');
$ff = $fecha_hora->format('d-m-Y H:i');
echo $ff;
getOffset
https://blastcoding.com/php-datetime/#getOffsetNos retornará el desfase horario, en ciertos países hay desfase horario según si es invierno o verano, por ejemplo en Uruguay y Argentina se suele correr una hora.
El metodo getOffset nos data un int el cual será un timestamp
Sinopsis / Synopsispublic getOffset(): int
El siguiente es un ejemplo que se da en la página de php.net
ejemplo de getOffset
$winter = new DateTimeImmutable('2010-12-21', new DateTimeZone('America/New_York'));
$summer = new DateTimeImmutable('2008-06-21', new DateTimeZone('America/New_York'));
$gw = new DateTimeImmutable('2008-06-21', new DateTimeZone('UTC'));
echo $winter->getOffset() . "\n";
echo $summer->getOffset() . "\n";
echo $gw->getOffset()."\n";
-18000 -14400 0
Vea que agregue en el ejemplo el DTZ de Greenwich esto es, para que usted sepa comparado contra qué tiempo está.
getTimestamp
https://blastcoding.com/php-datetime/#getTimestampObtiene el Timestamp UNIX
Sinopsis / Synopsispublic getTimestamp(): intEjemplo getTimestamp
$winter = new DateTimeImmutable('2010-12-21', new DateTimeZone('America/New_York'));
echo $winter->getTimestamp();
1292907600
getTimezone
https://blastcoding.com/php-datetime/#getTimezoneRetorna la zona horaria(timezone) relativa al DateTime dado en forma de objeto DateTimeZone y falso en caso de no poder devolver el objeto
public getTimezone(): DateTimeZone
$winter = new DateTimeImmutable('2010-12-21', new DateTimeZone('America/New_York'));
var_dump($winter->getTimezone());
object(DateTimeZone)#2 (2) {
["timezone_type"]=>
int(3)
["timezone"]=>
string(16) "America/New_York"
}
__wakeup()
Sinopsis / Synopsispublic __wakeup()

