如何可靠地确定时区

时间:2013-02-19 17:29:13

标签: javascript jsf timezone

我需要在JavaScript中可靠地确定用户的时区。大多数用户群将使用低带宽和低带宽。旧的浏览器,所以我必须保持向后兼容性,并将数据传输保持在最低限度。理想情况下,我只想在会话开始时获取用户的时区(我使用CAS进行登录,因此没有登录页面),然后将其发送回服务器,我将能够将其存储在数据库中。我查看了jsTimezoneDetect库以及各种地理定位API(按用户的IP检索位置/时区)但每个都有它的缺点:

  1. jsTimezoneDetect不大,但我不想在我的所有页面上都包含5K额外的JS代码(没有单一的登录页面!)
  2. 地理位置API(例如IPInfoDB)引入了对外部服务的依赖,可能很慢,并不总能保证我的结果
  3. 可靠有效地确定用户时区的最简单方法是什么,并在使用最小带宽和浏览器资源的同时将其发送回我的JSF应用程序?

1 个答案:

答案 0 :(得分:0)

阅读完评论后,我最终得到了以下代码:

<h:panelGroup layout="block" rendered="#{!applicationBean.timeZoneSet}">
    <h:outputScript name="timezone.js" library="js"></h:outputScript>
    <h:form style="display:none;">
        <p:inputText value="#{applicationBean.currentTimeZone}" widgetVar="wTZ" style="display:none;"></p:inputText>
        <p:remoteCommand autoRun="true" name="setTZ" onstart="var tzone=jstz.determine();wTZ.getJQ().val(tzone.name())" process="@form"></p:remoteCommand>
    </h:form>
</h:panelGroup>  

支持bean:

public boolean isTimeZoneSet() {
    return getELValue(EL_TIMEZONE_FLAG, Boolean.class);
}

public void setTimeZoneSet(boolean val) {
    setELValue(EL_TIMEZONE_FLAG, val);
}

@Transactional(propagation=Propagation.REQUIRES_NEW)
public void setCurrentTimeZone(String val) {
    User _user = getCurrentUser();
    _user.setTimeZone(val);
    _usersDAO.merge(_user);
    setTimeZoneSet(true);
}

@Transactional(propagation=Propagation.REQUIRES_NEW)
public String getCurrentTimeZone() {
 User _user = getCurrentUser();
     return _user.getTimeZone();
    }

其中EL_TIMEZONE_FLAG是会话范围的EL表达式。上面的方法确保我在User上设置了一个时区,每个会话只执行一次,并且每个会话只加载一次额外的JS代码