JSTL和时区

Rom*_*nko 3 java jsp jstl

我对时区有一些疑问.我们以UTC时间存储所有日期,但我们需要在本地(美国东部)时间和UTC同时显示其中一些日期.

这是我的测试,我有UTC的日期,并希望以UTC和当地时间显示它:

<html>
<!-- let's assume this date is in UTC, I get it from Database in my code -->
<jsp:useBean id="dateValue" class="java.util.Date" />

GMT
<fmt:formatDate value="${dateValue}" pattern="yyyy-MM-dd HH:mm:ss z" timeZone="GMT"/>
</html>
<!-- Displays the original time +4  - not what I need-->

No time zone
<fmt:formatDate value="${dateValue}" pattern="yyyy-MM-dd HH:mm:ss z"/> 
<!-- Displays the original time, but timezone is EDT -->

US/Eastern
<fmt:formatDate value="${dateValue}" pattern="yyyy-MM-dd HH:mm:ss z" timeZone="US/Eastern"/> 
<!-- Displays the original time, timezone is EDT, I need original + 4 -->

</html>
Run Code Online (Sandbox Code Playgroud)

重申一下:我有一个来自数据库的UTC时间,并希望对其进行格式化并以UTC时区显示.服务器以UTC之外的其他时区运行.

基本上我需要一个像这样的功能

convertToTimezone(date, originalTimeZone, desiredTimeZone). 
Run Code Online (Sandbox Code Playgroud)

fmt:formatDate提供的是什么

convertToTimezone(date, serverTimeZone, desiredTimeZone). 
Run Code Online (Sandbox Code Playgroud)

我可以破解它,但这通常会在有白天时间节省时引起问题等.

PS对于那些寻找答案的人 - 要做的一件事就是以UTC运行服务器,那么转换就可以了.如果不能改变它,唯一的方法是用UTC时区创建新的日期,明确地做,我自己转换我的文本时间,然后创建一个新的日期并提供文本和UTC时区.如果不这样做,则从服务器读取时区.

Bal*_*usC 12

我不明白你的问题.一切正常.您似乎期望new Date()将计算机时间视为GMT,即格林尼治标准时间19:21.这是错的.它根据计算机的时区计算实际 GMT时间.这fmt:setTimeZone不会改变计算机的时区,也不会改变计算机的结果new Date().在fmt:setTimeZone刚刚设置这些都是通过格式化所有日期的默认时区fmt:formatDate.仅当计算机的时区不是GMT时才强制执行此操作.

删除fmt:setTimeZone,您将看到日期(错误地)关闭4小时.然后使用-Duser.timezone=UTC(以覆盖计算机的时区作为默认值)启动服务器,您将再次看到它是正确的.还可以尝试使用DB中的实际日期而不是new Date().

无论如何,在UTC以外的时区运行服务器是一种不好的做法.它只会导致所有颜色的麻烦.我强烈建议以UTC格式运行服务器.如果由于某种原因不想更改计算机的时区,则可以通过添加-Duser.timezone=UTC到服务器的VM参数来实现.始终使用UTC 并仅在您将时区显示给最终用户时应用时区.另请参阅DST和时区最佳实践.