我对时区有一些疑问。我们以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时区。如果不这样做,则从服务器读取时区。
答案 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小时显示日期。
我想在达卡时间展示它,保持服务器时间不变。 添加它解决了问题 -
找到所有Java时区详细信息的timeZone = “亚洲/达卡”