Behandelt GNU-date Zeitzonen falsch?

04/07/2015 - 01:55 von Helmut Waitzmann | Report spam
Aus aktuellem Anlass – der Schaltsekunde an bzw. vor dem 1. Juli, also

2015-07-01T01:59:60+02:00 (mitteleuropàischer Sommerzeit)

oder

2015-06-30T23:59:60+00:00 (UTC) –

bin ich über GNU‐date gestolpert:

Laut den info‐Seiten soll es möglich sein, mittels {+-]HH:MM an
Zeitangaben die Zeitzone anzugeben, in der die Zeitangabe zu verstehen
ist.

Gebe ich den Zeitpunkt, an dem die Schaltsekunde aufgetreten ist, in
mitteleuropàischer Sommerzeit an und lasse ihn einmal in
mitteleuropàischer Sommerzeit und einmal in UTC ausgeben, erhalte ich
folgende Ausgaben:


$ TZ=':right/Europe/Berlin' \
date -d '2015-07-01 01:59:60+02:00' -- '+%Y-%m-%d %T%:z (%Z)'

liefert

2015-07-01 01:59:60+02:00 (CEST)

Richtig.


$ TZ=':right/UTC' \
date -d '2015-07-01 01:59:60+02:00' -- '+%Y-%m-%d %T%:z (%Z)'

liefert

date: invalid date `2015-07-01 01:59:60+02:00'

Gemàß dem Handbuch hàtte (richtigerweise)

2015-06-30 23:59:60+00:00 (UTC)

erscheinen müssen.


Umgekehrt: Gebe ich den Zeitpunkt, an dem die Schaltsekunde aufgetreten
ist, in UTC an und lasse ihn einmal in UTC und einmal in
mitteleuropàischer Sommerzeit ausgeben, erhalte ich folgende Ausgaben:


$ TZ=':right/UTC' \
date -d '2015-06-30 23:59:60+00:00' -- '+%Y-%m-%d %T%:z (%Z)'

liefert

2015-06-30 23:59:60+00:00 (UTC)

Richtig.


$ TZ=':Europe/Berlin' \
date -d '2015-06-30 23:59:60+00:00' -- '+%Y-%m-%d %T%:z (%Z)'

liefert

date: invalid date `2015-06-30 23:59:60+00:00'

Gemàß dem Handbuch hàtte (richtigerweise)

2015-07-01 01:59:60+02:00 (CEST)

erscheinen müssen.


Verdacht: GNU‐date nimmt die im Parameter zu „-d“ enthaltenen
Zeitzonenangaben „+00:00“ bzw. „+02:00“ nicht als Zeitzonenangaben des
mit „-d“ übergebenenen Zeitpunkts, sondern bezieht den Zeitpunkt auf die
in der Umgebungsvariablen enthaltene Zeitzonenangabe, zieht aber
anschließend von der erhaltenen Uhrzeit die bei „-d“ angegebene
Zeitzonenangabe als Offset ab.

Die Probe aufs Exempel:

Das Kommando

$ TZ=':right/Europe/Berlin' \
date -d '2015-07-01 01:59:60+00:00' -- '+%Y-%m-%d %T%:z (%Z)'

liefert

2015-07-01 03:59:59+02:00 (CEST),

obwohl es sich beschweren müsste: Der Zeitpunkt

2015-07-01 01:59:60+00:00

hatte keine Schaltsekunde: Die Schaltsekunde war zwei Stunden vorher.

Ebenso: Das Kommando

$ TZ=':right/UTC' \
date -d '2015-06-30 23:59:60+02:00' -- '+%Y-%m-%d %T%:z (%Z)'

liefert

2015-06-30 22:00:00+00:00 (UTC)

obwohl es sich beschweren müsste: Der Zeitpunkt

2015-06-30 23:59:60+02:00

hatte keine Schaltsekunde: Die Schaltsekunde war zwei Stunden spàter.


An wen ist ein Bug‐Report fàllig? GNU‐date oder ein Library (welches?)?

Ach ja:

$ date --version

date (GNU coreutils) 8.5
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by David MacKenzie.
 

Lesen sie die antworten

#1 Juergen P. Meier
04/07/2015 - 06:58 | Warnen spam
Helmut Waitzmann :
Aus aktuellem Anlass ? der Schaltsekunde an bzw. vor dem 1.?Juli, also

