Tracks
/
Elixir
Elixir
/
Ejercicios
/
Tarifas de la biblioteca
Tarifas de la biblioteca

Tarifas de la biblioteca

Ejercicio de aprendizaje

Introducción

Fechas y horas

La biblioteca estándar de Elixir ofrece 4 módulos diferentes para trabajar con fechas y horas, cada uno con su propio struct.

  • El módulo Date. Se puede crear un struct Date con el sigilo ~D.

    ~D[2021-01-01]
    
  • El módulo Time. Se puede crear un struct Time con el sigilo ~T.

    ~T[12:00:00]
    
  • El módulo NaiveDateTime para fechas y horas sin zona horaria. Se puede crear un struct NaiveDateTime con el sigilo ~N.

    ~N[2021-01-01 12:00:00]
    
  • El módulo DateTime para fechas y horas con zona horaria. Usar este módulo para zonas horarias distintas de UTC requiere una dependencia externa, una base de datos de zonas horarias.

Comparaciones

Para comparar fechas u horas entre sí, busca una función compare o diff en el módulo correspondiente. Los operadores de comparación como ==, >, y < parecen funcionar, pero no hacen una comparación semántica correcta para esos structs.

Instrucciones

Tu amiga bibliotecaria te pidió que ampliaras el software de su biblioteca para que calcule automáticamente las multas por retraso. Su sistema actual guarda la fecha y hora exactas del préstamo de un libro como una cadena de fecha y hora ISO8601. Administra una biblioteca local en un pueblo pequeño de Ghana, que usa la zona horaria GMT (UTC +0), no usa el horario de verano y no necesita preocuparse por otras zonas horarias.

1. Analiza las fechas y horas almacenadas

Implementa la función LibraryFees.datetime_from_string/1. Debe recibir como argumento una cadena de fecha y hora ISO8601 y devolver una estructura NaiveDateTime.

LibraryFees.datetime_from_string("2021-01-01T13:30:45Z")
# => ~N[2021-01-01 13:30:45]

2. Determina si un libro se prestó antes del mediodía

Si un libro se prestó antes del mediodía, quien lo tomó prestado tiene 28 días para devolverlo. Si se prestó al mediodía o después, son 29 días.

Implementa la función LibraryFees.before_noon?/1. Debe recibir una estructura NaiveDateTime y devolver un Boolean.

LibraryFees.before_noon?(~N[2021-01-12 08:23:03])
# => true

3. Calcula la fecha de devolución

A partir de la fecha y hora del préstamo, calcula la fecha de devolución.

Implementa la función LibraryFees.return_date/1. Debe recibir una estructura NaiveDateTime y devolver una estructura Date, 28 o 29 días después.

LibraryFees.return_date(~N[2020-11-28 15:55:33])
# => ~D[2020-12-27]

4. Determina cuánto se retrasó la devolución del libro

La biblioteca tiene una tarifa fija por las devoluciones tardías. Para poder calcular la multa, necesitamos saber cuántos días después de la fecha de devolución se devolvió realmente el libro.

Implementa la función LibraryFees.days_late/2. Debe recibir una estructura Date (la fecha de devolución prevista) y una estructura NaiveDateTime (la fecha y hora reales de la devolución).

Si la fecha real de devolución es el mismo día o un día anterior a la fecha y hora de devolución prevista, la función debe devolver 0. En caso contrario, debe devolver la diferencia entre esas dos fechas en días.

La biblioteca registra tanto la fecha como la hora de la devolución real del libro con fines estadísticos, pero no usa la hora al calcular las multas por retraso.

LibraryFees.days_late(~D[2020-12-27], ~N[2021-01-03 09:23:36])
# => 7

5. Determina si el libro se devolvió un lunes

La biblioteca tiene una oferta especial para devolver libros los lunes.

Implementa la función LibraryFees.monday?/1. Debe recibir una estructura NaiveDateTime y devolver un Boolean.

LibraryFees.monday?(~N[2021-01-03 13:30:45Z])
# => false

6. Calcula la multa por retraso

Implementa la función LibraryFees.calculate_late_fee/3. Debe recibir tres argumentos: dos cadenas de fecha y hora ISO8601, la fecha y hora del préstamo y la fecha y hora reales de la devolución, y la multa por un día. Debe devolver la multa total según cuánto se retrasó la devolución real del libro.

Incluye la oferta especial de los lunes. Si devuelves el libro un lunes, tu multa tiene un 50% de descuento, redondeado hacia abajo.

# Sunday, 7 days late
LibraryFees.calculate_late_fee("2020-11-28T15:55:33Z", "2021-01-03T13:30:45Z", 100)
# => 700

# one day later, Monday, 8 days late
LibraryFees.calculate_late_fee("2020-11-28T15:55:33Z", "2021-01-04T09:02:11Z", 100)
# => 400
Editar en GitHub El enlace se abre en una ventana o una pestaña nuevas
Elixir Exercism

¿Todo listo para empezar Tarifas de la biblioteca?

Regístrate en Exercism para aprender y dominar Elixir con 58 conceptos168 ejercicios y mentoría humana real, todo gratis.