---
# System prepended metadata

title: Fechas
tags: [DAW, PHP, UT2, DSW]

---

# 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`