f:convertDateTime displays wrong Date [duplicate]

2019-01-10 12:44发布

This question already has an answer here:

In my Web Application I retrieve data using Hibernate and display it in a RichFaces dataTable.

In my MySQL-table there is a field of type "date". When I print this field to the log in my Bean, it shows the correct date from database (e.g. 2010-04-21). But in the rich:dataTable it shows up like this:

4/20/10

So there is a discrepancy of 1 day!

I added the "f:convertDateTime" converter and set the "type" attribute to "both" in order to display time too. So now it shows:

4/20/10 10:00:00 PM

The Code for "f:convertDateTime" I've used:

<f:convertDateTime locale="locale.US" type="both" dateStyle="short"/>

So it seems like f:convertDateTime dreams up some time because there is no time information in the MySQL-table field!

What am I doing wrong? What do I need to do to display the correct date?

Thanks Tom

5条回答
爷的心禁止访问
2楼-- · 2019-01-10 12:49
<h:outputText id="dateId" value="#{item.date}">
 <f:convertDateTime for="dateId" type="date" dateStyle="long" locale="pl"/>   </h:outputText>
查看更多
forever°为你锁心
3楼-- · 2019-01-10 13:05

JSF defaults to UTC timezone for date/time converters. To override this you need to set the timeZone attribute in every date/time converter. Here's an example using EDT timezone (assuming you're on the east of US).

<f:convertDateTime locale="en_US" type="both" dateStyle="short" timeZone="EDT" />

The locale attribute only controls the full day/month name formatting (it becomes English).

If you want to override the default UTC timezone to be the operating platform default timezone, then you need to add the following context param to web.xml:

<context-param>
    <param-name>javax.faces.DATETIMECONVERTER_DEFAULT_TIMEZONE_IS_SYSTEM_TIMEZONE</param-name>
    <param-value>true</param-value>
</context-param>

Then you don't need to edit every individual JSF <f:convertXxx> tag.

查看更多
▲ chillily
4楼-- · 2019-01-10 13:08

According to the JSF specs, f:convertDateTime defaults to UTC timezone (regardless of any VM timezone setting), which differs from your timezone by -1 hour (standard time) or -2 hours (summer time).

We use a application scoped page bean with an timeZone property like this:

public TimeZone getTimeZone() {
    return TimeZone.getDefault();
}

Then we use the property in an EL expression:

<ice:outputText value="#{deliveryDate}">
    <f:convertDateTime type="both" timeZone="#{Application.timeZone}" />
</ice:outputText>

The advantage is that it's considering standard/summer time automatically.

查看更多
5楼-- · 2019-01-10 13:09

You are probably having issues with the Time zones.

Check this article on how to resolve them.

Before that, you can try explicitly setting the timeZone attribute of <f:convertDataTime>

查看更多
我想做一个坏孩纸
6楼-- · 2019-01-10 13:11

We had the same problem and ended up with writing a new JSF converter that uses a SimpleDateFormat created with new SimpleDateFormat(String pattern) for the date conversion.

查看更多
登录 后发表回答