我需要在JavaScript中可靠地确定用户的时区。大多数用户群将使用低带宽和低带宽。旧的浏览器,所以我必须保持向后兼容性,并将数据传输保持在最低限度。理想情况下,我只想在会话开始时获取用户的时区(我使用CAS进行登录,因此没有登录页面),然后将其发送回服务器,我将能够将其存储在数据库中。我查看了jsTimezoneDetect库以及各种地理定位API(按用户的IP检索位置/时区)但每个都有它的缺点:
可靠有效地确定用户时区的最简单方法是什么,并在使用最小带宽和浏览器资源的同时将其发送回我的JSF应用程序?
答案 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代码