Usando TimeZone do usuário para apresentar datas em JSF

Precisei mostrar a data de um produto, mas <f:convertDateTime> usa, por padrão o TimeZone UTC.

Há várias formas de ajustar o TimeZone:

  1. Especificar diretamente no <f:convertDateTime> . Ex.:
    <f:convertDateTime locale="en_US" type="both" dateStyle="short" timeZone="EDT" />
  2. Você pode pegar o TimeZone de um Bean com um método:
    public void getTimeZone() {
      return TimeZone.getDefault();
    }
  3. Você pode alterar o parâmetro
    javax.faces.DATETIMECONVERTER_DEFAULT_TIMEZONE_IS_SYSTEM_TIMEZONE
    no web.xml.

Mas não é fácil pegar o TimeZone do usuário.

Fiz o seguinte:

    1. No template.xhtml, adicionei o seguinte código javascript que cria um cookie com o offset de hora:
      <script type="text/javascript">
      var tzo = new Date().getTimezoneOffset();        
      document.cookie = "timezoneOffset=" + escape(tzo * (-1) / 60);
      </script>
    2. Criei um Bean para obter o TimeZone do cookie:
      import java.io.Serializable;
      import java.util.TimeZone;
      
      import javax.enterprise.context.SessionScoped;
      import javax.faces.context.FacesContext;
      import javax.inject.Named;
      import javax.servlet.http.Cookie;
      import javax.servlet.http.HttpServletRequest;
      
      @Named
      @SessionScoped
      public class TimeZoneBean implements Serializable {
      
        private TimeZone timeZone;
      
        public TimeZone getTimeZone() {
          if (timeZone==null) {
            FacesContext facesContext = FacesContext.getCurrentInstance();
            HttpServletRequest request = (HttpServletRequest)
              facesContext.getExternalContext().getRequest();
            for (Cookie c : request.getCookies()) {
              if ("timezoneOffset".equals(c.getName())) {
                String timeZoneOffset = c.getValue();
                if (Integer.parseInt(timeZoneOffset)>0) {
                  timeZoneOffset = "+" + timeZoneOffset;
                }
                timeZone = TimeZone.getTimeZone(
                  "GMT" + timeZoneOffset);
                break;
              }
            }
          }
          return timeZone;
        }
      }
      
    3. O <f:convertDateTime> ficou assim:
      <h:outputText value="#{vendaBean.venda.data}" >
        <f:convertDateTime locale="pt_BR"
            type="both"
            timeZone="#{timeZoneBean.timeZone}"/>
      </h:outputText>
      

Por fim, o resultado na página foi:

10/01/2015 19:22:14
Anúncios
Marcado com: , ,
Publicado em JavaEE

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: