jueves, 28 de marzo de 2024

El módulo Datetime y el módulo Calendar.

Modulo datetime - trabajar con funciones relacionadas con la fecha y hora.


Creando objetos date.

El módulo datetime nos proporciona clases para trabajar con la fecha y hora. 

¿Cómo podemos obtener la fecha local y crear objetos del tipo fecha?

Una de las clases proporcionadas por el módulo datetime es una clase llamada date. Los objetos de esta clase representan una fecha que consta de año, mes y día. 

La clase date del módulo datetime.

Python 3.10.12 (main, Nov 20 2023, 15:14:05) [GCC 11.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from datetime import date
>>> hoy = date.today()
>>> print(hoy)
2024-03-20
>>> print(hoy.year)
2024
>>> print(hoy.month)
3
>>> print(hoy.day)
20
El método today nos devuelve un objeto del tipo date que representa la fecha local actual. Este objeto tiene tres atributos: 
  1. .year (año)
  2. .month(mes)
  3. .day(día)
¡Ten cuidado porque estos tres atributos son solo de lectura!   Para crear un objeto date debes pasar los atributos de año, mes y dia de la siguiente manera. 

>>> from datetime import date
>>> mi_fecha = date(2018, 8, 1)
>>> print(mi_fecha)
2018-08-01
Al crear un objeto date hay que tener en cuenta una serie de restricciones que son lógicas:
Parámetro Restricciones
year El parámetro year debe ser mayor o igual a 1 (constante MINYEAR) y menor o igual a 9999 (constante MAXYEAR).
month El parámetro month debe ser mayor o igual a 1 y menor o igual a 12.
day El parámetro day debe ser mayor o igual a 1 y menor o igual que el último día del mes y año indicados.

Creación de un objeto de fecha a partir de una marca de tiempo.


La clase date nos permite crear un objeto de fecha a partir de una marca de tiempo utilizando el método fromtimestamp

En Unix una marca de tiempo es la cantidad de segundos transcurridos desde el 01 de Enero de 1970 a las 00:00:00 (UTC)

Para poder hacer esto, podemos usar el módulo time y a su vez el método time. Python nos proporcionará la marca de tiempo actual. Un ejemplo:

La marca de tiempo con time en Unix.

Python 3.10.12 (main, Nov 20 2023, 15:14:05) [GCC 11.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from datetime import date
>>> import time
>>> marca_tiempo = time.time()
>>> print(f"la marca de tiempo es igual a {marca_tiempo}")
la marca de tiempo es igual a 1710949396.5617826
>>> d = date.fromtimestamp(marca_tiempo)
>>> print("Fecha: ", d)
Fecha:  2024-03-20

Creación de un objeto de fecha usando el formato ISO


Como se usa mucho vamos a ver como representar una fecha usando el standar ISO 8601. Es el típico formato de AAAA-MM-DD. Uno de los métodos que podemos utilizar es fromisoformat. Los parámetros de este método son una cadena. Cuando sustituyas la fecha, asegúrate de agregar 0 antes de un mes o de un día expresado por un número menor que 10.

fecha en formato ISO

# Ejemplo de programa que construye un objeto date
# desde una cadena que contiene una fecha en formato ISO YYYY-MM-DD

from datetime import date

# cumpleaños de Leonardo da vinci
cumple_leo = "1452-04-15"

# Construimos el objeto date
leo_date = date.fromisoformat(cumple_leo)
print(f"El cumpleaños de Leonardo da Vinci es {leo_date}")
print(type(leo_date))
SALIDA:

El cumpleaños de Leonardo da Vinci es 1452-04-15
<class 'datetime.date'>


El método replace()


Si tenemos que reemplazar el año, mes o día de un objeto que ya hayamos creado, no podremos hacerlo a través de los atributos pues son de solo lectura. Para ello utilizaremos el método llamado replace.

método replace

from datetime import date

d = date(2021, 12, 5)
print(d)

d = d.replace(year=2022, month=11, day=4)
print(d)
SALIDA:

2021-12-05
2022-11-04

Los parámetros year, month o day son opcionales. Puedes pasar solo un parámetro a replace si quieres. No obstante recuerda que este método devuelve un objeto date modificado por lo que recuerda asignarlo a alguna variable.


¿Que día de la semana es?


Uno de los métodos mas útiles que facilita el trabajo con fechas es weekday. Devuelve el día de la semana como un número entero, donde 0 es el Lunes y 6 es el Domingo. 

método weekday

from datetime import date

d = date(2003,3,14)
print(d.weekday())
SALIDA:

4

La clase date también tiene un método similar llamado isoweekday que también devuelve el día de la semana como un número entero pero 1 es Lunes y 7 Domingo. 

método isoweekday

from datetime import date

d = date(2003,3,14)
print(d.weekday())
SALIDA:

5

Como puedes ver para la misma fecha obtenemos un entero diferente, pero que expresa el mismo día de la semana. El entero devuelto por isoweekday sigue la especificación ISO 85601.


Creando objetos Time.


El módulo datetime también tiene una clase que nos permite representar la hora, es la clase time.

time(hour, minute, second, microsecond, tzinfo, fold)

El constructor de la clase time, acepta los siguientes parámetros opcionales:

- hour                   El párametro hour debe ser mayor o igual que 0 y menor que 23.
- minute            -    El párametro minute debe ser mayor o igual que 0 y menor que 59.
- second            -    El párametro second debe ser mayor o igual que 0 y menor que 59.
- microsecond     El párametro microsecond debe ser mayor o igual que 0 y menor que 1000000.
- tzinfo                El párametro tzinfo debe ser un objeto de la subclase tzinfo o None (por defecto).
- fold                   El párametro fold debe ser 0 o 1 (predeterminadamente 0).

En la práctica si queremos construir un objeto de tiempo lo haremos de la siguiente manera:

clase time

from datetime import time

t = time(20,1,20,1)

print("Tiempo:", t)
print("Hora:", t.hour)
print("Minutos:", t.minute)
print("Segundos:", t.second)
print("Microsegundo:", t.microsecond)
SALIDA:

Tiempo: 20:01:20.000001
Hora: 20
Minutos: 1
Segundos: 20
Microsegundo: 1


El módulo time.


Además de la clase time del modulo datetime, la biblioteca estandar de python tiene tambien otra módulo llamado time que nos proporciona funciones relacionadas con el tiempo. De este módulo ya vimos la función time() que nos proporciono una marca de tiempo de UNIX. Ahora vamos a ver otra función útil de este módulo como es sleep().

Se utiliza para parar la ejecución de un programa por un periodo de tiempo especificado. Puede ser útil en situaciones como:


1.- Controlar la velocidad de ejecuciónSi estás realizando operaciones intensivas en un bucle o en una sección de código y deseas limitar la velocidad a la que se ejecutan esas operaciones, puedes usar sleep() para agregar una pausa entre iteraciones.

sleep del módulo time

import time

for i in range(5):
    # Realizamos alguna tarea
    print(i)
    # Realizamos una pausa de 1 segundo entre class
    # las iteraciones.
    time.sleep(1)


  1. 2.- Sincronización de procesos: En aplicaciones donde múltiples procesos o hilos trabajan simultáneamente y necesitan sincronizarse, sleep() puede utilizarse para introducir una pausa controlada entre las operaciones de diferentes partes del código.
import threading

def proceso():
    print("Inicio del proceso")
    # Realizar algunas operaciones
    time.sleep(2)
    print("Fin del proceso")

thread = threading.Thread(target=proceso)
thread.start()

# Realizar otras operaciones mientras el hilo está en ejecución
print("Hilo principal realizando otras operaciones")

3.- Simulación de procesos en tiempo real: En casos donde se necesite simular la espera por eventos externos o procesos en tiempo real, sleep() puede ser útil para hacer pausas en la ejecución del programa.

import time

while True:
    # Realizar alguna tarea
    print("Esperando por un evento...")
    # Esperar 5 segundos antes de verificar nuevamente
    time.sleep(5)
Es importante tener en cuenta que sleep() suspende la ejecución del programa actual durante el tiempo especificado, por lo que puede bloquear otros procesos en el mismo hilo. En aplicaciones que requieren concurrencia, es posible que se prefiera el uso de asyncio.sleep() en lugar de time.sleep() para evitar bloqueos en programas asíncronos.


La función ctime.


El módulo time proporciona una función llamada ctime, que convierte el tiempo en segundos desde el 1 de enero de 1970. (marca de tiempo UNIX)

import time

t = time.time()
print(t)
print(time.ctime(t))
SALIDA:

1711144768.1780117
Fri Mar 22 21:59:28 2024

La función ctime devuelve una cadena para la marca de tiempo pasada. En nuestro ejemplo, la marca de tiempo expresa el 22 de marzo de 2024 a las 21:59:28.

También es posible llamar a la función ctime sin especificar el tiempo en segundos. En este caso, se devolverá la hora actual.

Las funciones gmtime() y localtime()


Algunas de las funciones disponibles en el modulo time requieren conocer la clase struct_time. Vamos a empezar viendo como es esta clase:

time.struct_time:
    tm_year   # Especifica el año.
    tm_mon    # Especifica el mes (valor de 1 a 12)
    tm_mday   # Especifica el día del mes (value from 1 to 31)
    tm_hour   # Especifica la hora (valor de 0 a 23)
    tm_min    # Especifica el minuto (valor de 0 a 59)
    tm_sec    # Especifica el segundo (valor de 0 a 61)
    tm_wday   # Especifica el día de la semana (valor de 0 a 6)
    tm_yday   # Especifica el día del año (valor de 1 a 366)
    tm_isdst  # Especifica si se aplica el horario de verano (1: sí, 0: no, -1: no se sabe)
    tm_zone   # Especifica el nombre de la zona horaria (valor en forma abreviada)
    tm_gmtoff # Especifica el desplazamiento al este del UTC (valor en segundos) 
La clase struct_time también permite el acceso a valores usando índices. El índice 0 devuelve el valor en tm_year, mientras que 8 devuelve el valor en tm_isdst.

Las excepciones son tm_zone y tm_gmoff, a las que no se puede acceder mediante índices. Veamos cómo usar la clase struct_time en la práctica. Ejecuta el código en el editor.

import time

t = time.time()
print(t)
print(time.gmtime(t))
print(time.localtime(t))
SALIDA:

1711298982.4769127 
time.struct_time(tm_year=2024, tm_mon=3, tm_mday=24, tm_hour=16, tm_min=49, tm_sec=42, tm_wday=6, tm_yday=84, tm_isdst=0) 
time.struct_time(tm_year=2024, tm_mon=3, tm_mday=24, tm_hour=16, tm_min=49, tm_sec=42, tm_wday=6, tm_yday=84, tm_isdst=0)

El ejemplo muestra dos funciones que convierten el tiempo transcurrido desde la época Unix al objeto struct_time. La diferencia entre ellos es que la función gmtime devuelve el objeto struct_time en UTC, mientras que la función localtime devuelve la hora local. Para la función gmtime, el atributo tm_isdst es siempre 0.


Las funciones asctime() y mktime().

El módulo time tiene funciones que esperan un objeto struct_time o una tupla que almacena valores de acuerdo con los índices presentados cuando se habla de la clase struct_time. Ejecuta el siguiente código:

import time

timestamp = 1572879180
st = time.gmtime(timestamp)

print(time.asctime(st))
print(time.mktime((2019, 11, 4, 14, 53, 0, 0, 308, 0)))
SALIDA:

Mon Nov  4 14:53:00 2019
1572879180.0

La primera de las funciones, llamada asctime, convierte un objeto struct_time o una tupla en una cadena. Toma en cuenta que la conocida función gmtime se usa para obtener el objeto struct_time. Si no se proporciona un argumento a la función asctime, se utilizará el tiempo devuelto por la función localtime.

La segunda función llamada mktime convierte un objeto struct_time o una tupla que expresa la hora local al número de segundos desde la época de Unix.


Creando objetos datetime.


En el módulo datetime, la fecha y la hora se pueden representar como objetos separados o como un solo objeto. La clase que combina fecha y hora se llama datetime.

datetime(year, month, day, hour, minute, second, microsecond, tzinfo, fold)

Vamos a ver como podemos crear un objeto del tipo datetime.

import datetime

fh = datetime.datetime(2024,3,25, 0, 9 , 30)
print(f"la fecha y hora son: {fh}")
print(f"La fecha es: {fh.date()}")
print(f"La hora es: {fh.time()}")
Salida:

la fecha y hora son: 2024-03-25 00:09:30
La fecha es: 2024-03-25
La hora es: 00:09:30

El ejemplo crea un objeto datetime que representa el 25 de marzo de 2024 a las 00:09:30. Todos los parámetros pasados al constructor van a ser atributos de clase de solo lectura. Son yearmonthdayhourminutesecondmicrosecondtzinfo, y fold.

El ejemplo muestra dos métodos que devuelven dos objetos diferentes. El método llamado date devuelve el objeto date con el año, mes y día dados, mientras que el método llamado time devuelve el objeto time con la hora y minuto dados.


Métodos que devuelven la fecha y hora actual.


La clase datetime tiene varios métodos que devuelven la fecha y hora actuales. Estos métodos son:
  • today(): devuelve la fecha y hora local actual con el atributo tzinfo establecido a None.
  • now(): devuelve la fecha y hora local actual igual que el método today, a menos que le pasemos el argumento opcional tz. El argumento de este método debe ser un objeto de la subclase tzinfo.
  • utcnow(): devuelve la fecha y hora UTC actual con el atributo tzinfo establecido a None.
Veámoslo con un ejemplo.

from datetime import datetime

print("hoy:", datetime.today())
print("ahora:", datetime.now())
print("utc_ahora:", datetime.utcnow())
Salida:

hoy: 2024-03-25 00:18:09.327818
ahora: 2024-03-25 00:18:09.328024
utc_ahora: 2024-03-24 23:18:09.328138


Obteniendo una marca de tiempo.


Para obtener una marca de tiempo a partir de una fecha en concreto podemos utilizar el método timestamp del módulo datetime

import datetime

dt = datetime.datetime(2024,3,25,23,51)
print(dt.timestamp())
SALIDA:

1711410660.0

El método timestamp devuelve un valor flotante que expresa el número de segundos transcurridos entre la fecha y la hora indicadas por el objeto datetime y el 1 de enero de 1970, 00:00:00 (UTC).

Dando formato a la fecha y a la hora.


Todas las clases que hemos visto hasta ahora del modulo datetime tienen un método llamado strftime, el cual nos permite devolver la fecha y la hora en el formato que le especifiquemos. 

El método strftime toma solo un argumento en forma de cadena que especifica un formato que puede constar de directivas.

Una directiva es una cadena que consta del caracter % (porcentaje) y una letra minúscula o mayuscula. Por ejemplo la directiva %Y significa el año con el siglo como número decimal. Vamos a verlo con un ejemplo.

from datetime import date

d = date(2023,3,25)
print(d.strftime('%d/%m/%Y'))
SALIDA:

25/03/2023

En el ejemplo hemos pasado un formato que consta de tres directivas separadas por una barra diagonal (/) al método strftime. El separador se puede reemplazar por otro caracter, o incluso por una cadena. 

Puede poner cualquier caracter en el formato pero solo las directivas reconocibles se sustituirán por sus correspondiente valores. Puede encontrar todas las directivas disponibles aquí.

El formato de hora funciona de la misma forma que el formato de fecha pero con las directivas adecuadas. Por ejemplo:

from datetime import time

t = time(0,7,30)
print(t.strftime('%H:%M:%S'))
SALIDA:

00:07:30

La función strftime() en el módulo time.


La función strftime() también está presente en el módulo time. No se diferencia mucho del disponible en el modulo datetime.

import time

timestamp = 1572879180
st = time.gmtime(timestamp)

print(time.strftime("%Y/%m/%d %H:%M:%S", st))
print(time.strftime("%Y/%m/%d %H:%M:%S"))
SALIDA

2019/11/04 14:53:00
2024/03/26 22:11:28

Puedes encontrar todas las directivas del módulo time aquí.


El método strptime().


A diferencia del método anterior strftime, crea un objeto datetime a partir de una cadena que representa una fecha y una hora.

El método strptime requiere que especifiques el formato en el que guardaste la fecha y la hora. Veámoslo con un ejemplo.

from datetime import datetime
print(datetime.strptime("2024/03/26 23:17:00", "%Y/%m/%d %H:%M:%S"))
SALIDA

2024-03-26 23:17:00

Hay que tener cuidado dado que si el formato que se especifica no coincide con la cadena se generará un ValueError.


Operaciones con la fecha y la hora.


Para realizar cálculos con la fecha y la hora existe una clase llamada timedelta. Un objeto timedelta se crea cuando se crea una operación con los objetos date o datetime. 

from datetime import date
from datetime import datetime

d1 = date(2024, 3, 26)
d2 = date(1974, 8, 7)

print(d1 - d2)

dt1 = datetime(2020, 11, 4, 0, 0, 0)
dt2 = datetime(2019, 11, 4, 14, 53, 0)

print(dt1 - dt2)
SALIDA

18129 days, 0:00:00
365 days, 9:07:00

Creando objetos TimeDelta.


Ya hemos visto que un objeto TimeDelta puede devolverse como resultado de restar dos objetos date o datetime. Pero también podemos crear un objeto TimeDelta nosotros mismos. Para ello vamos a familiarizarnos con los argumentos aceptados por el constructor de la clase que son:

  • days
  • seconds
  • microseconds
  • milliseconds
  • minutes
  • hours
  • weeks
Cada uno es opcional y el valor predeterminado es cero.

Los argumentos deben ser números enteros o de coma flotante, positivos o negativos. 

from datetime import timedelta

delta = timedelta(weeks=2, days=2, hours=3)
print(delta)
Salida:

16 days, 3:00:00

El resultado de 16 días se obtiene convirtiendo el argumento weeks en días (2 semanas = 14 días) y agregando el argumento days (2 días). Este es un comportamiento normal, porque el objeto timedelta solo almacena días, segundos y microsegundos internamente. De manera similar, el argumento hora se convierte en minutos. Echa un vistazo al siguiente ejemplo:

from datetime import timedelta
 
delta = timedelta(weeks=2, days=2, hours=3)
print("Días:", delta.days)
print("Segundos:", delta.seconds)
print("Microsegundos:", delta.microseconds)
Salida:

Días: 16
Segundos: 10800
Microsegundos: 0

El resultado de 10800 se obtiene convirtiendo 3 horas en segundos. De esta forma el objeto timedelta almacena los argumentos pasados durante su creación. Las semanas se convierten en días, las horas y los minutos en segundos y los milisegundos en microsegundos.

Ya sabes cómo el objeto timedelta almacena los argumentos pasados internamente. Veamos cómo se puede utilizar en la práctica.

Observa algunas operaciones admitidas por las clases del módulo datetime. Observa el siguiente código:

from datetime import datetime

delta = timedelta(weeks=2, days=2, hours=2)
print(delta)

delta2 = delta * 2
print(delta2)

d = date(2019, 10, 4) + delta2
print(d)

dt = datetime(2019, 10, 4, 14, 53) + delta2
print(dt)
Salida:

16 days, 2:00:00
32 days, 4:00:00
2019-11-05
2019-11-05 18:53:00


El módulo calendar.


Vamos a verlo de manera resumida. 

1.- En el módulo calendar los días de la semana se muestran de lunes a domingo. Cada día de la semana tiene su representación en forma de número entero, donde el primer día de la semana, el lunes, está representado por el valor 0, mientras que el último día de la semana, el domingo, está representado por el valor 6.

2.- Para mostrar un calendario de cualquier año, se emplea la función calendar, pasándole el año como argumento. Por ejemplo:

import calendar

print(calendar.calendar(2024))
Salida:


                                  2024

      January                   February                   March
Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su
 1  2  3  4  5  6  7                1  2  3  4                   1  2  3
 8  9 10 11 12 13 14       5  6  7  8  9 10 11       4  5  6  7  8  9 10
15 16 17 18 19 20 21      12 13 14 15 16 17 18      11 12 13 14 15 16 17
22 23 24 25 26 27 28      19 20 21 22 23 24 25      18 19 20 21 22 23 24
29 30 31                  26 27 28 29               25 26 27 28 29 30 31

       April                      May                       June
Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su
 1  2  3  4  5  6  7             1  2  3  4  5                      1  2
 8  9 10 11 12 13 14       6  7  8  9 10 11 12       3  4  5  6  7  8  9
15 16 17 18 19 20 21      13 14 15 16 17 18 19      10 11 12 13 14 15 16
22 23 24 25 26 27 28      20 21 22 23 24 25 26      17 18 19 20 21 22 23
29 30                     27 28 29 30 31            24 25 26 27 28 29 30

        July                     August                  September
Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su
 1  2  3  4  5  6  7                1  2  3  4                         1
 8  9 10 11 12 13 14       5  6  7  8  9 10 11       2  3  4  5  6  7  8
15 16 17 18 19 20 21      12 13 14 15 16 17 18       9 10 11 12 13 14 15
22 23 24 25 26 27 28      19 20 21 22 23 24 25      16 17 18 19 20 21 22
29 30 31                  26 27 28 29 30 31         23 24 25 26 27 28 29
                                                    30

      October                   November                  December
Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su
    1  2  3  4  5  6                   1  2  3                         1
 7  8  9 10 11 12 13       4  5  6  7  8  9 10       2  3  4  5  6  7  8
14 15 16 17 18 19 20      11 12 13 14 15 16 17       9 10 11 12 13 14 15
21 22 23 24 25 26 27      18 19 20 21 22 23 24      16 17 18 19 20 21 22
28 29 30 31               25 26 27 28 29 30         23 24 25 26 27 28 29
                                                    30 31

Como alternativa a lo anterior, podemos utilizar la función prcal (calendar.prcal(año), que toma los mismo parámetros que la función calendar, pero no requiere el uso de print para imprimir el formulario.

3.- Para mostrar el calendario de cualquier mes del año, se emplea la función month pasándole el año y el mes. Por ejemplo:

import calendar

print(calendar.month(2024, 3))
Salida:

     March 2024
Mo Tu We Th Fr Sa Su
             1  2  3
 4  5  6  7  8  9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
O también puedes usar la función prmonth.

4.- La función setfirstweekday te permite cambiar el primer día de la semana. Toma un valor de 0 a 6 donde el 0 es el Lunes y 6 es el Domingo.

Por ejemplo si queremos que la semana empieze el Domingo utilizaremos el siguiente código:

import calendar

calendar.setfirstweekday(6)
# también se puede utilizar calendar.DIASEMANA
# calendar.setfirstweekday(calendar.SUNDAY)
calendar.prmonth(2024, 3)
Salida:

     March 2024
Su Mo Tu We Th Fr Sa
                1  2
 3  4  5  6  7  8  9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31

5.- La función weekday es el día de la semana para un año, mes y día determinado pasado por argumento.

Por ejemplo para saber que día de la semana nació Leonardo Da Vinci (15.04.1542)

import calendar

print(calendar.weekday(1452,4,15))

Salida:

3 # Se corresponde con el Jueves.

6.- La función weekheader devuelve los nombres de los días de la semana en forma abreviada. Se requiere que se pase como argumento el ancho en caracteres de un día de la semana.

import calendar

print(calendar.weekheader(1))
print(calendar.weekheader(3))
print(calendar.weekheader(5))
print(calendar.weekheader(10))
Salida:

M T W T F S S
Mon Tue Wed Thu Fri Sat Sun
Mon   Tue   Wed   Thu   Fri   Sat   Sun 
Monday    Tuesday   Wednesday   Thursday    Friday    Saturday    Sunday

7.- Una función útil es isleap, que nos permite saber si un año es bisiesto o no.

import calendar

print(calendar.isleap(2024))
Salida:

True

8.- Podemos crear un objeto calendar usando la clase Calendar, que al crear el objeto te permite cambiar el primer día de la semana con el parámetro opcional firstweekday, por ejemplo:

import calendar
 
c = calendar.Calendar(2)
 
for weekday in c.iterweekdays():
    print(weekday, end=" ")
Salida:

2 3 4 5 6 0 1 

iterweekdays devuelve un iterador para los números de los días de la semana. El primer valor devuelto siempre es igual al valor de la propiedad firstweekday.




No hay comentarios:

Publicar un comentario