Recetas PHP de fecha y hora | Programar Plus

Tratar con fechas y horas es una de esas cosas que puede frustrar mucho a los programadores. Al mismo tiempo, son fundamentales para el desarrollo de software, se utilizan desde todo, desde meta y cómo se ordenan las cosas hasta disparadores basados ​​en el tiempo y muchos otros.

Las fechas y horas también son propensas a errores. Manéjelos incorrectamente y pueden confundir tanto a los usuarios finales como a los compañeros programadores.

Esta es una guía rápida para lidiar con fechas y horas específicamente en el lenguaje de programación PHP. Está destinado a ser una referencia a las necesidades más comunes que tendrá, como formatear y ajustar fechas. Es simple, pero probablemente cubrirá el 80% de sus necesidades.

Tabla de contenido

  • Obtener la fecha y hora actual
  • Construye un DateTime objeto de un tiempo específico
  • Zonas horarias
  • Localización
  • Viaje en el tiempo
  • Fechas y horas recurrentes
  • ¿Cuántos días hace?

Esta investigación se le ofrece gracias al apoyo de Frontend Masters, el socio de aprendizaje oficial de CSS-Tricks.

¿Necesita capacitación en desarrollo de front-end?

Frontend Masters es el mejor lugar para conseguirlo. Tienen cursos sobre todas las tecnologías de front-end más importantes. ¿Interesado en jugar full-stack? Esta es tu mejor apuesta:

Toma los cursos

Obtener la fecha y hora actual

Una cosa que debe saber es que las fechas y horas se pueden representar de tres formas: una marca de tiempo (es decir, una época), una DateTime objeto y una cuerda.

Primero, una receta para obtener la fecha y hora actual:

<?php

$now = new DateTime();
var_dump($now);

// object(DateTime)#1 (3) {
//   ["date"]=>
//   string(26) "2021-10-13 22:25:11.790490"
//   ["timezone_type"]=>
//   int(3)
//   ["timezone"]=>
//   string(12) "Asia/Jakarta"
// }

Esto proporciona una DateTime objeto que se puede utilizar para crear una cadena de fecha y hora:

<?php

$now = new DateTime();
echo $now->format("Y-m-d"); // 2021-10-13
echo $now->format("Y-m-d h:i:s A"); // 2021-10-13 10:10:31 PM

Intuitivamente, sabes que Y se refiere al año, m se refiere al mes, d se refiere al día del mes, etc. La lista completa de parámetros se puede encontrar en el manual de PHP, pero dejaré algunos de los más comunes aquí como referencia.

Día del mes
dDía del mes. dos dígitos con ceros a la izquierda0131
jDía del mes sin ceros a la izquierda131
SIncluye el sufijo inglés.st, nd, rd, th (p.ej 1st, 2nd, 3rd, 4th)
Día laborable
DRepresentación textual abreviada de un día, en tres letrasSunSat
lUna representación textual completa de un día de la semana.SundaySaturday
Mes
FUna representación textual completa de un mes, como enero o marzoJanuaryDecember
MRepresentación textual abreviada de un mes, en tres letrasJanDec
mRepresentación numérica de un mes, con ceros a la izquierda0112
nRepresentación numérica de un mes, sin ceros a la izquierda112
Año
YUna representación numérica completa de un año, 4 dígitosP.ej 1999 o 2003
yUna representación de dos dígitos de un año.P.ej 99 o 03
Hora
AAnte Meridiem y Post Meridiem en mayúsculasAM o PM
gFormato de 12 horas de una hora sin ceros a la izquierda112
hFormato de 12 horas de una hora con ceros a la izquierda0112
iMinutos con ceros a la izquierda0059
sSegundos con ceros a la izquierda0059

El DateTime El objeto se puede convertir en una marca de tiempo:

<?php

$now = new DateTime();
echo $now->getTimestamp(); // 1634139081

Pero también podemos obtener la hora actual en la marca de tiempo sin construir una DateTime objeto:

