UniSquat_Python/date_tools.py
antux18 8306e33db0 Correction d'un bug qui faisait planter l'app lorsqu'on choisissait une date en décembre.
Amélioration de l'affichage ("1 heure" au lieu de "1 heures", par exemple).
Amélioration du README.
Diverses corrections des commentaires.
2022-06-17 19:12:29 +02:00

178 lines
3.9 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