2017-08-15 76 views
2

雖然我練JSTL的timeZone標籤,我試圖運行這兩個動作:JSTL時區(KST)執行錯誤發現

<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> 

我相信他們應該產生相同的結果。但是,它們會產生以下兩個不同的時間值。

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

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

我錯過了什麼或執行不正確? 我的錯誤實施案例,我應該聯繫誰?

回答

1

建議不要使用三個字母的時區ID。他們已被棄用。並不是所有的人都支持。

oracle java docs

三字母時區ID

爲了與JDK 1.1.x的兼容,一些三字母時區 的ID(如 「PST」, 「CTT」, 「AST」)也被支持。但是,其 的使用已棄用,因爲多個時區經常使用相同的縮寫(例如,「CST」可能是美國「中央標準時間」和「中國標準時間」),然後Java平臺可以使用 然後再使用 然後再使用 只認識其中之一。

2

GMT+09:00不是時區,這是一個UTC offset:差(以小時,分和秒)從UTC。它只是意味着「比UTC早9個小時」,並沒有附加到任何特定地區或國家。 (但大多數系統通常將偏移量視爲時區的「特殊類型」,僅爲make things easier)。

KSTabbreviation for Korea Standard Time,但不是「真正的」時區。時區名稱並非真正標準化,但許多系統使用IANA timezones names(始終採用格式Region/City,如Asia/SeoulEurope/London)。 系統通常會避免使用簡寫縮寫(如CSTKST),因爲它們是ambiguous and not standard

時區Asia/Seoul今天使用KST的縮寫,但是過去也會使用Asia/Pyongyang。雖然,它們不是同一個區域。

時區是一個地區在其歷史中具有和將會具有的所有不同偏移量的集合。今天Asia/Seoul使用+09:00偏移量,但Asia/Pyongyang也用於過去,所以它們的歷史數據是不同的(這就是爲什麼它們是不同的區域)。

平壤有+08:30 offset until 1912,當改爲+09:00。但在2015年它再次改變爲+08:30,並將其用到今天。

首爾有一個different offset history:這也是在過去使用+08:30(50年代),日光節約時間(夏令時更改爲+09:30),然後於1961年,今天改爲+09:00,在一段時間了DST,以及僅使用+09:00而沒有DST。

所有這些變化都是由政府和法律界定的,系統無法控制它。僅僅因爲時區(一個區域)今天使用了一些偏移量,並不能保證它會永遠使用它。 因此,儘管KST今天可以成爲+09:00的「同義詞」,但並不意味着它會永遠如此。


所以,當你使用GMT+09:00,你只用偏移,沒有任何關聯到一個特定的時區(因爲there are lots of timezones that can use this offset)。

在第二種情況下,似乎日期從KST(offfset +09:00)轉換爲UTC(偏移零或「GMT」)。請注意,第一種情況是偏移+09:00中的下午8點,第二種情況是UTC上午11點(偏移零或「GMT」),這是正確的。

也許JSTL不能識別KST(因爲它的含糊性)並且使用UTC作爲默認值。我會嘗試用Asia/Seoul替換它,看看會發生什麼。