Je veux souvent faire quelques calculs rapides de date, tels que:
- Quelle est la différence entre ces deux dates?
- Quelle est la date n semaines après cette autre date?
J'ouvre habituellement un calendrier et compte les jours, mais je pense qu'il devrait y avoir un programme / script que je peux utiliser pour faire ce genre de calcul. Aucune suggestion?
Réponses:
Le "n semaines après une date" est facile avec la date GNU (1):
Je ne connais pas de moyen simple de calculer la différence entre deux dates, mais vous pouvez envelopper un peu de logique autour de la date (1) avec une fonction shell.
Échangez
d1
etd2
si vous voulez que le calcul de la date soit inversé, ou soyez un peu plus sophistiqué pour le rendre sans importance. De plus, dans le cas où il y aurait une transition non-DST à DST dans l'intervalle, l'un des jours ne durerait que 23 heures; vous pouvez compenser en ajoutant ½ journée à la somme.la source
Pour un ensemble d'outils portables, essayez mes propres outils de données . Vos deux exemples se résumeraient à une ligne:
ou en semaines et en jours:
et
la source
dateadd -i '%m%d%Y' 01012015 +1d
cela ne semble pas fonctionner, il y est suspendu indéfiniment ... cela fonctionne si les spécifications de date sont séparées par un caractère, un caractère quelconque ... aucune idée de ce qui ne va pas?)Un exemple en python pour calculer le nombre de jours que j'ai parcourus la planète:
la source
ychaouche@ychaouche-PC ~ $ python -c "from datetime import date as d; print (d.today() - d(1980, 6, 14)).days"
12813
ychaouche@ychaouche-PC ~ $
Je préfère généralement avoir l’heure / la date au format unix utime (nombre de secondes depuis l’époque, au début des années 70, UTC). De cette façon, cela revient toujours à une simple soustraction ou à l’addition de secondes.
Le problème est généralement de transformer une date / heure en ce format.
Dans un environnement / script shell, vous pouvez l’obtenir avec.
date '+%s'
Au moment de la rédaction, l’heure actuelle est1321358027
.À comparer avec 2011-11-04 (mon anniversaire)
date '+%s' -d 2011-11-04
,, cédant1320361200
. Soustraire:expr 1321358027 - 1320361200
donne les996827
secondes, c'est-à-direexpr 996827 / 86400
= il y a 11 jours.La conversion d'utime (format 1320361200) en une date est très simple, par exemple en C, PHP ou Perl, à l'aide de bibliothèques standard. Avec GNU
date
, l’-d
argument peut être précédé@
de l’indication "Secondes depuis l’époque".la source
date -d @1234567890
convertit les secondes écoulées depuis l’époque vers le format de date que vous spécifiez.info date
, en particulier les secondes depuis le nœud Epoch : «Si vous faites précéder un nombre de« @ », il représente un horodatage interneSi un outil graphique vous convient, je le recommande vivement
qalculate
(une calculatrice mettant l’accent sur les conversions d’unités, elle est fournie avec une interface GTK et KDE, IIRC). Là vous pouvez dire par exemplepour obtenir le nombre de jours (140, puisque 1900 n’était pas une année bissextile) entre les dates, mais vous pouvez bien sûr faire de même pour les heures:
donne
8.4591667
heures ou, si vous définissez la sortie à la mise en forme du temps,8:27:33
.la source
qalc
alorshelp days
.qcalc
exemple:qalc -t 'days(1900-05-21, 1900-01-01)'
-> 140Cela s'est produit lors de l'utilisation
date -d "$death_date - $y years - $m months - $d days"
d'une date de naissance (pour la généalogie). Cette commande est FAUX. Les mois ne sont pas tous de la même longueur, donc(date + offset) - offset != date
. Les âges, en année / mois / jour, sont des mesures allant de la date de naissance.Date donne la sortie correcte dans les deux cas, mais dans le second cas, vous posiez la mauvaise question. Quel que soit 11 mois de l’année la couverture +/- 11, avant d’additionner / soustraire des jours. Par exemple:
Pour que la soustraction soit l’opération inverse d’ajout, il faudrait inverser l’ordre des opérations. L'ajout ajoute des années, PUIS des mois, PUIS des jours. Si la soustraction utilisait l'ordre inverse, vous reviendriez à votre point de départ. Ce n'est pas le cas, donc vous ne le faites pas, si le décalage des jours dépasse une limite de mois dans un mois de longueur différente.
Si vous devez travailler en arrière à partir d'une date et d'un âge de fin, vous pouvez le faire avec plusieurs invocations de
date
. Commencez par soustraire les jours, puis les mois, puis les années. (Je ne pense pas qu'il soit prudent de combiner les années et les mois en une seuledate
invocation, car les années bissextiles modifient la durée de février.)la source
Une autre façon de calculer la différence entre deux dates de la même année civile est d'utiliser ceci:
date
à la variable DATEfirstnum. Le-d
drapeau affiche la chaîne au format heure dans ce cas, le 14 mai 2014, et+"%j"
indiquedate
de formater la sortie uniquement au jour de l'année (1-365).DAYSdif
à la différence des deux jours.DAYSdif
.Cela fonctionne avec la version GNU de
date
, mais pas avec la version PC-BSD / FreeBSD. J'ai installé àcoreutils
partir de l'arborescence des ports et utilisé la commande à la/usr/local/bin/gdate
place.la source
DATEfirstnum=$(date -d "$1" +%s)
DATElastnum=$(date -d "$2" +%s)
De plus, ce script ne pourra pas calculer la différence entre deux années différentes.+%j
fait référence au jour de l'année (001..366) donc./date_difference.sh 12/31/2001 12/30/2014
output -1. Comme d'autres réponses l'ont noté, vous devez convertir les deux dates en secondes depuis le 1970-01-01 00:00:00 UTC.$
expression arithmétique interne:$((DATElastnum - DATEfirstnum))
cela fonctionnera également.J'utilise fréquemment SQL pour les calculs de date. Par exemple, MySQL , PostgreSQL ou SQLite :
D'autres fois, je me sens d'humeur pour JavaScript. Par exemple, SpiderMonkey , WebKit , Seed ou Node.js :
(Faites attention lorsque vous passez le mois au
Date
constructeur de l'objet JavaScript . Commence par 0.)la source
À l'aide de solutions Dannas, cela peut être fait en une ligne avec le code suivant:
(Fonctionne à la fois dans Python 2.x et Python 3.)
la source
date
et bash peuvent faire des différences de date (options OS X affichées). Placez cette dernière date en premier.la source
Il y a aussi les calculs de temps de l'unité GNU combinés avec la date GNU:
(gunits est des unités sous Linux, gdate est la date)
la source
datiff.sh sur github: gist
la source
La réponse de camh s’occupe de la plus grande partie, mais nous pouvons améliorer la gestion des arrondis, des fuseaux horaires, etc.
-d
indiquedate
que nous fournissons une date-heure pour convertir.+%s.%N
modifie la date-heure en secondess.nanoseconds depuis le 1970-01-01 00:00:00 UTC.bc
calcule la différence entre les deux nombres et le facteur de division nous donne les différentes unités.printf
ajoute un 0 avant la décimale si nécessaire (bc
ne le fait pas) et veille à ce que l’arrondi soit le plus proche (bc
tronque). Vous pouvez également utiliserawk
.Maintenant, exécutons ceci avec un cas de test génial,
Notez que comme la durée d'un mois ou d'une année n'est pas toujours la même, il n'y a pas une seule réponse "correcte", bien que l'on puisse utiliser 365,24 jours comme une approximation raisonnable de nos jours.
la source
Vous pouvez utiliser la bibliothèque awk Velour :
Ou:
Résultat:
la source