<?php

echo time(); // 1634139081

Construye un DateTime objeto de un tiempo específico

¿Y si queremos construir un DateTime para un momento en particular, como el 14 de julio de 2011? Podemos pasar una fecha de cadena formateada al constructor:

<?php

$date = new DateTime("2011-07-14");
var_dump($date);

// object(DateTime)#1 (3) {
//   ["date"]=>
//   string(26) "2011-07-14 00:00:00.000000"
//   ["timezone_type"]=>
//   int(3)
//   ["timezone"]=>
//   string(12) "Asia/Jakarta"
// }

El constructor también acepta otros formatos:

<?php

$date = new DateTime("14-07-2011");
var_dump($date);

// object(DateTime)#1 (3) {
//   ["date"]=>
//   string(26) "2011-07-14 00:00:00.000000"
//   ["timezone_type"]=>
//   int(3)
//   ["timezone"]=>
//   string(12) "Asia/Jakarta"
// }

Pero tenga cuidado con un formato ambiguo, como este:

<?php

$date = new DateTime("07/14/2011");
var_dump($date);

// object(DateTime)#1 (3) {
//   ["date"]=>
//   string(26) "2011-07-14 00:00:00.000000"
//   ["timezone_type"]=>
//   int(3)
//   ["timezone"]=>
//   string(12) "Asia/Jakarta"
// }

Podría pensar que todo el mundo debería estar familiarizado con un formato de fecha estadounidense. Pero no todo el mundo lo es y podría interpretarse de manera diferente. No es PostgreSQL.

CREATE TABLE IF NOT EXISTS public.datetime_demo
(
  created_at date
);

insert into datetime_demo (created_at) values ('07/12/2011');

select created_at from datetime_demo; /* 2011-12-07 */

Es posible que haya pensado que volvería el 12 de julio de 2011, pero fue el 7 de diciembre de 2011. Una mejor forma es utilizar un formato explícito:

<?php

$date = DateTime::createFromFormat('m/d/y', "10/08/21");
var_dump($date);

//object(DateTime)#2 (3) {
//  ["date"]=>
//  string(26) "2021-10-08 16:00:47.000000"
//  ["timezone_type"]=>
//  int(3)
//  ["timezone"]=>
//  string(12) "Asia/Jakarta"
//}

¿Y si queremos construir un DateTime objeto de una marca de tiempo?

<?php

$date = new DateTime();
$date->setTimestamp(1634142890);
var_dump($date);

//object(DateTime)#1 (3) {
//  ["date"]=>
//  string(26) "2021-10-13 23:34:50.000000"
//  ["timezone_type"]=>
//  int(3)
//  ["timezone"]=>
//  string(12) "Asia/Jakarta"
// }

No tenemos que crear un DateTime object si queremos convertir un objeto de marca de tiempo en una cadena de fecha formateada:

<?php

echo date("Y-m-d h:i A", time()); // 2021-10-14 04:10 PM

Zonas horarias

Podemos crear un DateTime objeto que incluye información de la zona horaria, como si se tratara de la hora estándar del Pacífico, la hora de verano del este, etc.

<?php

$timezone = new DateTimeZone("America/New_York");
$date = new DateTime("2021-10-13 05:00", $timezone);
var_dump($date);

// object(DateTime)#1 (3) {
//   ["date"]=>
//   string(26) "2021-10-13 05:00:00.000000"
//   ["timezone_type"]=>
//   int(3)
//   ["timezone"]=>
//   string(16) "America/New_York"
// }

// Eastern Daylight Time, for example: New York
$date = new DateTime("2021-10-13 05:00 EDT");
var_dump($date);

// object(DateTime)#2 (3) {
//   ["date"]=>
//   string(26) "2021-10-13 05:00:00.000000"
//   ["timezone_type"]=>
//   int(2)
//   ["timezone"]=>
//   string(3) "EDT"
// }

$date = new DateTime("2021-10-13 05:00 -04:00");
var_dump($date);

