0

我在会话范围内有一个对象formatobject,它具有基于模式“dd.MM.yyyy HH:mm:ss”的 SimpleDateFormat sdf 类型的成员。

我想使用 JSTL 格式化标签库来格式化我的输出:

<fmt:formatDate value="${dataobject.date}" pattern="${formatobject.sdf}"/>

这给了我以下例外:

org.apache.jasper.JasperException: java.lang.IllegalArgumentException: Illegal pattern character 'j'

当我尝试以下操作时,它按预期工作:

<fmt:formatDate value="${dataobject.date} pattern="dd.MM.yyyy HH:mm:ss"/>

令人困惑......你有什么想法吗?

4

1 回答 1

2

pattern属性必须引用表示模式的a,而不是围绕模式构建String的具体实例。SimpleDateFormat


与具体问题无关SimpleDateFormat,它不是线程安全的,但您的尝试意味着它是在构造函数中创建formatobject并在会话/应用程序范围内重用。这个不对。SimpleDateFormat必须在线程本地基础上(即在方法块内)声明和创建。模式是唯一可以是常数的部分。

所以,总而言之,这是正确的:

public class Formatter {

    private static final String PATTERN = "dd.MM.yyyy HH:mm:ss";

    public String format(Date date) { // Just an example. No idea how you're further using it.
        return new SimpleDateFormat(PATTERN).format(date); // Always create SimpleDateFormat in method local scope. Never create it as instance variable.
    }

    public String getPattern() {
        return PATTERN;
    }

}

<fmt:formatDate ... pattern="#{formatter.pattern}" />
于 2013-05-21T16:13:27.773 回答