如何在Tomcat中为单个Web应用程序设置时区?

sk.*_*sk. 15 java configuration timezone tomcat

在Tomcat中为单个Web应用程序设置时区的最佳方法是什么?我已经看到了更改Tomcat的命令行参数或环境变量的选项,但是有没有办法在WAR文件中设置它自包含而不依赖于任何Tomcat配置?

编辑:要重新强调,我正在寻找一个可以包含在WAR文件中的解决方案,而不依赖于Tomcat配置.换句话说,一个Web应用程序是否可以配置为具有与在同一Tomcat实例中运行的其他应用程序不同的时区?

Ste*_*n C 8

编辑:我错了.此编辑可以纠正它.

答案是,你不能可移植性设置(默认设置)时区为一个单一的Web应用程序.但是如果您使用Java 6(至少),java.util.TimeZone该类将实现默认的时区方法getDefault(),setDefault()setDefault(TimeZone)使用可继承的本地线程.换句话说,调用setDefault()仅影响当前线程和将来的子线程.

Sun Javadocs中未记录该行为.它适用于Java 6和5(见上文),但不保证它可以在较旧或较新的Sun JRE中使用.但是,如果Sun决定更改/恢复为默认TimeZone的"全局"模型,我会非常惊讶.它会打破太多现有的应用程序,除了全局变量是坏的.


ZZ *_*der 8

我找到的唯一方法是设置过滤器并更改过滤器中的时区,

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
        throws IOException, ServletException {
    TimeZone savedZone = TimeZone.getDefault();
    TimeZone.setDefault(webappZone);
    chain.doFilter(request, response);
    TimeZone.setDefault(savedZone);
}
Run Code Online (Sandbox Code Playgroud)

setDefault()变化对螺纹的区域.因此,在过滤器内的线程中运行的所有内容都将具有不同的默认时区.我们必须将其更改回来,因为该线程由其他应用程序共享.您还需要为你做同样的init(),destroy()方法,你可能会在应用程序启动任何其他线程.

我不得不这样做,因为第三方库假设默认时区,我们没有源代码.这是一团糟,因为这会更改日志时区,但我们不希望在不同的时间登录.处理此问题的正确方法是在向最终用户公开的任何时间值中使用特定时区.

  • 你应该使用try-finally.注意,在处理期间创建的任何线程都将继承当时设置的时区.未来的JRE可能有不同的奇怪行为. (3认同)
  • 警告:Java 5与1.4和Java 6+的工作方式不同!不要依赖这个答案来解决问题.有关详细信息,请参阅http://stackoverflow.com/questions/2176784/timezone-setdefault-changes-in-jdk6. (2认同)

Cug*_*uga 7

将系统变量设置为 CATALINA_OPTS=-Duser.timezone=America/Denver

您还可以在$ TOMCAT_HOME/bin/catalina.sh或%TOMCAT_HOME%\ bin\catalina.bat文件中指定CATALINA_OPTS.

这是一个可接受的时区列表.

资源

  • 此解决方案将更改Tomcat服务器的整个时区; 问题作者想要为每个webapp设置不同的时区. (5认同)