// object(DateTime)#1 (3) {
//   ["date"]=>
//   string(26) "2021-10-13 05:00:00.000000"
//   ["timezone_type"]=>
//   int(1)
//   ["timezone"]=>
//   string(6) "-04:00"
// }

Hay tres formas de crear una DateTime objeto con información de zona horaria. El timezone_type acepta diferentes valores para cada uno.

Pero digamos que queremos convertir una fecha y hora que se muestran en la zona horaria de Nueva York para mostrar la zona horaria de Yakarta en su lugar.

<?php

$newYorkTimeZone = new DateTimeZone("America/New_York");
$date = new DateTime("2021-11-11 05:00", $newYorkTimeZone);
echo $date->format("Y-m-d h:i A"); // 2021-11-11 05:00 AM
$jakartaTimeZone = new DateTimeZone("Asia/Jakarta");
$date->setTimeZone($jakartaTimeZone);
echo $date->format("Y-m-d h:i A"); // 2021-11-11 05:00 PM

Cuando son las 05:00 a. M. En Nueva York, son las 05:00 p. M. En Yakarta del mismo día. Yakarta está 12 horas por delante de Nueva York el 11 de noviembre de 2021. Pero un mes antes, Yakarta está solo 11 horas por delante de Nueva York, como se muestra a continuación:

<?php

$newYorkTimeZone = new DateTimeZone("America/New_York");
$date = new DateTime("2021-10-11 05:00", $newYorkTimeZone);
echo $date->format("Y-m-d h:i A"); // 2021-10-11 05:00 AM
$jakartaTimeZone = new DateTimeZone("Asia/Jakarta");
$date->setTimeZone($jakartaTimeZone);
echo $date->format("Y-m-d h:i A"); // 2021-10-11 04:00 PM

PHP maneja el horario de verano automáticamente.

Localización

Esta es una forma común de mostrar la fecha y la hora en los Estados Unidos:

<?php

$now = new DateTime();
echo $now->format("m/d/Y h:i A"); // 10/14/2021 03:00 PM

Pero alguien en Francia podría preferir algo más común a su localidad. C’est horrible, se quejarían. Por un lado, nadie pone el mes antes del día del mes, excepto EE. UU. Segundo, Francia no usa AM o PM; usan el formato de 24 horas (por ejemplo, 14:00 en lugar de 2:00 PM) como el ejército. Así es como haces feliz a un local francés.

<?php

$now = new DateTime();
echo $now->format("d/m/Y H:i"); // 14/10/2021 15:00

Pero esto requiere un conocimiento íntimo sobre un país o área específica. En cambio, podemos localizar la fecha. Para localizar una fecha en PHP, primero verifique la compatibilidad con un idioma en particular.

En este ejemplo, usamos el francés. En Ubuntu, instale el paquete de idioma francés:

$ sudo apt-get install language-pack-fr

Utilizar el strftime() función para localizar una fecha:

<?php

setlocale(LC_TIME, "en_US.UTF-8"); // Check for U.S. English support
echo strftime("%x %X"); // 10/14/21 03:37:59 PM
setlocale(LC_TIME, "fr_FR.UTF-8"); // Check for French support
echo strftime("%x %X"); // 14/10/2021 15:37:31

Todos los parámetros para strftime están documentados en el manual de PHP.

Viaje en el tiempo

Hagamos un viaje en el tiempo al pasado y al futuro. Primero, familiaricémonos con DateInterval:

<?php

$interval = new DateInterval("P4M1W2DT2H5M");

// P 4M 1W 2D T 2H 5M
//
// P = Period interval (years, months, weeks, days)
// 4M = 4 months
// 1W = 1 week
// 2D = 2 days
//
// T = Time interval (hours, minutes, seconds)
// 2H = 2 hours
// 5M = 5 minutes

El P y T son para separar el intervalo del período y el intervalo de tiempo. Así es como podemos viajar al futuro:

<?php

