Как работать с клиентской таймзоной на сервере?

263
04 ноября 2017, 12:35

Мне нужно получить таймзону клиента, для того, чтобы передать её в параметр компонента на странице. Страница работает с бином, из которого получает данные с помощью EL-выражений. Как получить таймзону сервера, я знаю:

TimeZone.getDefault()

Как получить таймзону на клиенте (мне нужен ID таймзоны) тоже:

new Date().toTimeString().split('(')[1].toString().replace(')','');

Но вот как мне передать значение ID таймзоны клиента в бин (или, может, получить сразу в бине), или сразу в value компонента я не знаю. Подскажите какие-нибудь варианты, плиз.

Answer 1

Как вы уже поняли на клиенте вы можете получить зону из времени, поэтому можно сделать скрытое поле в которое с помошью js установить текущее время и передать значение этого поля на сервер с помощью ajax или когда отправляете форму. На сервере парсите дату, получаете зону ну и делаете что хотите. Если заморачиваетесь с различными зонами то советую на сервере и в базе даынных хранить все в UTC.

Вот примерчик нашел с использованием PrimeFaces

<h:body style="margin-left:50px">
<h2>PrimeFaces RemoteCommand Example</h2>
<h:form>
    <p:remoteCommand name="updateTz" update="tz" actionListener="#{timeZoneBean.updateClientTz}"/>
    Client time zone offset:
    <b>
        <h:outputText id="tz" value="#{timeZoneBean.clientTzOffset}"/>
    </b>
</h:form>
<script type="text/javascript">
$(document).ready(function() {
    var date = new Date();
    var offSetVal = date.getTimezoneOffset();
    updateTz([{name:'offset',value:-offSetVal/60}]);
   });
</script>
</h:body>
@ManagedBean
@RequestScoped
public class TimeZoneBean {
  @ManagedProperty("#{param.offset}")
  private String timeZoneOffset;
  private String clientTzOffset = "";
  public void updateClientTz() {
      Locale locale = FacesContext.getCurrentInstance()
                                  .getExternalContext()
                                  .getRequestLocale();
      if (timeZoneOffset != null && locale != null) {
          ZoneOffset offset = ZoneOffset.of(timeZoneOffset);
          clientTzOffset = offset.getDisplayName(TextStyle.FULL, locale);
      }
  }
  public String getClientTzOffset() {
      return clientTzOffset;
  }
  public void setTimeZoneOffset(String timeZoneOffset) {
      this.timeZoneOffset = timeZoneOffset;
  }
}
READ ALSO
Как просканировать JTextField&amp;?

Как просканировать JTextField&?

Используйте метод textFieldgetText()

247
Data truncation: Incorrect datetime value:

Data truncation: Incorrect datetime value:

Коллеги, подскажите: имеется строка с датой вида: Fri Oct 06 15:54:33 MSK 2017 пытаюсь её превратить в javasql

270
Почему не работает replaceAll

Почему не работает replaceAll

Есть вот такая строчка

235