【问题标题】:Set a default time zone for f:convertDateTime为 f:convertDateTime 设置默认时区
【发布时间】:2011-11-21 09:37:53
【问题描述】:

我使用 JSF1.2,但时区有点问题。

日历尊重我的时区并在数据库中保存正确的时间。当我使用带有 f:convertDateTime 的 h:outputtext 显示它时,它显示了错误的日期(我认为是默认时区)。

我可以这样做:

<h:outputText value="#{atividade.atividade.dataCriacao.time}">
  <f:convertDateTime pattern="#{msg.formatoDataCalendario2}" timeZone="America/Sao_Paulo" />
</h:outputText>

formatoDataCalendario2 = dd/MM/yyyy, HH:mm in messages.properties。

我也可以将时区放入消息中,但我相信它有一些我可以使用的配置。

【问题讨论】:

    标签: jsf timezone


    【解决方案1】:

    我有这样的场景。在我使用的 JSF 应用程序中,@BalusC 指出:

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

    ,我在 xhtml 里有:

    <f:convertDateTime pattern="dd MMM yyyy - HH:mm:ss" type="date" />
    

    但是,当我收到 2020-02-18T10:15:20 之类的日期/时间时,它会转换为 GMT 时间(在 PST 区域对我来说是 8 小时)。所以,它最终会是2020-02-18T02:15:20。这是因为 convertDateTime 默认将没有时区偏移的日期/时间视为 GMT 时间,因此将其转换为 GMT 时间。

    一旦我像2020-02-18T10:15:20-07:00 一样开始接收偏移量,我的日期/时间将不再转换为 GMT,因为它会识别出偏移量与 PST 区域偏移量匹配,因此不会转换为 GMT。

    希望能有所帮助。

    【讨论】:

      【解决方案2】:

      JSF 日期/时间转换器按规范默认为 UTC 时区。如果你想使用不同的时区,那么你真的需要自己在转换器中指定它。或者,如果您对生产运行时环境有 100% 的控制权,那么从 JSF 2.0 开始,您可以将其系统时区设置为所需的时区,并将以下上下文参数添加到 web.xml

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

      这样JSF会使用TimeZone#getDefault()获取的系统时区作为转换器的默认时区。

      请注意,java.util.Date 对象本身也存储任何时区信息。它也始终默认为 UTC 时区。在处理提交的日期/时间时请记住这一点。

      另见:

      【讨论】:

      • 那行得通,但是,如果我想强制某个时区,例如 America/Sao_Paulo?
      • 我的回答中没有提到其他简单的方法。但是,您可以创建一个扩展/包装 f:dataTimeConverter 的自定义标签或创建一个自定义转换器。
      • Caarlos 写道,他正在使用 JSF 1.2。据我所知 javax.faces.DATETIMECONVERTER_DEFAULT_TIMEZONE_IS_SYSTEM_TIMEZONE 从 JSF 2.0 开始工作。这个解决方案对 JSF 1.2 真的有效吗?谢谢@BalusC。
      • @Infragile:嗯,我一定忽略了问题中的这个陈述:o 它确实是 JSF 2.x 特定的。对于 JSF 1.x,您需要在每个 &lt;f:convertDateTime&gt; 标记中显式指定 timeZone 属性,或者扩展 DateTimeConverter 类并将其用作 &lt;f:converter&gt;
      • 为什么哦为什么?默认时区为 UTC 有什么可能的用途?感谢您的回答。
      【解决方案3】:

      为了正确显示日期,您只需在 web.xml 中进行修改

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

      在你的 xhtml 文件中

      <h:outputText value="#{report.date}">
          <f:convertDateTime pattern="dd-MMM-yyyy" />
      </h:outputText>
      

      这是一个时区问题。上下文参数应该修复它。

      【讨论】:

      • 你为什么要重复一个已经给出的答案?这是一个问答网站,而不是一个老式的论坛,每个人都在确认后互相重复。如果您同意,请点赞该帖子。
      猜你喜欢
      • 2011-07-01
      • 2012-12-21
      • 2015-07-01
      • 1970-01-01
      • 2012-03-29
      • 2020-07-08
      • 2018-05-23
      • 2018-07-21
      相关资源
      最近更新 更多