2009-09-15 13 views
2

J'ai deux variables: X et Y.Comment puis-je calculer la date précédant une date donnée dans unix?

La valeur de X sera une date donnée dans le format mmjjaa et je veux calculer la date précédant qui date et ont soit retourné dans le format yyyymmdd. Laissez-moi vous donner un exemple.

Lorsque X = "091509" (mmjjaa le format) Y doit être "20090914" (yyyymmdd format)

+0

Script shell ou autre chose? – pavium

+0

shell scripting ............... – musicking123

+0

je ne veux pas la date d'hier ......... je veux la date qui est un jour moins la valeur de "x" – musicking123

Répondre

5
~$ date -d "20090101 -1 day" 
Wed Dec 31 00:00:00 CET 2008 

Et si vous voulez récupérer la date un format personnalisé que vous venez de jeter dans certaines chaînes de format. En ce qui concerne votre conversion, vous pouvez utiliser l'extraction de sous-chaîne bash (en supposant que vous utilisiez bien sûr bash). Cela suppose également que votre entrée est cohérente et "sûre".

X="091509" 
Y=`date -d "${X:4:2}${X:0:2}${X:2:2} -1 day" +%Y%m%d` 
echo $Y 

Voir http://www.walkernews.net/2007/06/03/date-arithmetic-in-linux-shell-scripts/

+0

Cela ne résout pas le problème de la conversion de votre $ X à travailler dans ce domaine, mais oui, laissez la commande date qui fonctionne le jour d'avant 030100 (par exemple). – pavium

+0

@pavium .... vous avez raison. J'ai ajouté une façon de faire une telle conversion maintenant. Merci de l'avoir signalé! –

+0

Cela fonctionnera sur la date GNU (par exemple sur Linux), mais malheureusement -d n'est pas portable. – mark4o

-1

-d date "hier"

+0

je Je ne veux pas d'hier date .............. – musicking123

0

J'aime Tcl pour l'arithmétique date, même si elle est maladroit pour shell one-liners. Tcl 8.5 Utilisation:

x=091509 
y=$(printf 'puts [clock format [clock add [clock scan "%s" -format "%%m%%d%%y"] -1 day] -format "%%Y%%m%%d"]' "$x" | tclsh) 
0

Depuis l'option -D n'existe pas sur Mac OS X ou FreeBSD, voici la réponse pour les

Récupération d'une date relative à l'heure

date -v -1d 

Pour votre question en particulier, vous aurez besoin du -j et -f indicateurs pour utiliser une date spécifique

date -v -1d -j -f %m%d%y 091509 +%Y%m%d 
Questions connexes