$date = new DateTime("2021-10-14");
$interval = new DateInterval("P2D"); // 2 days
$futureDate = $date->add($interval);
echo $futureDate->format("Y-m-d"); // 2021-10-16

Y así es como retrocedemos en el tiempo:

<?php

$date = new DateTime("2021-10-14 10:00");
$interval = new DateInterval("PT6H"); // 6 hours
$pastDate = $date->sub($interval);
echo $pastDate->format("Y-m-d H:i"); // 2021-10-14 04:00

Si queremos viajar en el tiempo con el nombre del día de la semana, podemos combinar el strtotime() función y la setTimestamp() método de un DateTime objeto:

<?php

$nextTuesday = strtotime("next tuesday");
$date = new DateTime("2021-10-14");
$date->setTimestamp($nextTuesday);
echo $date->format("Y-m-d"); // 2021-10-19

Ver la lista completa de strtotime() parámetros en los documentos PHP.

Fechas y horas recurrentes

Es una característica común en las aplicaciones de calendario establecer un recordatorio que se repite de vez en cuando, como cada dos días o cada semana. Nosotros podemos usar DatePeriod para representar un período de tiempo:

<?php

$start = new DateTime("2021-10-01");
$end = new DateTime("2021-11-01");
$interval = new DateInterval("P1W"); // 1 week
$range = new DatePeriod($start, $interval, $end);

// Starting from October 1st 2021 (inclusive), jump every 1 week
// until November 1st 2021 (exclusive)
foreach ($range as $date) {
  echo $date->format("Y-m-d") . "n";
}

// 2022-10-01
// 2022-10-08
// 2022-10-15
// 2022-10-22
// 2022-10-29

¿Cuántos días hace?

Sabes cómo los servicios como Twitter mostrarán que alguien publicó una cantidad X de minutos / horas / días / etc. ¿atrás? Podemos hacer lo mismo calculando cuánto tiempo ha transcurrido entre la hora actual y cuando ocurrió esa acción.

<?php

$date = new DateTime("2022-10-30");

$date2 = new DateTime("2022-10-25");
$date3 = new DateTime("2022-10-10");
$date4 = new DateTime("2022-03-30");
$date5 = new DateTime("2020-03-30");

function get_period_ago($endDate, $startDate) {
  $dateInterval = $endDate->diff($startDate);

  if ($dateInterval->invert==1) {
    if ($dateInterval->y > 0) {
      return $dateInterval->y . " years agon";
    } if ($dateInterval->m > 0) {
      return $dateInterval->m . " months agon";
    } if ($dateInterval->d > 7) {
      return (int)($dateInterval->d / 7) . " weeks agon";
    } if ($dateInterval->d > 0) {
      return $dateInterval->d . " days agon";
    }
  }
}

echo get_period_ago($date, $date2); // 5 days ago
echo get_period_ago($date, $date3); // 2 weeks ago
echo get_period_ago($date, $date4); // 7 months ago
echo get_period_ago($date, $date5); // 2 years ago

Después de conseguir el DateInterval objeto del diff() método, asegúrese de que el $startDate La variable está en el pasado marcando la invert propiedad. Entonces revisa el y, m, y d propiedades.

La lista completa de DateInterval Las propiedades del objeto se pueden encontrar aquí en los documentos de PHP.

¿A donde vas desde aquí?

Ahora tiene una pequeña hoja de trucos de recetas PHP comunes para cuando se encuentre trabajando con fechas y horas. ¿Necesita obtener la fecha y hora actual? Tal vez necesite formatear una fecha de cierta manera, o incluir la zona horaria local o comparar fechas. ¡Todo eso está aquí mismo!

Todavía hay más métodos y funciones sobre la fecha y la hora que no hemos discutido, por supuesto, cosas como funciones relacionadas con el calendario y todo eso. Asegúrese de mantener cerca la sección Fecha y hora del Manual de PHP para obtener aún más casos de uso y ejemplos.

(Visited 7 times, 1 visits today)