"date" Grenzbereich

31/05/2009 - 23:21 von Lukas Gantert | Report spam
Guten Abend,

Wundere mich gerade, warum der folgende date-Befehl akzeptiert wird, der
nàchste aber nicht mehr. Ist das ein Limit von "date" oder von der shell
oder vom 32bit-System? Und warum ist die Grenze gerade bei 2147483648
(2*8^10).

date --date='-2147483648 seconds'
Die Mai 13 19:03:57 CEST 1941

date --date='-2147483649 seconds'
date: ungültiges Datum »-2147483649 seconds«

Jetzt kommt es noch lustiger:

date --date='-2147483648 minutes'
Son Mai 31 22:41:04 CEST 2009

was garantiert falsch ist, aber keine Fehlermeldung ausgibt, und

date --date='-2147483648 month'
Mon Jun 1 16:25:49 CEST 2009

was sogar in der Zukunft liegt, auch ohne Fehlermeldung (vergleiche Zeit
dieses Postings).

In "info date" habe ich folgenden Abschnitt gefunden, der obiges nicht
wirklich erklàrt:

" Traditional Unix systems count seconds with 32-bit two's-complement
integers and can represent times from 1901-12-13 20:45:52 through
2038-01-19 03:14:07 UTC. More modern systems use 64-bit counts of
seconds with nanosecond subcounts, and can represent all the times in
the known lifetime of the universe to a resolution of 1 nanosecond."

Und eine Internetsuche mit "date -2147483648" làsst darauf schliessen,
dass es ein Limit ist von 32-bit-Systemen (Unabhàngig vom Betriebsystem).
Die bash akzeptiert aber auch höhere ( und tiefere) Werte als 2147483648.

echo $(( -2147483648 - 10000000 ))

nicht aber "date".

Kann mir jemand ein Erklàrung dazu geben oder sogar aufzeigen, wie das 32-
bit-System ausgetrickst werden kann (für "date")?

date (GNU coreutils) 7.3
GNU bash, version 3.2.48(1)-release (i486-pc-linux-gnu)
Debian-Linux 2.6.29-2-486

Danke und Gruss, Lukas

for i in 1 12 0 -12 10 -53 -6 -12 3 11 -8 9 11 \
-97 -10 -3 -141; do printf "\\$((153+$i))"; done
 

Lesen sie die antworten

#1 Heike C. Zimmerer
31/05/2009 - 23:54 | Warnen spam
Lukas Gantert <|||.|||@|||.|||> writes:

Ist das ein Limit von "date" oder von der shell
oder vom 32bit-System? Und warum ist die Grenze gerade bei 2147483648
(2*8^10).



Du hast soeben 2**31 sehr umstàndlich ausgedrückt, was gleichzeitig die
Frage beantworten dürfte: es ist die 32-Bit-Grenze.

Gruß,

Heike

Ähnliche fragen