Ich habe eine Java-Klasse, die den Längen- und Breitengrad einer Position berücksichtigt und den GMT-Offset zurückgibt, wenn die Sommerzeit ein- und ausgeschaltet ist. Ich bin auf der Suche nach einer einfachen Möglichkeit, in Java zu bestimmen, ob das aktuelle Datum in der Sommerzeit liegt, damit ich den korrekten Offset anwenden kann. Momentan führe ich diese Berechnung nur für US-Zeitzonen durch, obwohl ich diese auch später auf globale Zeitzonen erweitern möchte.Ermitteln, ob die Sommerzeit (DST) für ein bestimmtes Datum in Java aktiv ist
Antwort
Dies ist die Antwort für die Maschine, auf der die Frage gestellt wird:
TimeZone.getDefault().inDaylightTime(new Date());
Ein Server versucht, dies für einen Kunden, um herauszufinden, wird die Zeitzone des Client benötigen. Siehe @Powerlord Antwort für den Grund warum.
Für jede bestimmte Time-Zone
TimeZone.getTimeZone("US/Alaska").inDaylightTime(new Date());
Ich habe an dem gleichen Problem gearbeitet. Ich habe keine Formdatei für die Weltzeitzonen gefunden. – Clint
Wir wissen jedoch nicht, ob es sich um eine Desktop-App oder eine Web-App handelt. Eine Webanwendung hat keinen Zugriff auf die Zeitzoneninformationen auf dem Client. – Powerlord
Android: Erfordert API-Level 24 –
TimeZone tz = TimeZone.getTimeZone("EST");
boolean inDs = tz.inDaylightTime(new Date());
Drei spätere Abkürzungen wie EST (gemeint für Standardzeiten) sollten vermieden werden, da sie DST-insensibel sind. Verwenden Sie stattdessen eine Zeitzonen-ID. – Tiny
Sie gehen zu müssen, ein bisschen mehr Arbeit unter Verwendung dieser Koordinaten zu tun und herauszufinden, welche Zeitzone sie sind in. Wenn Sie wissen, welche Time-Zone, dass ist, wäre die isDayLight() Methode nützlich.
Zum Beispiel haben Sie keine Möglichkeit zu sagen, ob -0500 ist EST (US/Kanada Eastern Standardzeit), CDT (US/Kanada Central Daylight Time), COT (Kolumbien Zeit), AST (Brasilien Acre Standardzeit) , ECT (Ecuador Time), etc ...
Einige von diesen können oder können nicht Sommerzeit unterstützen.
Joda Time enthält Bearbeitungsmethoden, die die Offsets für Sie berechnen. Siehe DateTimeZone.convertLocalToUTC(...)
Um dies zu ergänzen, müssen Sie die aktuelle Zeitzone mit Ihren Breiten-/Längengradinformationen nachschlagen. GeoNames bietet einen Java-Client für seine Web-Service sowie eine einfache Web-Anfrage Rahmen (dh http://ws.geonames.org/timezone?lat=47.01&lng=10.2)
Ich habe mir vorher den GeoNames-Webdienst angeschaut und bin mir bewusst, dass er erreichen wird, was ich versuche zu tun. Leider wird dieser Code auf Servern gehostet, die sich möglicherweise hinter einer Firewall befinden. Daher versuche ich, wenn möglich, externe Webdienst-Aufrufe zu vermeiden. Für diejenigen ohne diese Einschränkung wäre der GeoNames Web Service eine großartige Lösung. – gelgamil
tl; dr
ZoneId.of("America/Montreal")
.getRules()
.isDaylightSavings(
Instant.now()
)
java.time
Hier ist die moderne java.time (siehe Tutorial) Version der correct Answer von mamboking.
- Eine
ZoneId
repräsentiert eine Zeitzone. Die Klasse kennt die Regeln, die angeben, ob DST für a particular time zone gilt. Die KlasseZoneRules
modelliert alle historischen und zukünftigen Übergänge für eine Zeitzone. EineInstant
ist ein Moment auf der Timeline in UTC. - Eine
ZonedDateTime
ist das Ergebnis der Anwendung einerZoneId
auf eineInstant
.
Beispielcode:
ZonedDateTime now = ZonedDateTime.now(ZoneId.of("America/Montreal"));
…
ZoneId z = now.getZone();
ZoneRules zoneRules = z.getRules();
Boolean isDst = zoneRules.isDaylightSavings(now.toInstant());
Beachten Sie, wie in der letzten Zeile mussten wir mit einem einfachen Anruf toInstant
ein Instant
Objekt aus unserem ZonedDateTime
Objekt extrahieren.
Momentan lese ich die Zeitzoneninformationen mit der GeoTools-Bibliothek und einem Shapefile aus dem Nationalatlas der Vereinigten Staaten (http://nationalatlas.gov/mld/timeznp.html). Glücklicherweise liefert dies mir einige zusätzliche Informationen - hauptsächlich das Zeitzonensymbol, das 2 oder 4 Ziffern aufweist (d. H. AL, EA, EAno, usw.). Leider entspricht dieser Wert nicht den Werten der Java-Zeitzonen, obwohl ich diese Zuordnung manuell durchführen könnte. Idealerweise hätte ich gerne eine Lösung, die funktioniert, wenn ich diese Datei durch eine Shape-Datei für die Weltzeitzone ersetze, die aber vielleicht zu ehrgeizig ist. – gelgamil
timeznp020.txt listet 'Enumerated_Domain's auf, die Details jeder verwendeten Abkürzung enthalten; Es sollte nicht zu schwierig sein, diese den Zeitzonennamen von zoneinfo zuzuordnen. Ich bin mir nicht sicher, ob die Zeitzonennamen in Java plattformübergreifend sind, aber ich hoffe es! –
eine andere Antwort, die für dieses Problem nützlich ist http://stackoverflow.com/a/1449510/311525 – Scott