Calculer les jours depuis le 1/1/1970

10

Comment calculer le nombre de jours depuis le 1/1/1970? C'est pour mettre à jour l' attribut shadowLastChange sur OpenLDAP.

Existe-t-il un moyen de le faire en utilisant la commande linux date ?

nitines
la source
Dans Bash et la plupart des shells dérivés de Bourne modernes, $()est préféré aux backticks pour la lisibilité et d'autres raisons . echo $(( $(date ...) / 86400 ))
pause jusqu'à nouvel ordre.
Je n'ai pas encore 2000 ... quelqu'un peut-il éditer et corriger le titre :-)
Ring Ø

Réponses:

20

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.

Dave Drager
la source
1
qu'en est-il des secondes intercalaires? :)
netvope
1
@netvope Après une seconde intercalaire supplémentaire, le temps unix est réinitialisé de un. Ainsi, chaque jour ajoute exactement 86400 secondes Unix. Cependant, l'heure Unix 915148800 peut représenter à la fois UTC 1998-12-31T23: 59: 60 et 1999-01-01T00: 00: 00 fr.wikipedia.org/wiki/Unix_time#Leap_seconds
Debilski
9

La datecommande 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*24pour obtenir le nombre de jours (UTC).

Par exemple dans Bash

  x=`date +"%s"` ; echo $(( $x / 3600 / 24 ))

pour afficher le nombre de jours.

Ø bague
la source
9

Je pense que c'est la méthode la plus simple:

expr $(date +%s) / 86400
Cheval noir
la source
Pourquoi est-ce sous-voté? C'est la réponse la meilleure, la plus courte et la plus simple
Tom Corelis
1

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 +%-:::zproduira une erreur "caractère non valide dans l'expression" lorsqu'il est utilisé dans la déclaration ci-dessus.

oracleif
la source