gpt4 book ai didi

java - JSTL 和时区

转载 作者:搜寻专家 更新时间:2023-11-01 04:00:20 24 4
gpt4 key购买 nike

我有一些关于时区的问题。我们以 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>

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

基本上我需要一个像

这样的函数
convertToTimezone(date, originalTimeZone, desiredTimeZone). 

fmt:formatDate 提供的是类似

convertToTimezone(date, serverTimeZone, desiredTimeZone). 

我可以破解它,但是在夏令时等情况下,这通常会导致问题。

附言对于那些寻找答案的人来说——要做的一件事就是在 UTC 中运行你的服务器,然后转换就可以正常工作了。如果不能改变它,唯一的办法就是用 UTC 时区创建新日期,明确地做,我自己将我必须的时间转换为文本,然后创建一个新日期并提供文本中的数据和UTC 时区。如果您不这样做,则会从服务器读取时区。

最佳答案

我不明白你的问题。一切正常。您似乎期望 new Date() 会将计算机时间视为 GMT,即 19:21 GMT。这是错误的。它根据计算机的时区计算真实 GMT 时间。 fmt:setTimeZone 不会更改计算机的时区,也不会更改 new Date() 的结果。 fmt:setTimeZone 只是设置所有日期的默认时区,这些日期将由 fmt:formatDate 格式化。只有当计算机的时区不是 GMT 时,这才是强制性的。

删除 fmt:setTimeZone,您会看到日期(错误地)偏移了 4 小时。然后使用 -Duser.timezone=UTC 启动服务器(覆盖计算机的默认时区),您会再次看到它是正确的。也可以尝试使用数据库中的真实日期而不是 new Date()

无论如何,在 UTC 以外的时区运行服务器是一种不好的做法。只会招来各种颜色的麻烦。我强烈建议在 UTC 中运行服务器。如果出于某种原因不想更改机器的时区,则可以通过将 -Duser.timezone=UTC 添加到服务器的 VM 参数来实现。 始终使用 UTC 并仅在您向最终用户显示时应用时区。另见 DST and Timezone best practices .

关于java - JSTL 和时区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4102223/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com