# Fechas
## Localización y zona horaria
Es importante que establezcamos la localización y zona horaria que queramos, ya que en base a eso se formatearea la fecha. Si lo dejamos por defecto la zona horaria sera UTC y el formato a seguir será establecido por los valores de las variables de entorno con los mismos nombres que las categorías anteriores, o desde "LANG".
### Localización
Para cambiar la Localizaión usamos la función setlocale, que recibe una categoría y los distintas localizaciones que queramos.
*Ejemplo*
```php=
<?php
/*
Establecemos el formato español
para todas las categorias.
Ponemos varios formatos porque cabe
la posibilidad de que uno de ellos falle
*/
setlocale(LC_ALL, "es", "ES", "es_ES.UTF8")
```
[setLocal Manual PHP](https://www.php.net/manual/es/function.setlocale.php)
### Zona Horaria
Para establecer la zona horaria hacemos uso de la función date_default_timezone_set, que recibre una string que representa las zonas horarias.
*Ejemplo*
```php=
<?php
// Establecemos la zona horaria de canarias
date_default_timezone_set("Atlantic/Canary")
```
[Lista de Timezones soportadas](https://www.php.net/manual/en/timezones.php)
## date()
La función **date()** te permite obtener una cadena de texto a partir de una fecha y hora, con el formato que tú elijas.
La función **recibe dos parámetros**, la **descripción del formato** y el número **entero que identifica la fecha**, y **devuelve una cadena de texto formateada**.
```php=
string date (string $formato [, int $timestamp])
```
Debes tener en cuenta que la función date() no lee los "locales", para hacer uso de los nombres en español (lunes, Enero...) deberás usar la función strftime().
[Funciones Fechas (DateTime)](https://www.php.net/manual/es/ref.datetime.php)
### Formato de las Fechas
El formato de las fechas podemos definirlos en base a la siguiente Tabla:
| Cáracter | Descripción | Ej |
| -------- | -------- | -------- |
| Día | --- | --- |
| d | Día del mes, 2 dígitos con 0 | 01 a 31 |
| D | Representación del día con 3 letras | Mon hasta Sun|
| j | Día del mes sin 0 | 1 a 31 |
| l | Representación completa del día | Sunday hasta Saturday|
| N | Representación numérica ISO-8601 del día de la semana | 1 (lunes) a 7(Domingo) |
| S | Sufijo ordinal inglés, 2 carácteres | st, nd, rd, th (Funciona con j)|
| w | Representación númerica del día | 0 (lunes) a 6(Domingo) |
| z | El día del año (Empezando en 0) | 0 a 365 |
| Semana | --- | --- |
| W | Número de la semana del año ISO-8601, las semanas comienzan en lunes | Ejemplo: 42 (la 42ª semana del año) |
| Mes | --- | --- |
| F | Representación Textual completa del Mes | January a December |
| m | Representación númerica con 0 iniciales | 0 a 12 |
| M | Representación Textual corta | Jan a Dec |
| n | Representación númerica sin 0 iniciales | 1 a 12 |
| t | Representación númerica sin 0 iniciales | 1 a 12 |
| Año | --- | --- |
| L | Si es un año bisiesto | 1 si es bisiesto, 0 si no|
| o | Año según el número de la semana ISO-8601. Esto tiene el mismo valor que Y, excepto que si el número de la semana ISO (W) pertenece al año anterior o siguiente, se usa ese año en su lugar. | Ejemplos: 1999 o 2003 |
| Y | Representación númerica de 4 digitos | Ejemplos: 1999 o 2003 |
| y | Representación númerica de 2 digitos | Ejemplos: 99 o 03 |
| Hora | --- | --- |
| a | --- | am o pm |
| A | --- | AM o PM |
| B | Hora de Internet | 000 a 999 |
| g | Formato 12h sin 0 | 1 a 12 |
| G | Formato 24h sin 0 | 1 a 23 |
| h | Formato 12h con 0 | 01 a 12 |
| H | Formato 24h con 0 | 01 a 23 |
| i | Minutos con 0 | 00 a 59 |
| s | Segundos con 0 | 00 a 59 |
| Zona Horaria | --- | --- |
| e | Identificador de zona horaria | UTC, GMT, etc|
| I | Si la fecha está en formato verano o no | 1 si está en verano 0 sino|
| O | Diferencia de la hora de Greenwich | Ejemplo: +0200|
| P | Diferencia de la hora de Greenwich con : entre horas y minutos| Ejemplo: +02:00|
| T | Abreviatura zona horaria | Ejemplos: EST, MDT, ...|
| Z | Índice de la zona horaria en segundos. | -43200 hasta 50400|
| Fecha/Hora Completa | --- | --- |
| c | Fecha ISO 8601 | 2004-02-12T15:19:21+00:00 |
| r | Fecha con formato | Ejemplo: Thu, 21 Dec 2000 16:01:07 +0200 |
| U | Segundos desde la Época Unix (1 de Enero del 1970 00:00:00 GMT) | --- |
### Ejemplos de Formateo
```php=
<?php
date_default_timezone_set("Atlantic/Canary");
echo date("d/m/Y H:i:s") . "\n";
echo date("j/n/Y g:i:s") . "\n";
echo date("d F Y H:i:s a") . "\n";
echo date("d M y H:i:s e") . "\n";
/** OUTPUT
14/11/2022 17:04:40
14/11/2022 5:04:40
14 November 2022 17:04:40 pm
14 Nov 22 17:04:40 Atlantic/Canary
*/
```
## datetime
Para construir un objeto DateTime podemos hacerlo de la siguiente forma:
```php=
<?php
$now = new DateTime()
```
### Formatos relativos
Al constructor de Datime podemos pasarle formatos relativos en forma de string, con los que creará un DateTime relativo a dicho formato.
```php=
<?php
var_dump(new DateTime("yesterday"));
var_dump(new DateTime("last monday"));
/*
object(DateTime)#1 (3) {
["date"]=>
string(26) "2022-11-13 00:00:00.000000"
["timezone_type"]=>
int(3)
["timezone"]=>
string(13) "Europe/Berlin"
}
object(DateTime)#1 (3) {
["date"]=>
string(26) "2022-11-07 00:00:00.000000"
["timezone_type"]=>
int(3)
["timezone"]=>
string(13) "Europe/Berlin"
}
*/
```
[Formatos Relativos](https://www.php.net/manual/en/datetime.formats.relative.php)
### date_create_from_format
Con está función podemos crear un datetime a través de un formato (Primer parámetro) y una string (Segundo parámetro). El formato debe ser el mismo que el de la string pasada como segundo parámetro.
```php=
DateTime date_create_from_format(string $format, string $datetime)
```
*Ejemplo*
```php=
<?php
date_default_timezone_set("Atlantic/Canary");
$date = "22/11/22";
$date_time = date_create_from_format("d/m/y", $date);
var_dump($date_time);
/*
object(DateTime)#1 (3) {
["date"]=>
string(26) "2022-11-22 17:14:21.000000"
["timezone_type"]=>
int(3)
["timezone"]=>
string(15) "Atlantic/Canary"
}
*/
```
### date_create y date_format
Esto mismo podemos hacerlo en dos pasos haciendo uso de las funciones date_create y date_format. Sin embargo date_create debe recibir una string en formato DateTime. Otro detalle es que la función date_format devuelve una string.
*Ejemplo*
```php=
<?php
date_default_timezone_set("Atlantic/Canary");
$date_string = "2022-11-22";
$date = date_create($date_string);
$date_time = date_format($date, "d/m/y");
var_dump($date_time);
/*
string(8) "22/11/22"
*/
```
## date_timestamp_get
Devuelve el timestamp de una objeto datetime
```php=
int strftime(Date_Time $date_time)
```
### Formato de las Fechas
Para el formateo de fechas haciendo uso de las Localizaciones se hace uso de la función sfrtime, que recibe como parámetros un formato de fecha y como segundo parámetro un entero que represente a la fecha.
```php=
string strftime(string $format, [, int $timestamp])
```
Es importane que dentro de la string $format los carácteres de formato esten precedidos de %.
| Cáracter | Descripción | Ej |
| -------- | ------------------------------------------------------- | -------------------- |
| Día | --- | --- |
| a | Representación textual abreviada del día | dom hasta sáb |
| A | Representación textual completa del día | domingo hasta sábado |
| d | Día del mes con 0 | 01 a 31 |
| e | Día del mes con un espacio antes de los dígitos simples | _1 a 31 |
| j | Día del año, tres dígitos con ceros al inicio | 001 a 366 |
| u | Representación numérica del día de la semana del ISO-8601 | 1 (para lunes) hasta 7 (para domingo) |
| w | Representación numérica del día de la semana | 0 (para domingo) hasta 6 (para sábado) |
| Semana | --- | --- |
| U | Número de semana del año dado, comenzando con el primer domingo como la primera semana | 13 (para la 13ª semana completa del año) |
| V | Número de semana del año dado del ISO-8601:1988. | 01 hasta 53 (donde 53 cuenta para una semana traslapada) |
| W | Una representación numérica de la semana del año, comenzando con el primer domingo como la primera semana | 46 (para la 46ª semana del año comenzando con un lunes) |
| Mes | --- | --- |
| b | Nombre del mes abreviado | ene hasta dic |
| B | Nombre del mes completo | enero hasta diciembre |
| h | Nombre del mes abreviado (un alias de %b) | ene hasta dic |
| m | Representación de dos dígitos del mes | 01 (para enero) hasta 12 (para diciembre) |
| Año | --- | --- |
| C | Representación de dos dígitos del siglo (año dividido entre 100, truncado a un entero) | 19 para el Siglo XX |
| g | Representación de dos dígitos del año por el estándar ISO-8601:1988 | 09 para la semana del 6 de enero de 2009 |
| G | La versión completa de cuatro dígitos de %g | 2008 para la semana del 3 de Enero de 2009 |
| y | Representación de dos dígitos del año | 09 para 2009, 79 para 1979 |
| Y | Representación de cuatro dígitos del año | 2038 |
| Hora | --- | --- |
| H | Representación de dos dígitos de la hora en formato de 24 horas | 00 hasta 23 |
| k | Hora en formato de 24 horas, con un espacio precediendo a las horas de un dígito | 0 hasta 23 |
| I | Representación de dos dígitos de la hora en formato de 12 horas | 01 hasta 12 |
| l | La hora en formato de 12 horas, con un espacio precediendo a los dígitos simples | 1 hasta 12 |
| M | Representación de dos dígitos de los minutos | 00 hasta 59 |
| p | "AM" o "PM" en MAYÚSCULAS basados en la hora dada | AM para 00:31, PM para 22:23 |
| P | "am" o "pm" en minúsculas basados en la hora dada | am para 00:31, pm para 22:23 |
| r | Lo mismo que "%I:%M:%S %p" | 09:34:17 PM para 21:34:17 |
| R | Lo mismo que "%H:%M" | 00:35 para 12:35 AM, 16:44 para 4:44 PM |
| S | Representación de dos dígitos de los segundos | 00 hasta 59 |
| T | Lo mismo que "%H:%M:%S" | 21:34:17 para 09:34:17 PM |
| X | Representación preferida de la hora basda en el localismo, sin la fecha | 03:59:16 o 15:59:16 |
| z | El índice de la zona horaria | -0500 para Hora del Este de EEUU |
| Z | La abreviatura de la zona horaria | EST para Hora del Este |
| Marcas de Fecha y Hora | --- | --- |
| c | Marca preferida de la fecha y hora basadas en el localismo | Tue Feb 5 00:45:10 2009 para el 5 de febrero de 2009 a las 12:45:10 AM |
| D | Lo mismo que "%m/%d/%y" | 02/05/09 para el 5 de febrero de 2009 |
| F | Lo mismo que "%Y-%m-%d" | 2009-02-05 para el 5 de febrero de 2009 |
| s | Marca temporal del instante de la Época Unix (lo mismo que la función time()) | 305815200 para el 10 de septiembre de 1979 08:40:00 AM |
| x | Representación preferida de la fecha basada en la configuración local, sin la hora | 02/05/09 para el 5 de febrero de 2009 |
| Miscelánea | --- | --- |
| n | Un carácter de nueva línea ("\n") | --- |
| t | Un carácter de tabulación ("\t") | --- |
| % | Un carácter de porcentaje literal ("%") | --- |
###### tags: `DSW` `PHP` `DAW` `UT2`