Re: Datumsberechnung in der bash
Hallo zusammen! Habe die Tips bezüglich der Datumsberechnung nur umgesetzt. Allerdings habe ich nun ein kleines Problem (Bug?) jens@linux:/web> date Mit Jul 31 08:28:15 CEST 2002 jens@linux:/web> date +%Y%m -d '1 month ago' 200207 jens@linux:/web> date +%Y%m -d '2 month ago' 200205 jens@linux:/web> date +%Y%m -d '3 month ago' 200205 jens@linux:/web> date +%Y%m -d '1 month ago' 200207 Wieso kommt da bei "1 month ago" nicht 200206 raus? Und wieso ist -2 und -3 das gleiche. Rechnet der intern nur -30 Tage? Gruß Jens
Dann rechne doch mit Tagen. bdllnx04:~> date +%Y%m 200207 bdllnx04:~> date +%Y%m -d '31 day ago' 200206 bdllnx04:~> date +%Y%m -d '62 day ago' 200205 bdllnx04:~> date +%Y%m -d '93 day ago' 200204 bdllnx04:~> date +%Y%m -d '124 day ago' 200203 Gruss Joerg
-----Ursprüngliche Nachricht----- Von: Jens Wolfgarten [mailto:listen@wolfgarten.com] Gesendet: Mittwoch, 31. Juli 2002 08:38 An: suse-linux@suse.com Betreff: Re: Datumsberechnung in der bash
Hallo zusammen!
Habe die Tips bezüglich der Datumsberechnung nur umgesetzt. Allerdings habe ich nun ein kleines Problem (Bug?)
jens@linux:/web> date Mit Jul 31 08:28:15 CEST 2002 jens@linux:/web> date +%Y%m -d '1 month ago' 200207 jens@linux:/web> date +%Y%m -d '2 month ago' 200205 jens@linux:/web> date +%Y%m -d '3 month ago' 200205 jens@linux:/web> date +%Y%m -d '1 month ago' 200207
Wieso kommt da bei "1 month ago" nicht 200206 raus? Und wieso ist -2 und -3 das gleiche. Rechnet der intern nur -30 Tage?
Gruß Jens
-- Um die Liste abzubestellen, schicken Sie eine Mail an: suse-linux-unsubscribe@suse.com Um eine Liste aller verfügbaren Kommandos zu bekommen, schicken Sie eine Mail an: suse-linux-help@suse.com
Hallo, Am Mittwoch, 31. Juli 2002 08:38 schrieb Jens Wolfgarten:
Habe die Tips bezüglich der Datumsberechnung nur umgesetzt. Allerdings habe ich nun ein kleines Problem (Bug?)
jens@linux:/web> date Mit Jul 31 08:28:15 CEST 2002 jens@linux:/web> date +%Y%m -d '1 month ago' 200207 jens@linux:/web> date +%Y%m -d '2 month ago' 200205 jens@linux:/web> date +%Y%m -d '3 month ago' 200205
Wieso kommt da bei "1 month ago" nicht 200206 raus? Und wieso ist -2 und -3 das gleiche. Rechnet der intern nur -30 Tage?
Laß doch mal das Format weg. Das Ergebnis ist allerdings
merkwürdig:
$ date
Mit Jul 31 08:54:46 CEST 2002
$ date -d -1month
Mon Jul 1 08:54:58 CEST 2002
$ date -d -2month
Fre Mai 31 08:55:02 CEST 2002
$ date -d -3month
Mit Mai 1 08:55:05 CEST 2002
$ date -d -4month
Son Mär 31 08:55:20 CEST 2002
$ date -d -5month
Son Mär 3 08:55:47 CET 2002
$ date -d -6month
Don Jan 31 08:55:59 CET 2002
$
Nicht sehr sorgfältig programmiert, würde ich sagen.
Als Unterschiede lese ich heraus:
30d
31d
30d
31d
28d
31d
Er versucht also schon, Monatslängen abzuziehen. Ich meine,
Du darfst schreiben an:
* Bertram Scharpf schrieb am 31.Jul.2002:
Am Mittwoch, 31. Juli 2002 08:38 schrieb Jens Wolfgarten:
Habe die Tips bezüglich der Datumsberechnung nur umgesetzt. Allerdings habe ich nun ein kleines Problem (Bug?)
jens@linux:/web> date Mit Jul 31 08:28:15 CEST 2002 jens@linux:/web> date +%Y%m -d '1 month ago' 200207 jens@linux:/web> date +%Y%m -d '2 month ago' 200205 jens@linux:/web> date +%Y%m -d '3 month ago' 200205
Wieso kommt da bei "1 month ago" nicht 200206 raus? Und wieso ist -2 und -3 das gleiche. Rechnet der intern nur -30 Tage?
Laß doch mal das Format weg. Das Ergebnis ist allerdings merkwürdig:
$ date Mit Jul 31 08:54:46 CEST 2002 $ date -d -1month Mon Jul 1 08:54:58 CEST 2002 $ date -d -2month Fre Mai 31 08:55:02 CEST 2002 $ date -d -3month Mit Mai 1 08:55:05 CEST 2002 $ date -d -4month Son Mär 31 08:55:20 CEST 2002 $ date -d -5month Son Mär 3 08:55:47 CET 2002 $ date -d -6month Don Jan 31 08:55:59 CET 2002 $
Nicht sehr sorgfältig programmiert, würde ich sagen.
Wie würdest Du es anders machen?
Als Unterschiede lese ich heraus:
30d 31d 30d 31d 28d 31d
Kommen einem diese Zahlen nicht irgendwoher bekannt vor?
Er versucht also schon, Monatslängen abzuziehen. Ich meine, Du darfst schreiben an:
.
Ja, was wäre Eurer Meinung denn richtig? $ date 31. Juli $ date -d -1month 31. Juni $ date -d -3month 31. April oder was? Das Problem liegt am Kalender, der ist so komisch. Und andere Ausgabe, jenachdem ob ich den Tag mit ausgebe oder nicht, möchte ich auch nicht haben. Bernd -- Alle meine Signaturen sind rein zufällig und haben nichts mit dem Text oder dem Schreiber zu tun, dem ich antworte. Falls irgendwelche Unrichtigkeiten dabei sein sollten, so bedauere ich das. Es wäre nett, wenn Du mich benachrichtigen würdest. |Zufallssignatur 0
Am Mit, 31 Jul 2002 schrieb Bernd Brodesser:
* Bertram Scharpf schrieb am 31.Jul.2002:
Am Mittwoch, 31. Juli 2002 08:38 schrieb Jens Wolfgarten:
Habe die Tips bezüglich der Datumsberechnung nur umgesetzt. Allerdings habe ich nun ein kleines Problem (Bug?)
jens@linux:/web> date Mit Jul 31 08:28:15 CEST 2002 jens@linux:/web> date +%Y%m -d '1 month ago' 200207 jens@linux:/web> date +%Y%m -d '2 month ago' 200205 jens@linux:/web> date +%Y%m -d '3 month ago' 200205
Wieso kommt da bei "1 month ago" nicht 200206 raus? Und wieso ist -2 und -3 das gleiche. Rechnet der intern nur -30 Tage? [...] Er versucht also schon, Monatslängen abzuziehen. Ich meine, Du darfst schreiben an:
. Ja, was wäre Eurer Meinung denn richtig?
$ date 31. Juli $ date -d -1month 31. Juni
30. Juni, aber 30. Juli -1month darf auch nur 30.Juni ergeben, ich seh schon, das ist nicht trivial und läßt sich über das fixe Abziehen von Tagen nur sehr unbefriedigend lösen... Dumm finde ich allerdings, daß die Zuordnung nicht eineindeutig ist, denn ma@gbp301:~ > date "+%Y%m%d" "-d 20020731 -d -1 month" 20020701 ma@gbp301:~ > date "+%Y%m%d" "-d 20020701 -d +1 month" 20020801 Gruß Christoph -- Christoph Maurer - 52072 Aachen - Tux#194235 mailto:christoph-maurer@gmx.de - http://www.christophmaurer.de Auf der Homepage u.a.: Installation von SuSE 7.0 auf Notebook Acer Travelmate 508 T, Elektrotechnik an der RWTH Aachen
On Mit, 31 Jul 2002 at 10:31 (+0200), Christoph Maurer wrote: [...]
30. Juni, aber 30. Juli -1month darf auch nur 30.Juni ergeben,
ich seh schon, das ist nicht trivial und läßt sich über das fixe Abziehen von Tagen nur sehr unbefriedigend lösen...
Wir hatten das IIRC vor langer Zeit schon mal auf der Liste. date rechnet IMHO immer mit 30 Tagen. Wenn man immer den korrekten Monat braucht, sollte man mit einem Tag in der Mitte rechnen: for mon in `seq 1 12`; do date +%Y%m -d "`date +\"%b 15\"` -$mon month" done
Dumm finde ich allerdings, daß die Zuordnung nicht eineindeutig ist, denn ma@gbp301:~ > date "+%Y%m%d" "-d 20020731 -d -1 month" 20020701 ma@gbp301:~ > date "+%Y%m%d" "-d 20020701 -d +1 month" 20020801
Da ist IMHO Deine Syntax falsch. Wie meine Versuche ergeben haben, akzeptiert date nur eine -d Option, und eine Option in "" wird wohl gar nicht als solche erkannt. Jan
Jetzt führe ich schon Selbstgespräche ... On Mit, 31 Jul 2002 at 21:10 (+0200), Jan Trippler wrote:
On Mit, 31 Jul 2002 at 10:31 (+0200), Christoph Maurer wrote: [...]
30. Juni, aber 30. Juli -1month darf auch nur 30.Juni ergeben,
ich seh schon, das ist nicht trivial und läßt sich über das fixe Abziehen von Tagen nur sehr unbefriedigend lösen...
Wir hatten das IIRC vor langer Zeit schon mal auf der Liste. date rechnet IMHO immer mit 30 Tagen.
Wenn man immer den korrekten Monat braucht, sollte man mit einem Tag in der Mitte rechnen: for mon in `seq 1 12`; do date +%Y%m -d "`date +\"%b 15\"` -$mon month" done [...]
Mir ist gerade noch eingefallen: Wenn man es sich richtig schön machen will und den aktuellen Tag (- x Monate) in der Ausgabe noch mit drin haben will: for mon in `seq 1 12`; do date +%Y%m`date +%d` -d "`date +\"%b 15\"` -$mon month" done wobei der aufmerksame Beobachter gerade bei Tagen am Monatsende leicht ein paar Ungereimtheiten feststellen kann: 20020231 - *ups* Also muss man ein klein wenig mehr Aufwand treiben (ich gehe mal davon aus, dass man dann lieber den letzten des Monats angezeigt kriegen will): for mon in `seq 1 12`; do ymd=`date +%Y%m\`date +%d\` -d "\`date +\"%b 15\"\` -$mon month"` test `date +%Y%m%d -d $ymd` = $ymd || \ ymd=`date +%Y%m%d -d "\`date +\"%b 01\"\` -\`expr $mon - 1\` \ month -1 day"` echo $ymd done Damit kriegt man immer den gleichen Tag des Monats in den Vormonaten oder den letzten Tag des entspr. Monats, wenn das wie heute - ähm, gestern - ein Tag ist, den sie nicht alle haben. Das kann man schön testen, wenn man die Schleife mal etwas modifiziert: for mon in `seq 1 12`; do ymd=`date +%Y%m31 -d "\`date +\"%b 15\"\` -$mon month"` # ^^ hier irgendeinen Wert zwischen 29 und 31 # einsetzen test `date +%Y%m%d -d $ymd` = $ymd || \ ymd=`date +%Y%m%d -d "\`date +\"%b 01\"\` -\`expr $mon - 1\` \ month -1 day"` echo $ymd done *Shell macht Laune* :-) Jan
Am Mit, 31 Jul 2002 schrieb Jan Trippler:
On Mit, 31 Jul 2002 at 10:31 (+0200), Christoph Maurer wrote: [...]
Dumm finde ich allerdings, daß die Zuordnung nicht eineindeutig ist, denn ma@gbp301:~ > date "+%Y%m%d" "-d 20020731 -d -1 month" 20020701 ma@gbp301:~ > date "+%Y%m%d" "-d 20020701 -d +1 month" 20020801
Da ist IMHO Deine Syntax falsch. Wie meine Versuche ergeben haben, akzeptiert date nur eine -d Option, und eine Option in "" wird wohl gar nicht als solche erkannt.
Gebe ja zu, daß ich das in der Manpage auch nicht so gefunden habe, aber offensichtlich funktioniert's. War mehr ein Produkt zufälligen Ausprobierens, ohne "" geht es übrigens nicht...denn: ma@gbp301:~ > date "+%Y%m%d" "-d 20010101 -d +1 year" 20020101 aber: ma@gbp301:~ > date "+%Y%m%d" -d 20010101 -d +1 year date: Zuviele Argumente, die keine Optionen sind Mit `date --help' bekommen Sie mehr Informationen. Gruß Christoph -- Christoph Maurer - 52072 Aachen - Tux#194235 mailto:christoph-maurer@gmx.de - http://www.christophmaurer.de Auf der Homepage u.a.: Installation von SuSE 7.0 auf Notebook Acer Travelmate 508 T, Elektrotechnik an der RWTH Aachen
On Don, 01 Aug 2002 at 08:01 (+0200), Christoph Maurer wrote: [...]
Gebe ja zu, daß ich das in der Manpage auch nicht so gefunden habe, aber offensichtlich funktioniert's. War mehr ein Produkt zufälligen Ausprobierens, ohne "" geht es übrigens nicht...denn: ma@gbp301:~ > date "+%Y%m%d" "-d 20010101 -d +1 year" 20020101
Komisch, aber das muss wohl an dem Format 20010101 liegen, denn: jan@k500:~> date +%Y%m%d -d "20010101 -d +1 year -1 day" 20011231 jan@k500:~> date +%Y%m%d "-d 20010101 -d +1 year -d -1 day" date: ungültiges Datum ` 20010101 -d +1 year -d -1 day' jan@k500:~> date +%Y%m%d -d "Jan 01 +1 year -1 day" 20021231 BTW: Das mit dem "" hatte ich eigentlich so gemeint, dass sie nicht um die Optionsbuchstaben (-d) herum gehören.
aber:
ma@gbp301:~ > date "+%Y%m%d" -d 20010101 -d +1 year date: Zuviele Argumente, die keine Optionen sind Mit `date --help' bekommen Sie mehr Informationen.
Logo. Die letzte -d Option kriegt +1 als Argument und year steht einfach so in der Gegend rum. Das mosert date an. Selbst wenn Du die erste -d Option weglässt, kommt er ins Schleudern. Meine Vermutung mit den "" war natürlich Quatsch, das sorgt ja lediglich dafür, dass date die Option und ihre Argumente als ein Argument kriegt. Nötig sind sie aber nur dann, wenn Blanks oder andere Sonderzeichen in den Argumenten auftauchen. date +%Y%m%d -d 20010101 -d "+1 year" ist also syntaktisch korrekt. Dann ignoriert date aber die erste Option und rechnet 1 Jahr auf das heutige Datum. Jan
participants (6)
-
B.Brodesser@t-online.de
-
Bertram Scharpf
-
Christoph Maurer
-
Jan.Trippler@t-online.de
-
Jens Wolfgarten
-
Joerg Demtroeder