2017-08-15 2 views
2

gefunden Während ich JSTL-Tag zu üben timezone, habe ich versucht, diese beiden Aktionen auszuführen:JSTL Zeitzone (KST) Implementierungsfehler

<c:set var="now" value="<%= new java.util.Date() %>" /> 
<fmt:timeZone value="GMT+9:00"> 
    <fmt:formatDate value="${now}" type="both" 
        dateStyle="full" timeStyle="full"/> 
</fmt:timeZone> 
<%-- and --%> 
<fmt:timeZone value="KST"> 
    <fmt:formatDate value="${now}" type="both" 
        dateStyle="full" timeStyle="full"/> 
</fmt:timeZone> 

Ich glaube, sie sollten gleiches Ergebnis. Sie erzeugen jedoch zwei verschiedene Zeitwerte.

2017 년 8 월 15 일 화요일 오후 (PM) 8 시 03 분 27 초 GMT + 09: 00

2017 년 8 월 15 일 화요일 오전 (AM) 11 시 03 분 27 초 GMT

Habe ich etwas übersehen oder ist die Implementierung falsch? I Fall von Fehl-Implementierung, wen sollte ich kontaktieren?

Antwort

1

Es wird nicht empfohlen, dreistellige Zeitzonen-IDs zu verwenden. Sie sind veraltet. Und nicht alle werden unterstützt.

Siehe oracle java docs

Drei-Buchstaben-Zeitzone IDs

Für die Kompatibilität mit JDK 1.1.x, einige andere aus drei Buchstaben IDs Zeitzone (wie "PST", "CTT", "AST") werden ebenfalls unterstützt. Ihre Verwendung ist jedoch veraltet, da dieselbe Abkürzung oft für mehrere Zeitzonen verwendet wird (z. B. "CST" könnte US "Central Standardzeit" und "China Standard Time" sein), und die Java-Plattform kann dann Erkenne nur einen von ihnen.

2

GMT+09:00 ist keine Zeitzone, es ist ein UTC offset: eine Differenz (in Stunden, Minuten und Sekunden) von UTC. Es bedeutet nur "9 Stunden vor UTC", und es ist nicht an eine bestimmte Region oder ein Land gebunden. (Die meisten Systeme behandeln den Offset jedoch normalerweise als einen "speziellen Typ" der Zeitzone, nur make things easier).

KST ist eine abbreviation for Korea Standard Time, ist aber keine "wahre" Zeitzone. Zeitzonennamen sind nicht wirklich standardisiert, aber viele Systeme verwenden IANA timezones names (immer im Format Region/City, wie Asia/Seoul oder Europe/London). Die Verwendung der kurzen Abkürzungen (wie CST oder KST) wird normalerweise von Systemen vermieden, weil sie ambiguous and not standard sind.

Die Zeitzone Asia/Seoul verwendet KST Abkürzung heute, aber das wurde auch in der Vergangenheit von Asia/Pyongyang verwendet. Obwohl sie nicht die gleiche Zone sind.

Eine Zeitzone ist eine Menge aller verschiedenen Offsets, die eine Region während ihrer Geschichte hatte, hat und haben wird. Heute Asia/Seoul verwendet die +09:00 Offset, aber Asia/Pyongyang auch in der Vergangenheit verwendet, so dass ihre historischen Daten sind unterschiedlich (und das ist, warum sie unterschiedliche Zonen sind).

Pjöngjang hatte die +08:30 offset until 1912, wenn geändert zu +09:00. Aber im Jahr 2015 hat es sich wieder geändert in +08:30 und es benutzt es bis heute.

Seoul hat ein different offset history: er verwendet auch +08:30 in der Vergangenheit (in den 50er Jahren), mit der Sommerzeit (Änderung +09:30 im Sommer), dann im Jahr 1961 wechselte er zu +09:00, hatte DST während einiger Zeit, und heute verwendet nur +09:00 ohne DST.

All diese Änderungen werden von Regierungen und Gesetzen definiert, und Systeme haben keine Kontrolle darüber. Nur weil eine Zeitzone (eine Region) heute einen Offset verwendet, gibt es keine Garantie, dass sie dies für immer verwenden wird. Also, obwohl KST heute ein "Synonym" von +09:00 sein kann, bedeutet es nicht, dass es für immer so sein wird.


Also, wenn Sie GMT+09:00, Sie verwenden nur den Offset, ohne Korrelation zu einer bestimmten Zeitzone (weil there are lots of timezones that can use this offset).

Im zweiten Fall scheint es, dass das Datum von KST (offfset +09:00) in UTC (Offset Null oder "GMT") konvertiert wird. Beachten Sie, dass der erste Fall 8 PM im Offset +09:00 und der zweite Fall 11 AM in UTC (Offset Null oder "GMT") ist, was korrekt ist.

Möglicherweise kann JSTL KST nicht erkennen (wegen seiner Ambiguität) und verwendet UTC als Standard. Ich würde versuchen, es durch Asia/Seoul zu ersetzen und zu sehen, was passiert.