Je voudrais écrire un script ou une fonction pour me dire combien de jours d'ici à une date donnée dans le futur. Ce que j'ai du mal à comprendre, c'est comment traiter la date donnée et la comparer avec la date actuelle ... J'imagine quelque chose comme
read -p "enter the date in the format YYYY-MM-DD "
Et puis je suppose que j'ai une chaîne qui n'a pas de sens pour le shell et je dois faire des évaluations comme ... ?? (Ceci est juste un exemple; je suppose que ce bc
serait nécessaire)
i=$(($(date +%Y)-${REPLY%%-*}))
j=$(($(date +%m)-${REPLY:5:2}))
k=$(($(date +%d)-${REPLY##*-}))
Et puis je ne sais pas quoi faire avec ces chiffres ... ??
if $i > 1 then assign l=$((i*365)) and else what?? # what about leap years?
Using $j somehow assign m # confused before I've started
Using $k somehow assign n # just as bad
echo $((l+m+n))
Je fais sûrement trop dur pour moi; il existe probablement un outil de traitement de texte qui comprend les dates et peut les comparer.
Comment puis-je faire ceci?
Réponses:
Temps d'époque
En général, les calculs sur le temps sont plus faciles si nous avons le temps de conversion en (Unix) époque le temps (secondes de 01.01.1970). En python, nous avons des outils pour convertir l'heure en temps d'époque, et de nouveau dans n'importe quel format de date que nous préférons.
Nous pouvons simplement définir un format, comme:
... et définissez aujourd'hui:
et ensuite écrire une fonction pour faire le travail:
Ensuite, la sortie de:
... qui est, comme mentionné, le nombre de secondes depuis le 1-1-1970
Calcul des jours entre deux dates
Si nous le faisons à la fois aujourd'hui et à notre date future, calculons ensuite la différence:
La sortie sera calculée par date , puisque nous utilisons le format
%Y-%m-%d
. Arrondir les secondes donnerait probablement une différence de date incorrecte, si nous sommes près de 24 heures par exemple.Version du terminal
... et l'option Zenity
Et juste pour le plaisir ...
Une toute petite application. Ajoutez-le à un raccourci si vous l'utilisez souvent.
Le script:
orangedays.py
Exécuter:
Pour conclure
Utilisez pour le petit script d'application au-dessus du
.desktop
fichier suivant :orangedays.desktop
dans~/.local/share/applications
Dans la ligne
définir le chemin réel vers le script ...
la source
L' utilitaire GNU
date
est assez bon dans ce genre de choses. Il est capable d'analyser une bonne variété de formats de date, puis de produire dans un autre format. Ici, nous utilisons%s
pour afficher le nombre de secondes depuis l'époque. C'est alors une simple question d'arithmétique à soustraire$now
de la$future
et à diviser par 86400 secondes / jour:la source
-u
paramètre àdate
.Vous pouvez essayer de faire quelque chose en
awk
utilisant lamktime
fonctionL'awk s'attend à lire la date à partir de l'entrée standard au format "AAAA MM JJ HH MM SS" puis imprime la différence entre l'heure spécifiée et l'heure actuelle en jours.
mktime
convertit simplement une heure (dans le format spécifié) en nombre de secondes à partir d'une heure de référence (1970-01-01 00:00:00 UTC); systime simple spécifie l'heure actuelle dans le même format. Soustrayez l'un de l'autre et vous obtenez à quelle distance ils sont séparés en quelques secondes. Divisez par 86400 (24 * 60 * 60) pour convertir en jours.la source
Voici une version Ruby
Exemple d'exécution:
Un exemple d'exécution du script
ruby ./day-difference.rb
est donné ci-dessous (en supposant que vous l'ayez enregistré sousday-difference.rb
)Avec une date future
Avec une date passée
Quand est passé la date d'aujourd'hui
Voici un joli site internet pour vérifier les différences de date http://www.timeanddate.com/date/duration.html
la source
Il existe un
dateutils
package très pratique pour gérer les dates. En savoir plus ici github: dateutilsInstallez-le par
sudo apt install dateutils
Pour votre problème, simplement,
dateutils.ddiff <start date> <end date> -f "%d days"
où la sortie peut être choisie en secondes, minutes, heures, jours, semaines, mois ou années. Il peut être facilement utilisé dans des scripts où la sortie peut être utilisée pour d'autres tâches.
Par exemple,
la source
Vous pouvez utiliser la bibliothèque awk Velour :
Ou:
la source
Une solution courte, si les deux dates appartiennent à la même année, est:
en utilisant le format "% j", qui renvoie la position de la date en jours dans l'année, soit 135 pour la date actuelle. Il évite les problèmes d'arrondi et gère les dates dans le passé, donnant des résultats négatifs.
Cependant, traverser les frontières de l'année, cela échouera. Vous pouvez ajouter (ou soustraire) 365 manuellement pour chaque année ou 366 pour chaque année bissextile, si le dernier février est franchi, mais ce sera presque aussi détaillé que les autres solutions.
Voici la solution pure bash:
Shellcheck propose de nombreuses citations doubles, mais pour les jours dépassant l'année 9999, vous devriez envisager une approche différente. Pour le passé, il échouera silencieusement pour les dates antérieures au 01.01.1970. La désinfection de l'entrée utilisateur est laissée à l'utilisateur.
Les deux fonctions peuvent être refondues en une seule, mais cela pourrait la rendre plus difficile à comprendre.
Veuillez noter que le script nécessite des tests exhaustifs pour gérer correctement les années bissextiles dans le passé. Je ne parierais pas que c'est vrai.
la source