【问题标题】:f:convertDateTime displays wrong Date [duplicate]f:convertDateTime 显示错误的日期 [重复]
【发布时间】:2011-02-10 23:12:37
【问题描述】:

在我的 Web 应用程序中,我使用 Hibernate 检索数据并将其显示在 RichFaces 数据表中。

在我的 MySQL 表中有一个“日期”类型的字段。当我将此字段打印到我的 Bean 中的日志时,它会显示数据库中的正确日期(例如 2010-04-21)。但在 rich:dataTable 中显示如下:

2010 年 4 月 20 日

所以有 1 天的差异!

我添加了“f:convertDateTime”转换器并将“type”属性设置为“both”以便也显示时间。所以现在它显示:

2010 年 4 月 20 日晚上 10:00:00

我使用过的“f:convertDateTime”代码:

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

所以 f:convertDateTime 似乎做了一些梦,因为 MySQL 表字段中没有时间信息!

我做错了什么?我需要做什么才能显示正确的日期?

谢谢汤姆

【问题讨论】:

    标签: java hibernate jsf richfaces jsf-2


    【解决方案1】:

    对于日期/时间转换器,JSF 默认为 UTC 时区。要覆盖它,您需要在每个日期/时间转换器中设置 timeZone 属性。这是一个使用 EDT 时区的示例(假设您在美国东部)。

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

    locale 属性仅控制完整的日/月名称格式(变为英文)。

    如果你想覆盖默认的UTC时区作为操作平台的默认时区,那么你需要在web.xml中添加以下上下文参数:

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

    那么您不需要编辑每个单独的 JSF &lt;f:convertXxx&gt; 标签。

    【讨论】:

    • 上下文参数在 JSF 2.0 之前不起作用,是吗?相关文章:planet.jboss.org/post/step_right_up_and_select_your_time_zone
    • @Mulmoth:没错,但这绝对不会对 OP 造成问题,因为问题标签暗示他/她已经在使用 JSF 2.0。
    • 你说得对,我没看到标签。
    • 也为我工作。我不是 OP 但同样的问题和 JSF2 。只能 +1 :( BalusC
    • @Java:很好:) 不客气。
    【解决方案2】:

    根据 JSF 规范,f:convertDateTime 默认为 UTC 时区(无论任何 VM 时区设置如何),它与您的时区相差 -1 小时(标准时间)或 -2 小时(夏令时)。

    我们使用具有 timeZone 属性的应用程序范围的页面 bean,如下所示:

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

    然后我们在 EL 表达式中使用该属性:

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

    优点是它会自动考虑标准/夏令时间。

    【讨论】:

    • +1,类似的方式可以为不同时区的用户显示当地时间
    【解决方案3】:

    您的时区可能有问题。

    Check this article 了解如何解决它们。

    在此之前,可以尝试显式设置&lt;f:convertDataTime&gt;timeZone属性

    【讨论】:

    • 我尝试设置 的 timeZone 属性,但现在时间显示为晚上 11 点(因为我的时区是 GMT+1)。似乎 将我的时间默认为 UTC 时间晚上 10 点。
    • 您是否尝试过其他选项?
    • 是的。我已经在 ServletContextListener 中设置了时区,但结果(当然)是相同的。核心问题是 将时间值发明为我的日期值(只有一个日期,没有时间)。但是,我目前使用的解决方法是将时区设置为 GMT+2,以便输出为 4/21/10 00:00:00 而不是 4/20/10 22:00:00。但这不是一个理想的解决方案:)
    • 好吧,如果您存储日期并想显示时间,那么它就没有相关性。
    • 是的,我只想查看日期(例如,数据库字段包含 4/22/10)!但是 然后显示 4/21/10(减去一天)。因此,为了调查这个问题,我将 display-attribute 更改为 并且瞧 假装它是晚上 22:00:00 ......这就是问题
    【解决方案4】:

    我们遇到了同样的问题,最终编写了一个新的 JSF 转换器,该转换器使用使用 new SimpleDateFormat(String pattern) 创建的 SimpleDateFormat 进行日期转换。

    【讨论】:

      【解决方案5】:
      <h:outputText id="dateId" value="#{item.date}">
       <f:convertDateTime for="dateId" type="date" dateStyle="long" locale="pl"/>   </h:outputText>
      

      【讨论】:

        猜你喜欢
        • 2013-02-28
        • 2013-08-03
        • 2014-06-27
        • 1970-01-01
        • 2017-03-13
        • 2019-06-30
        • 2018-07-09
        • 2014-08-05
        相关资源
        最近更新 更多