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

2022-09-03 12:59:10

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

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


答案 1

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

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);
}

将更改线程的区域。因此,在过滤器内的线程中运行的所有内容都将具有不同的默认时区。我们必须将其更改回去,因为该线程由其他应用程序共享。您还需要对 、 方法和可能在应用程序中启动的任何其他线程执行相同的操作。setDefault()init()destroy()

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


答案 2

编辑:我错了。此编辑更正了它。

答案是,无法移植地为单个 Web 应用设置(默认)时区。但是,如果您使用的是 Java 6(至少),则该类将实现缺省时区方法 ,并使用可继承的线程 local。换句话说,调用仅影响当前线程和将来的子线程。java.util.TimeZonegetDefault()setDefault()setDefault(TimeZone)setDefault()

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


推荐