J'ai un script shell qui fonctionne sous Linux et utilise cet appel pour obtenir la date d'hier au YYYY-MM-DD
format:
date -d "1 day ago" '+%Y-%m-%d'
Cela fonctionne la plupart du temps, mais lorsque le script a été exécuté hier matin, 2013-03-11 0:35 CDT
il est revenu "2013-03-09"
au lieu de "2013-03-10"
.
L'heure d'été (qui a commencé hier) est probablement à blâmer. Je suppose que la façon dont "1 day ago"
est mise en œuvre elle a été soustraite 24 heures, et 24 heures avant l' 2013-03-11 0:35 CDT
était 2013-03-09 23:35 CST
, ce qui a conduit au résultat "2013-03-09"
.
Alors, quel est un bon moyen sûr pour l'heure d'été d'obtenir la date d'hier dans bash sur Linux?
Réponses:
Je pense que cela devrait fonctionner, indépendamment de la fréquence et du moment où vous l'exécutez ...
la source
date -d yesterday 13:00 -I
la date sous Mac OSX est légèrement différente.
Pour hier
Pour la semaine dernière
la source
gdate
, disponible dans lecoreutils
package homebrew .date
c'est différent.Cela devrait également fonctionner, mais c'est peut-être trop:
la source
date
qui ne prend pas en charge layesterday
syntaxe ...Si vous êtes certain que le script s'exécute dans les premières heures de la journée, vous pouvez simplement faire
BTW, si le script s'exécute quotidiennement à 00:35 (via crontab?), Vous devriez vous demander ce qui se passera si un changement d'heure d'été tombe dans cette heure; le script n'a pas pu s'exécuter ou s'exécuter deux fois dans certains cas. Les implémentations modernes de
cron
sont cependant assez intelligentes à cet égard.la source
vous pouvez utiliser
pour obtenir la date d'il y a 30 jours, vous pouvez également remplacer 30 par x nombre de jours
la source
%Y%m%d
qu'il corresponde à la question. J'ai quand même voté pour parce que cela fonctionnait correctement.Voici une solution qui fonctionnera également avec Solaris et AIX.
La manipulation du fuseau horaire est possible pour changer l'horloge de quelques heures. En raison de l'heure d'été, il y a 24 heures peut être aujourd'hui ou avant-hier.
Vous êtes sûr qu'hier, c'est il y a 20 ou 30 heures. Laquelle? Eh bien, le plus récent qui n'est pas aujourd'hui.
Le paramètre -e utilisé dans la commande echo est nécessaire avec bash, mais ne fonctionnera pas avec ksh. Dans ksh, vous pouvez utiliser la même commande sans l'option -e.
Lorsque votre script sera utilisé dans différents environnements, vous pouvez démarrer le script avec #! / Bin / ksh ou #! / Bin / bash. Vous pouvez également remplacer le \ n par une nouvelle ligne:
la source
Il suffit d'utiliser
date
et de confiance secondes:Comme vous le faites remarquer à juste titre, de nombreux détails sur le calcul sous-jacent sont cachés si vous vous fiez à l'arithmétique du temps anglaise. Par exemple
-d yesterday
, et-d 1 day ago
aura un comportement différent.Au lieu de cela, vous pouvez compter de manière fiable sur les secondes (précisément documentées) depuis l'époque unix UTC, et bash l'arithmétique pour obtenir le moment souhaité:
Cela a été souligné dans une autre réponse . Ce formulaire est plus portable sur les plates-formes avec différents
date
indicateurs de ligne de commande, est indépendant de la langue (par exemple "hier" vs "hier" dans les paramètres régionaux français), et franchement (à long terme) sera plus facile à retenir, car bon, vous le sais déjà. Sinon, vous pourriez continuer à vous demander: "Était-ce-d 2 hours ago
ou-d 2 hour ago
encore?" ou "Est-ce-d yesterday
ou-d 1 day ago
que je veux?"). Le seul point délicat ici est le@
.Armé de bash et rien d'autre:
Bash uniquement sur bash, vous pouvez également obtenir l'heure d'hier, via le printf intégré:
Alors,
ou, de manière équivalente à une variable temp (sous-coque externe facultative, mais garde les variables d'environnement propres).
Remarque: malgré la page de manuel indiquant qu'aucun argument du
%()T
formateur ne supposera une valeur par défaut-1
, il semble que je reçoive un 0 à la place (merci, bash version 4.3.48 du manuel)la source
Pour l'utiliser plus tard:
la source
Vous pouvez utiliser:
Ou quelle que soit l'heure à laquelle vous souhaitez récupérer, elle sera récupérée par bash.
Pour mois:
la source
Comme cette question est étiquetée frapper "DST sécurisé"
Et en utilisant fork pour
date
commander implie delay, il existe un moyen simple et plus efficace d'utiliser pure bash intégré:Ceci est beaucoup plus rapide sur plus convivial système que d' avoir à la fourche à
date
.De frapperV> = 5,0 , il y a une nouvelle variable
$EPOCHSECONDS
la source