【发布时间】:2013-07-03 07:36:59
【问题描述】:
我的页面中有下一个数据表:
<t:dataTable value="#{bean.listOfPersons}" var="current">
<t:column>
<t:outputText value="#{current.birthdate}">
<f:converter pattern="dd/mm/yyyy HH:mm" type="date"/>
</t:outputText>
</t:column>
</t:dataTable>
Person 是我创建的一个对象,它的一个属性是生日。
现在我想在这个<t:dateTable> 中显示很多人的详细信息,包括生日。如您所见,我选择以dd/mm/yyyy HH:mm 模式显示生日,因此如果知道时间,我可以看到时间。现在,问题是一些生日没有时间(只有日期),当java.util.Date 中的时间是null 时,时间自动为00:00。如果时间未知(仅日期)如何以短模式显示出生日期,而当我知道时间(日期和时间)时如何显示常规模式?
现在发生了什么:
17/3/1994 5:56
1/1/1991 00:00
12/2/1990 17:53
21/12/2012 00:00
我想看的:
17/3/1994 5:56
1/1/1991
12/2/1990 17:53
21/12/2012
时间未知时的短模式。
这是我在page.xhtml中写的:
<t:outputText value="#{bean.date}">
<f:converter convertetId="myconverter" pattern="[some pattern]" timeZone="America/Chicago" type="date">
</t:outputText>
这是转换器:
public class MyConverter extends DateTimeConverter
{
@Override
public String getAsString (FacesContext faces, UIComponent comp, Object obj)
{
this.setTimeZone(null);
String result = super.getAsString(faces, comp, obj);
// My converter here...
return result;
}
@Override
public void setTimeZone(TimeZone tz)
{
// Always setting my own time zone, no matter what.
super.setTimeZone(TimeZone.getTimeZone("America/Chicago"));
}
}
现在,如您所见,我自己总是将时区设置为 getAsString,因为
不知何故,现在 f:converter 无法识别它的属性...知道为什么吗?
【问题讨论】:
-
刚读完。我认为您需要实现一个自定义转换器。我没有过多地使用 Java 日期,所以我不确定是否有一种模式已经可以处理您的场景。我要去睡觉了(现在是凌晨 4 点),所以如果没有人回答你,我会告诉你怎么做。不过,您应该尽快得到答案,这是一个简单的问题……然后我又知道要做出仓促的判断,所以我可能错了哈哈。
-
current.birthdate的数据类型是什么?
-
正如安迪所说,使用自定义转换器是一个不错的选择(而且我认为是最好的)。另一个丑陋的解决方案是从您的 Person 对象中获取模式:
<f:converter pattern="#{current.birthdayPattern}" type="date"/>并在getBirthdayPattern中测试日期值 -
谢谢,安迪和拉比迪。看来我必须做一个服装转换器,但我不知道该怎么做。 Laabidi,我想按照您的建议做类似的解决方案:创建一个仅用于显示的
getter,如果我有时间,我会执行检查,并将日期作为具有合适模式的字符串返回。但是将来我会有很多带有日期的对象,我不想在每个对象中都做这个丑陋的解决方案。所以......我怎样才能创建一个自定义转换器?谢谢。 :) -
erencan,
current.birthdate是一个java.util.Date,是我在Person中创建的一个属性(即current)。