UniSquat_Python/date_tools.py

273 lines
5.6 KiB
Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Thu Feb 24 16:36:32 2022
@author: antoine
"""
################
### UniSquat ###
################
# Une application pour afficher les salles libres dans les différents
# départements de l'Université de Strasbourg.
### Fichier contenant diverses fonctions relatives à la date du jour et à l'heure ###
# Modules :
import datetime
# Fonctions :
def minutes_convert(time_min) :
"""
Convertit un temps en minute en un temps en heures:minutes.
Parameters
----------
time_min : int
Temps en minutes.
Returns
-------
tuple
Temps en heures et en minutes.
"""
return int(time_min // 60), int(time_min % 60)
def bissextile(year) :
"""
Indique si l'année 'year' est bissextile ou non.
Parameters
----------
year : int
Année dont on veut vérifier la bissextilité.
Returns
-------
bool
'True' si 'year' est bissextile, 'False' sinon.
"""
return (year % 4 == 0 and year % 100 != 0) or year % 400 == 0
def month_days(month, year) :
"""
Renvoie le nombre de jours dans le mois 'month'.
Parameters
----------
month : int (between 1 and 12)
Mois dont on veut connaître le nombre de jours.
year : int
Année, pour vérifier la bissextilité (cas du mois de février).
Returns
-------
int
Nombre de jours dans 'month'.
"""
if month == 2 :
if bissextile(year) :
return 29
else :
return 28
elif month in (4, 6, 9, 11) :
return 30
else :
return 31
def date_input() :
"""
Demande à l'utilisateur d'entrer une date (jour, mois, année,
heure, minutes).
Returns
-------
datetime.datetime()
Date entrée au format datetime.
"""
year = int(input("Entrer l'année.\n> "))
month = 0
while month not in range(1, 13) :
month = int(input("Entrer le mois.\n> "))
mdays = month_days(month, year)
day = 0
while day not in range(1, mdays + 1) :
day = int(input("Entrer le jour.\n> "))
hour = -1
while hour not in range(0, 25) :
hour = int(input("Entrer l'heure.\n> "))
minute = -1
while minute not in range(0, 60) :
minute = int(input("Entrer les minutes.\n> "))
return datetime.datetime(year, month, day, hour, minute)
def hour_disp(time) :
"""
Convertit une heure au format datetime
en une chaîne de caractères.
Parameters
----------
time : datetime.datetime
Heure au format datetime.
Returns
-------
time_str : str
Heure en chaîne de caractères.
"""
time_str = str(time.hour) + ":"
if time.minute < 10 : # Ajout du zéro au début du nombre de minutes
time_str += "0" + str(time.minute)
else :
time_str += str(time.minute)
return time_str
def remain_time(date, rdate) :
"""
Détermine le temps restant avant
la fin/le début de disponibilité d'une salle.
Parameters
----------
date : datetime.datetime
Date choisie au format datetime.
rdate : datetime.datetime
Date de la salle au format datetime.
Returns
-------
remain_time_str : str
Temps restant.
"""
deltasec = rdate.timestamp() - date.timestamp()
if int(deltasec / 60 + 0.5) > 1 :
remain_time_str = str(int(deltasec / 60 + 0.5)) + " minutes"
else :
remain_time_str = str(int(deltasec / 60 + 0.5)) + " minute"
if deltasec / 60 + 0.5 >= 60 : # Conversion en heures:minutes si les minutes dépassent 60
deltasec = minutes_convert(deltasec / 60 + 0.5)
if deltasec[0] > 1 :
remain_time_str = str(deltasec[0]) + " heures"
else :
remain_time_str = str(deltasec[0]) + " heure"
if deltasec[1] > 0 :
remain_time_str += " " + str(deltasec[1]) + " minutes"
return remain_time_str
def check_date(date) :
"""
Vérifie que la date est correcte.
Parameters
----------
date : list
Date à vérifier.
Returns
-------
bool
'True' si la date est correcte, 'False' sinon.
"""
year = 1
month = 1
day = 1
if len(date) != 3 :
return False
try :
year = int(date[0])
month = int(date[1])
day = int(date[2])
except ValueError :
return False
if year < 2 or month < 1 or day < 1 :
return False
if month > 12 :
return False
if day > month_days(month, year) :
return False
return True
def check_time(time) :
"""
Vérifie que l'heure est correcte.
Parameters
----------
time : list
Heure à vérifier.
Returns
-------
bool
'True' si l'heure est correcte, 'False' sinon.
"""
hour = 0
minute = 0
if len(time) != 2 :
return False
try :
hour = int(time[0])
minute = int(time[1])
except ValueError :
return False
if hour < 0 or minute < 0 :
return False
if hour > 23 :
return False
if minute > 59 :
return False
return True
def d_t_format(d_t, t_mode) :
"""
Formate une date ou une heure récupérée depuis une URL
sous la forme d'une liste.
Parameters
----------
d_t : str
Date ou heure à formater.
t_mode : bool
Indique si on est en mode heure.
Returns
-------
str
Date formatée en liste avec jour, mois, année.
"""
sep = ":" if t_mode else "-"
if d_t == "None" :
return [""]
else :
return d_t.split(sep)