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()