Javascript 如何可靠地确定时区

Javascript 如何可靠地确定时区,javascript,jsf,timezone,Javascript,Jsf,Timezone,我需要用JavaScript可靠地确定用户的时区。大多数的用户群将在低带宽和旧浏览器上,所以我必须保持向后兼容性,并将数据传输保持在最低限度。理想情况下,我希望只在会话开始时获取用户的时区(我使用CAS进行登录,所以并没有登录页面),然后将其发送回服务器,在那个里我可以将其存储在数据库中。我查看了jsTimezoneDetect库以及各种地理位置API(通过用户的IP检索位置/时区),但每种API都有其缺点: jsTimezoneDetect不大,但我不希望在我的所有页面上都包含5K额外的JS代

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

  • jsTimezoneDetect不大,但我不希望在我的所有页面上都包含5K额外的JS代码(没有单一登录页面!)
  • 地理定位API(如IPInfoDB)引入了对外部服务的依赖性,速度可能较慢,并且不能始终保证结果

  • 在使用最小带宽和浏览器资源的情况下,可靠、高效地确定用户时区并将其发送回我的JSF应用程序的最简单方法是什么?

    阅读评论后,我总结了以下代码:

    <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>  
    

    其中EL_时区_标志是会话作用域EL表达式。上述方法确保我在用户上设置了时区,每个会话只执行一次,并且每个会话只加载一次额外的JS代码

    Re 1:注意,它将被缓存,因此客户端或服务器在每个页面中都没有网络开销,只有客户端的JS开销。我不知道如何在不牺牲准确性的情况下比jsTimezoneDetect做得更好。这不是JSF的问题。这只是一个JS问题。在这个问题的上下文中,JSF“只是”一个HTML/CSS/JS代码生成器。当使用不同的服务器端语言或框架生成相同类型的HTML/CSS/JS时,您仍然会遇到完全相同的问题,如Spring MVC、PHP、ASP.NET-MVC等。您是否查看了这些以确定时区?
    var timezoneOffset=(new Date()).getTimezoneOffset()返回UTC时间和本地时间之间的时差,单位为分钟。我会建议相同的解决方案
    
    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();
        }