2015-07-01T01:59:60+02:00 (mitteleuropàischer Sommerzeit)

oder

2015-06-30T23:59:60+00:00 (UTC) ?

bin ich über GNU?date gestolpert:



UNIX kennt keine Schaltsekunde. In der UNIX Welt existiert sowas
wie eine Schaltsekunde nicht. Weder konzeptionell noch praktisch.

Dort duerfen Sekunden nur einen Wertebereich von 0 bis 59 haben und
die Zeitrechnung der Epoche in Sekunden seit dem 1. Januar 1970 um
0:00 Uhr GMT enthaelt ebenfalls /keine/ Schaltsekunden.

GNU ist aber Nicht Unix [zyklisches Akronym], und zumindest das
Userspace-Werkzeug "date" kennt Schaltsekunden - auch wenn der Kernel
und alle Betriebssystemschnittstellen des UNIX-Systems darunter davon
nichts wissen.

Laut den info?Seiten soll es möglich sein, mittels {+-]HH:MM an
Zeitangaben die Zeitzone anzugeben, in der die Zeitangabe zu verstehen
ist.

Gebe ich den Zeitpunkt, an dem die Schaltsekunde aufgetreten ist, in
mitteleuropàischer Sommerzeit an und lasse ihn einmal in
mitteleuropàischer Sommerzeit und einmal in UTC ausgeben, erhalte ich
folgende Ausgaben:



Dieser Augenblick *existiert* im Unix-Universum nicht.

$ TZ=':right/Europe/Berlin' \
date -d '2015-07-01 01:59:60+02:00' -- '+%Y-%m-%d %T%:z (%Z)'
liefert

2015-07-01 01:59:60+02:00 (CEST)

Richtig.



Eine GNU-Erweiterung die zu UNIX inkompatibel ist.

GNU Date kann diesen Zeitpunkt aber nicht im System einstellen, weil
die APIs das nicht erlauben.

Es kann ihn immerhin zur allgemeinen Belustigung anzeigen.

$ TZ=':right/UTC' \
date -d '2015-07-01 01:59:60+02:00' -- '+%Y-%m-%d %T%:z (%Z)'

date: invalid date `2015-07-01 01:59:60+02:00'



Inkonsequent. Die Eingabe darf bei expliziter Zeitzonenangabe nicht
von $TZ abhaengen.

*nur im UNIX Universum.

Gemàß dem Handbuch hàtte (richtigerweise)

2015-06-30 23:59:60+00:00 (UTC)

erscheinen müssen.



File a Bug Report.

Umgekehrt: Gebe ich den Zeitpunkt, an dem die Schaltsekunde aufgetreten
ist, in UTC an und lasse ihn einmal in UTC und einmal in
mitteleuropàischer Sommerzeit ausgeben, erhalte ich folgende Ausgaben:

$ TZ=':right/UTC' \
date -d '2015-06-30 23:59:60+00:00' -- '+%Y-%m-%d %T%:z (%Z)'
2015-06-30 23:59:60+00:00 (UTC)
Richtig.

$ TZ=':Europe/Berlin' \
date -d '2015-06-30 23:59:60+00:00' -- '+%Y-%m-%d %T%:z (%Z)'
liefert
date: invalid date `2015-06-30 23:59:60+00:00'



File a Bug Report.

Verdacht: GNU?date nimmt die im Parameter zu ?-d? enthaltenen
Zeitzonenangaben ?+00:00? bzw. ?+02:00? nicht als Zeitzonenangaben des
mit ?-d? übergebenenen Zeitpunkts, sondern bezieht den Zeitpunkt auf die
in der Umgebungsvariablen enthaltene Zeitzonenangabe, zieht aber
anschließend von der erhaltenen Uhrzeit die bei ?-d? angegebene
Zeitzonenangabe als Offset ab.



File a Bug Report.

Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.



Das ganze ist natuerlich nur Makulatur, denn solange du deine GNU Tools
nicht auf einer Plattform die nicht UNIX ist (Hurd, Windows) betreibst
ist dieser Fehler in GNU date nur akademisch.

Anosntesn: file a bug report.

Juergen
Juergen P. Meier - "This World is about to be Destroyed!"
end
If you think technology can solve your problems you don't understand
technology and you don't understand your problems. (Bruce Schneier)

Ähnliche fragen