4 Stimmen

Wie kann man die Java-Zeitzonen-ID in einer Windows-Anwendung (ohne Java) verwenden?

Ich muss einer Datenbank-Tabelle mit benutzergepflegten Standorten Zeitzoneninformationen hinzufügen. Auf die Daten wird hauptsächlich über Java-Code zugegriffen, aber es gibt auch einige PL/SQL- und Win32 (Delphi)-Codes, die die Zeitzoneninformationen verstehen müssen.

Es scheint einfach zu sein, die ID von java.util.TimeZone zu verwenden. Java kann das (offensichtlich) leicht konvertieren, Hibernate hat integrierte Unterstützung dafür und anscheinend versteht auch Oracle diese Zeitzonen-IDs:

select TZ_OFFSET('Pacific/Marquesas') from dual.

Das Problem ist: Die Zeitzonen-IDs scheinen nicht mit der Windows-Zeitzonen-DB kompatibel zu sein. Zum Beispiel ist die java.util.timezone id "Pacific/Marquesas" (-09:30) nicht in der Zeitzonen-Auswahlliste von Windows enthalten. Die Registry enthält sie überhaupt nicht; siehe

\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Time Zones

Hier kann ich nur entweder -09:00 oder -10:00 wählen. Wenn ich also die Zeitzone so speichere, wie komme ich dann an die tatsächlichen Offset/DST-Informationen in Windows (ohne Java)? Hoffentlich ist dafür keine Zuordnungstabelle erforderlich, die ich bei jeder Änderung auf dem Laufenden halten muss. Gibt es einen weltweit akzeptierten Standard, der besser funktioniert als die Java-Zeitzonen-ID?

Update

Die Zeitzoneninformation wird in Kombination mit DATE-Spalten in der Datenbank verwendet. Diese Spalten enthalten lokale Datums-/Zeitwerte. Wenn diesen Werten ein Ort zugeordnet werden kann, ermöglicht mir die Zeitzone des Ortes, den Datums-/Zeitwert bei Bedarf in UTC oder eine andere Zeitzone zu konvertieren.

Mir ist klar, dass anstelle von DATE ein TIMESTAMP_TZ-Datentyp oder etwas Ähnliches besser geeignet wäre. Dies würde jedoch eine Datenmigration erfordern (für die wiederum die TZ benötigt wird) und wird von den Altanwendungen, die ebenfalls mit den Daten arbeiten, nicht unterstützt (es sei denn, es wird eine Menge Code geändert). Das Problem ist fast dasselbe, wenn ich die Werte in UTC konvertieren müsste.

Unterm Strich muss ich die DATE-Werte in Ortszeit halten, aber ich muss für einige von ihnen wissen, welche TZ das bedeutet.

0 Stimmen

Vielleicht muss man eine andere Sprache/Locale von Windows haben, damit etwas wie Marquesas eine gute Wahl ist? Sicherlich würde Microsoft die Menschen in den dazwischen liegenden Zeitzonen nicht so ausnutzen...

0 Stimmen

So scheint es nicht zu funktionieren. Ich würde sagen, dass Windows immer alle Zeitzonen in der Registrierung hat (zumindest die, die es unterstützt). Die Sprache/das Gebietsschema kann die Zeitzone nicht ausreichend bestimmen - vor allem bei der heutigen mobilen Datenverarbeitung.

6voto

John M Punkte 12793

Ich kann ein paar Hintergrundinformationen geben, wenn auch keine wirkliche Antwort.

Viele Systeme verwenden die Olson Implementierung von Zeitzonendaten. Diese Namen funktionieren also in vielen Systemen (die meisten Unix, Java, Oracle, glaube ich). Microsoft macht sein eigenes Ding.

Wie ich sehe, gibt es am Ende des Wikipedia-Links einen Hinweis auf eine Zuordnung zur Windows-Welt.

Viel Glück!

0 Stimmen

Das bedeutet, dass es sich 1. um ein häufiges Problem handelt und 2. dass es eine gewisse Hoffnung gibt. Das Mapping ist eine Möglichkeit, obwohl dies keine exakte Wissenschaft zu sein scheint, oder ich könnte den mitgelieferten Quellcode verwenden, der sich mit dem TZ-Binärformat beschäftigt. In diesem Fall müsste ich die TZ-Datenbank zusammen mit der App bereitstellen.

0 Stimmen

Fantastisch! Ich habe diese Informationen genutzt, um eine .NET-Erweiterungsfunktion TimeZoneInfo.OlsonName( ) zu schreiben, die die zurückgegebene Zeichenkette direkt an Java übergeben kann.

2voto

Sarel Botha Punkte 12053

Mir ist klar, dass dies nicht der beste Weg ist, aber in Ihrem Fall könnte es ausreichend sein. Ohne alle Anforderungen zu kennen, kann ich das nicht sagen.

Wozu brauchen Sie die Zeitzoneninformationen? Nur um die Uhrzeit mit dem richtigen Offset und vielleicht auch den Namen der Zeitzone anzuzeigen?

Sie könnten weiterhin Java verwenden, um die Zeitverschiebung des Benutzers zu ermitteln, indem Sie die vom Benutzer gewählte Zeitzone mit Java nachschlagen. Jedes Mal, wenn sich der Benutzer anmeldet, wird der aktuelle Zeitabstand in Ihrer Datenbank gespeichert. Dann können andere Anwendungen anhand dieser Informationen feststellen, wie die Zeit zu formatieren ist.

Dabei wird davon ausgegangen, dass die Benutzer, die sich regelmäßig anmelden, diejenigen sind, für die dies getan werden muss. Wenn das nicht der Fall ist, könnten Sie einen täglichen Job laufen lassen, um die Zeitzone für jeden Benutzer in Java nachzuschlagen und die aktuell gültige Verschiebung aufzuzeichnen.

Hackish, einverstanden, aber die einzige andere Möglichkeit, die ich sehe, ist die Beibehaltung eines Mappings. Und was passiert, wenn jemand eine Zeitzone auswählt, für die Sie keine Zuordnung haben?

0 Stimmen

Ok, ich denke, ich könnte Offset/DST usw. zusammen mit der Zeitzone speichern, wenn diese geändert wird (die Änderung wird immer in Java vorgenommen). Klingt sicherlich machbar und würde das Mapping vermeiden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X