java - 发现 JSTL 时区 (KST) 实现错误

标签 java timezone timezone-offset jstl-functions

当我练习 JSTL timeZone 标记时,我尝试运行这两个操作:

<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 日下午(下午)8 月 03 日 27 日 GMT+09:00

2017 年 8 月 15 日(上午)11 月 03 日 27 日 GMT

我错过了什么或者实现不正确吗? 如果出现错误执行,我应该联系谁?

最佳答案

GMT+09:00 不是时区,而是 UTC offset :与 UTC 的差异(以小时、分钟和秒为单位) 。它仅表示“比 UTC 早 9 小时”,并且不附加任何特定地区或国家。 (不过,大多数系统通常将偏移量视为时区的“特殊类型”,即 make things easier )。

KSTabbreviation for Korea Standard Time ,但不是“真正的”时区。时区名称并未真正标准化,但许多系统使用 IANA timezones names (始终采用地区/城市格式,例如亚洲/首尔欧洲/伦敦)。 系统通常会避免使用短缩写(例如 CSTKST),因为它们是 ambiguous and not standard .

时区亚洲/首尔今天使用KST缩写,但亚洲/平壤过去也使用过这个缩写。不过,它们不是同一个区域。

时区是一个地区在其历史上曾经、现在和将来的所有不同偏移量的集合。今天 Asia/Seoul 使用 +09:00 偏移量,但 Asia/Pyongyang 过去也使用过,因此它们的历史数据不同(这就是为什么它们是不同的区域)。

平壤有+08:30 offset until 1912 ,更改为 +09:00 时。但在 2015 年,它再次更改为 +08:30,并一直沿用至今。

首尔有一个different offset history :过去(20 世纪 50 年代)也使用 +08:30,并采用夏令时(在夏季改为 +09:30),然后在 1961 年更改为 +09:00,有一段时间有夏令时,今天仅使用 +09:00,没有夏令时。

所有这些变化都是由政府和法律定义的,系统无法控制它。仅仅因为时区(区域)今天使用了一些偏移量,就不能保证它会永远使用它。 因此,尽管今天 KST 可以成为 +09:00 的“同义词”,但这并不意味着它会永远如此。


因此,当您使用 GMT+09:00 时,您仅使用偏移量,与特定时区没有任何关联(因为 there are lots of timezones that can use this offset )。

在第二种情况下,日期似乎正在从 KST(偏移量 +09:00)转换为 UTC(偏移量零,或“GMT”) 。请注意,第一种情况是晚上 8 点,偏移量 +09:00,第二种情况是 UTC 上午 11 点(偏移量为零,或“GMT”),这是正确的。

也许 JSTL 无法识别 KST (因为它不明确)并使用 UTC 作为默认值。我尝试将其替换为 Asia/Seoul 并看看会发生什么。

关于java - 发现 JSTL 时区 (KST) 实现错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45691812/

相关文章:

java - 如何从 javafx 中的文本流中删除文本?

java - 如何在java中获取我的机器的IP地址?

Java确保相同的通配符捕获类型

javascript - 检查日期和时间是否需要检查时区?

java - 将 localDate 与 UTC 结合使用

date - Lua - 获取特定时区的时间和日期

java - mockito 单元测试中的 NullPointerException

java - 如何在 JDK 中手动更新时区?

javascript - 如何检查 DST(夏令时)是否有效,如果有效,偏移量?

linux - 如何使用 bash 提取特定日期和时间的 UTC 偏移量?