JSTL和时区

时间:2010-11-04 23:08:17

标签: 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>

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

基本上我需要像

这样的功能
convertToTimezone(date, originalTimeZone, desiredTimeZone). 

fmt:formatDate提供的内容类似于

convertToTimezone(date, serverTimeZone, desiredTimeZone). 

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

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

6 个答案:

答案 0 :(得分:12)

我不明白你的问题。一切正常。您似乎期望new Date()将计算机时间视为GMT,即格林尼治标准时间19:21。这是错的。它根据计算机的时区计算真实的 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

答案 1 :(得分:2)

Java假设您的时间是GMT + 4,因为您的系统时间是GMT + 4。

答案 2 :(得分:2)

尝试:

<fmt:setTimeZone value="Europe/London" scope="session"/>

答案 3 :(得分:2)

您需要使用国际时间(UTC / Zulu)添加以下计划客户端时间使用,例如“GMT + 1”。见这个例子。

将此参数作为参数放在服务器中以设置UTC时间使用,在本例中为tomcat:

<强> -Duser.timezone = “UTC”

/* Java */      

@RequestMapping(value = "/web", method = { RequestMethod.POST, RequestMethod.GET })
public String web(Model model, HttpSession session, Locale locale) {

    Date today = new Date();
    model.addAttribute("currentTime", today);
    model.addAttribute("timezone", "GMT+1");

    return "web";
}

要显示日期,请选择所需的图案(属性)

/* JSP web */

<fmt:timeZone value="${timezone}">
<spring:message code="date_format_dateMin" var="pattern"/>
<fmt:formatDate value="${currentTime}" timeZone="${timezone}" pattern="${pattern}" var="searchFormated" />
<span class="innerLabel">${searchFormated}</span>   
</fmt:timeZone>

/* Properties */

date_format_dateMin=yyyy/MM/dd HH:mm
date_format=yyyy/MM/dd HH:mm:ss    
date_format2=yyyy/MM/dd
date_format3_js=yy/mm/dd
date_format4_time=HH:mm
date_format4=dd/MM/yyyy HH:mm:ss

答案 4 :(得分:2)

要转换UTC时间,请使用此功能:

 public Date getUTCDateFromString(String fecha, Locale yourLocale) {
    SimpleDateFormat simpleDateFormat = new 
    SimpleDateFormat("yyyy-MM-dd HH:mm:ss", yourLocale);
    TimeZone utcZone = TimeZone.getTimeZone("UTC");
    simpleDateFormat.setTimeZone(utcZone);
    Date date = null;
    try {
        date = simpleDateFormat.parse(fecha);
    } catch (ParseException e) {
        e.printStackTrace();
    }
    return date;
    }

答案 5 :(得分:0)

<c:when test="${currentField eq 'dateline'}">
  <c:set target="${storyContent}" property="publishedDate">
  <fmt:formatDate value="${article.publishedDateAsDate}" timeZone="Asia/Dacca"       pattern="${storyContent.dateFormat}"/>
  </c:set>

我一直在搞这个问题3天。

首先就是这样 -

<fmt:formatDate value="${article.publishedDateAsDate}" pattern="${storyContent.dateFormat}"/>

以服务器时间UTC + 00小时显示日期。

我想在达卡时间展示它,保持服务器时间不变。 添加它解决了问题 -

  

的timeZone = “亚洲/达卡”

您可以在http://joda-time.sourceforge.net/timezones.html

找到所有Java时区详细信息