【问题标题】:fmt:formatDate not working as expectedfmt:formatDate 没有按预期工作
【发布时间】:2011-05-31 13:24:09
【问题描述】:

我正在尝试将我在我的 jsp 中获取的 java.util.Date 对象格式化为“yyyy-MM-dd hh:mm:ss”的模式,但它仍然以不同的方式打印它(默认可能)格式。

我已使用此语句包含标签库 -

<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>

我正在使用以下代码行将其打印为表格单元格中的值 -

<td><fmt:formatDate pattern="yyyy-MM-dd hh:mm:ss" value="${proposal.creationDate}"/></td>

但它仍然打印如下 -

Wed May 24 00:00:00 IST 3911

有人可以建议,我可能做错了什么。

【问题讨论】:

  • 尝试添加type="date"作为属性

标签: jsp jstl


【解决方案1】:

我遇到了同样的问题。在尝试格式化日期之前,我可以通过设置语言环境来修复它:

<fmt:setLocale value="en_US" />
<fmt:formatDate value="${now}" pattern="yyyy-MM-dd" />

这解决了问题,但我不知道为什么。

【讨论】:

  • 自从我发布了这个,我就明白了为什么它有效。如果语言环境为 NULL,则格式操作(fmt:formatDate 和 fmt:formatNumber)默认使用 .toString(),即使显式格式没有依赖于语言环境的转换。根据您的应用服务器的设置,可能没有默认语言环境,将其保留为 NULL。
  • fmt:setLocale 标记的替代方法是使用 javax.servlet.jsp.jstl.core.Config.set(request, Config.FMT_LOCALE, new Locale("en ", "美国"));
  • 我遇到了同样的问题。该标记试图找到一个语言环境,最终到达请求,它会在accept-language 请求标头中查找备用语言环境值。由于只有少数请求标头被列入白名单,因此失败导致使用 .toString()。值得对 FormatDateSupport 进行调试,看看它如何在格式化时尝试找到要使用的语言环境!
【解决方案2】:

${proposal.creationDate}实际上返回一个String而不是一个完整的Date时,就会发生这种情况。相应地修复它。

private Date creationDate;

public Date getCreationDate() {
    return creationDate;
}

如果你真的因为一些不明显的原因不能改变类型,那么你需要先通过&lt;fmt:parseDate&gt;来解析它。

<fmt:parseDate var="realCreationDate" value="${proposal.creationDate}" pattern="EEE MMM dd HH:mm:ss z yyyy" locale="en" />
<fmt:formatDate value="${realCreationDate}" pattern="yyyy-MM-dd HH:mm:ss" />

但这很简单。


与问题无关,小时数将由HH 而非hh 表示。另见SimpleDateFormat javadoc。打印输出中的 3911 年而不是 2011 年也表明您已使用 deprecated Date 构造函数/方法来创建它。

【讨论】:

  • type 是 java.util.Date,因为当我尝试打印 $(proposal.creationDate.class} 时,它会给出 Date。另外,我的 bean 的 getter 也会返回一个 Date。
  • 好吧,显然您没有运行您认为正在运行的 JSP/JSTL 代码。重建/重新部署/重新启动。如有必要,只需使用 &lt;%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %&gt;&lt;jsp:useBean id="now" class="java.util.Date" /&gt;&lt;fmt:formatDate value="${now}" pattern="MM/dd/yyyy HH:mm:ss" /&gt; 创建一个简约的 JSP 文件
  • 我们使用的是 2.4 版的 web-app,这和它有什么关系吗?
  • Servlet 2.4 需要 JSTL 1.1(存在 2 个文件),而不是 JSTL 1.2(存在 1 个文件)。另请参阅我们的 JSTL wiki stackoverflow.com/tags/jstl/info。无论如何,极简测试 JSP 是否有效?只需将先前评论中的代码粘贴到 test.jsp 中并运行它。
  • 不幸的是,即使返回 - “Tue May 31 20:11:51 IST 2011”
猜你喜欢
  • 2021-10-19
  • 2020-03-18
  • 2012-06-14
  • 2014-11-15
  • 1970-01-01
  • 2012-07-02
  • 2011-09-07
  • 2013-03-03
  • 2015-05-18
相关资源
最近更新 更多