Réponses:
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:
root@hostname:~# echo $((`date --utc --date "$1" +%s`/86400))
14984
Une vérification rapide avec WolframAlpha montre que c'est la bonne valeur.
Je pense que c'est la méthode la plus simple:
expr $(date +%s) / 86400
Je devais également résoudre ce problème, mais je voulais obtenir la même valeur pour la journée # quelle que soit l'heure de la journée. Avec des approches comme celles illustrées ici, la valeur changera à minuit UTC au lieu de minuit heure locale. Cela semble probablement être moins un problème dans l'UE ou 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 heures PST, 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 à l'UTC avant de diviser par secondes / jour. Heureusement, la commande Linux date inclut une séquence de format % z qui rapporte 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 nous voulons:
$ date +%-:::z
-6
Mettez cela ensemble avec les conversions habituelles en secondes / heures / jours, et je pense que ce qui suit devrait afficher les jours depuis le 1/1/1970, avec 1/1/1970 lui-même étant le jour zéro et la valeur incrémentant à 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'heure UTC par heure entière (par exemple, Inde, TZ = Asia / Kolkata), car le "+5: 30" produit par date +%-:::z
produira une erreur "caractère non valide dans l'expression" lorsqu'il est utilisé dans la déclaration ci-dessus.
$()
est préféré aux backticks pour la lisibilité et d'autres raisons .echo $(( $(date ...) / 86400 ))