Solution 1 :
ring0 m'a battu de quelques secondes, mais la commande complète est :
echo $(($(date --utc --date "$1" +%s)/86400))
Cela passe par l'heure UTC. Résultat :
[email protected]:~# echo $((`date --utc --date "$1" +%s`/86400))
14984
Une vérification rapide avec WolframAlpha montre que c'est la bonne valeur.
Solution 2 :
Je pense que c'est la méthode la plus simple :
expr $(date +%s) / 86400
Solution 3 :
Le date
La commande peut vous donner le nombre de secondes depuis 1970-01-01 00:00:00 UTC
.
date +"%s"
Vous pouvez diviser le résultat par 3600*24
pour obtenir le nombre de jours (UTC).
Par exemple. dans Bash
x=`date +"%s"` ; echo $(( $x / 3600 / 24 ))
pour afficher le nombre de jours.
Solution 4 :
Je devais également résoudre ce problème, mais je voulais obtenir la même valeur pour le jour # quelle que soit l'heure de la journée. Avec des approches comme celles présentées ici, la valeur changera à minuit UTC au lieu de minuit heure locale. Cela semble probablement moins problématique dans l'UE ou sur la côte est des États-Unis, qui sont suffisamment proches de l'UTC pour que la valeur du jour ne change pas au milieu d'une journée de travail typique, mais, par exemple, en Californie, le changement de jour se produirait à 16 h 00 HNP, ce qui pourrait être gênant. J'imagine que les Australiens seraient particulièrement ennuyés de voir la valeur du jour changer en fin de matinée.
Si nous voulons corriger cela, nous devons ajouter le décalage par rapport à UTC avant de diviser par secondes/jour. Heureusement, la commande Linux date inclut un %z séquence de format qui signale le décalage par rapport à UTC. Alors que le format standard (ce résultat est pour l'heure de Denver, MDT) :
$ date +%z
-0600
. . . n'est pas directement utilisable dans un calcul, les bons modificateurs donneront ce que l'on veut :
$ date +%-:::z
-6
Mettez cela avec les conversions habituelles secondes/heures/jours, et je pense que ce qui suit devrait afficher les jours depuis le 01/01/1970, le 01/01/1970 étant lui-même le jour zéro et la valeur incrémentée à minuit, heure locale :
echo $(( ( $(date +"%s + ( %-:::z * 3600)") ) / 86400 ))
Ce calcul simple ne fonctionnera pas pour les fuseaux horaires qui ne sont pas décalés de l'UTC d'heures entières (par exemple, Inde, TZ=Asie/Kolkata), puisque le "+5:30" produit par date +%-:::z
produira une erreur "caractère non valide dans l'expression" lorsqu'il est utilisé dans l'instruction ci-dessus.