当前位置: 首页 > 知识库问答 >
问题:

时区更改不在SpringBoot应用程序中持久化

左丘修齐
2023-03-14

当我在“Windows Server 2016 Datacenter”机器上使用Tomcat 9运行springboot 2.3.8应用程序时,我遇到了时区问题。在本地使用Eclipse或Tomcat9运行它不会触发问题。

我将时区设置在乞讨处,使用:

@PostConstruct
    public void init()
    {
        TimeZone.setDefault(TimeZone.getTimeZone("Europe/Berlin"));

        Calendar now = Calendar.getInstance();
        TimeZone timeZone = now.getTimeZone();
        System.out.println(timeZone.getDisplayName());
    }

并打印->中欧标准时间

但是,稍后当我调用其中一个endpoint并以与前面相同的方式检查时区时

Calendar now = Calendar.getInstance();
TimeZone timeZone = now.getTimeZone();
System.out.println(timeZone.getDisplayName());

我得到-->协调世界时

我假设不是在@PostConstruct上真正设置了时区,就是后来有什么东西覆盖了它。

我的问题是,是什么导致了这种变化,我怎样才能使我的时区一直在“欧洲/柏林”。

我已经尝试过像上面提到的那样更改应用程序内部的时区,使用tomcat中的Java参数,并更改机器本身的时区,但在所有情况下更改都被覆盖,我在调用和endpoint时得到UTC。

pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.8.RELEASE</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>

    <groupId>com.test</groupId>
    <artifactId>project</artifactId>
    <name>project</name>
    <version>1.00</version>
    <packaging>war</packaging>

    <url>http://maven.apache.org</url>
    <properties>
        <java.version>1.8</java.version>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <maven.test.skip>true</maven.test.skip>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

        <!-- Master Versions -->
        <spring.boot.version>2.3.8.RELEASE</spring.boot.version>
        <oracle.version>12.2.0.1</oracle.version>
    </properties>

    <!-- Generates the Build Info/Properties -->
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                            <goal>build-info</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

            <!-- Adds local jar to the final WAR -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <configuration>
                    <failOnMissingWebXml>false</failOnMissingWebXml>
                    <webResources>
                        <resource>
                            <directory>${project.basedir}/libraries/</directory>
                            <targetPath>WEB-INF/lib</targetPath>
                        </resource>
                    </webResources>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <dependencies>
        
        <dependency>
            <!-- Import dependency management from Spring Boot -->
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>${spring.boot.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>

        <!-- Spring-boot-starter -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-rest</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-integration</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.ldap</groupId>
            <artifactId>spring-ldap-core</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-ldap</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-jwt</artifactId>
            <version>1.1.1.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.security.oauth</groupId>
            <artifactId>spring-security-oauth2</artifactId>
            <version>2.5.0.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>com.unboundid</groupId>
            <artifactId>unboundid-ldapsdk</artifactId>
        </dependency>

        <!-- javax -->
        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
        </dependency>

        <dependency>
            <groupId>javax.mail</groupId>
            <artifactId>mail</artifactId>
            <version>1.4.7</version>
        </dependency>

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
        </dependency>

        <dependency>
            <groupId>javax.persistence</groupId>
            <artifactId>javax.persistence-api</artifactId>
        </dependency>

        <!-- jjwt -->
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>0.9.1</version>
        </dependency>

        <!-- Oracle JDBC driver -->
        <dependency>
            <groupId>com.oracle.jdbc</groupId>
            <artifactId>ojdbc8</artifactId>
            <version>${oracle.version}</version>
        </dependency>

        <!-- HikariCP connection pool -->
        <dependency>
            <groupId>com.zaxxer</groupId>
            <artifactId>HikariCP</artifactId>
        </dependency>

        <!-- Swagger -->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-boot-starter</artifactId>
            <version>3.0.0</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.8.0</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.tika/tika-example -->
        <dependency>
            <groupId>org.apache.tika</groupId>
            <artifactId>tika-core</artifactId>
            <version>1.25</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.tika/tika-parsers -->
        <dependency>
            <groupId>org.apache.tika</groupId>
            <artifactId>tika-parsers</artifactId>
            <version>1.25</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.4</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework/spring-mock -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-mock</artifactId>
            <version>2.0.8</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api -->
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <scope>test</scope>
        </dependency>

        <!-- Spring-test -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
        </dependency>

        <!-- Mockito -->
        <dependency>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-core</artifactId>
        </dependency>

        <!-- Powermock -->
        <dependency>
            <groupId>org.powermock</groupId>
            <artifactId>powermock-module-junit4</artifactId>
            <version>2.0.9</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.powermock</groupId>
            <artifactId>powermock-api-mockito2</artifactId>
            <version>2.0.9</version>
            <scope>test</scope>
        </dependency>

    </dependencies>
</project>

共有1个答案

陈瀚
2023-03-14

并打印->中欧标准时间

你为什么要这么做?“Calendar”作为一个API是坏的和过时的,不要使用它。“中欧标准时间”是一个奇怪的概念,你可能根本不想要。这是一个你需要摆脱的破碎的概念。

欧盟已经决定,整个欧盟将完全放弃夏令时的概念,但实际上并没有要求每个欧盟国家都必须使用同一时区。这意味着几件事:

>

  • 这一直是一个白痴的标准;有“中欧标准时间”(UTC+1)和“中欧夏令时”(UTC+2),它们都缩短为CET,但通常的说法是“CEST”意味着夏令时(UTC+2),而“中欧标准时间”缩短为CET。面膜力矩。

    这两个区域很快就会有完全不同的意义。充其量,我们只剩下“中欧时间”(CET),但实际上最终可能是UTC+2,所以“CET”现在指的是UTC+1,但明年它可能被重新解释为意味着UTC+2,这对计算机来说是地狱,所以最好的选择是一开始就不要购买这种CET/CET的废话。无论哪一个没有被选中,都将是一个过时的遗迹:一个没有任何国家真正在的区域。

    也许CET/CET会完全消失:也许西欧国家采用UTC+1,而东方国家采用UTC+2,以匹配它们的经度。在真空中,波兰应采用UTC+2,荷兰应采用UTC+1。那就没有什么“欧洲中央时间”了。

    您的代码中已经有了正确的答案:Europe/Berlin。时区就是这样命名的。不包含3个字母或4个字母的缩略词,这些缩略词模糊不清、过载和不足。

    但在所有情况下,更改都被覆盖,并且我在调用和端点时得到UTC。

    这就是全局违约的问题。“不要使用单例”是一个常见的格言,这就是为什么:你会遇到很深的问题。

    是的,有东西在覆盖它。

    最好的解决方法是,您不需要关心“全局”时区属性是什么。现在使用日历的代码是什么?找到它,用基于java.time的代码替换它。

    参考:关于TLA时区ID的时区javadoc弃用通知。

  •  类似资料:
    • 我在一个Polymer2.0应用程序中使用了一个vaadin-grid,其中有几个列,几乎所有列都有一个Vaadin-Grid-Sorter。由于我想给用户一个机会来保持其排序首选项,我的问题是: 我可以在代码中设置要排序的列和排序方向吗? 我看了一下网格源代码,但没有找到任何(公共)属性。

    • 我已经为Postgresql启用了复制,并且正在使用PGPool进行负载平衡。 我在使用HikariCP甚至Apache DBCP连接到Postgres时遇到了问题。 在SpringBoot应用程序中有没有使用PGPool的方法? 请查找堆栈跟踪: 2018-08-10 10:20:19.124信息37879----[main]com.zaxxer.hikari.hikaridatasource:

    • 我正在做一个项目,它需要在飞行中改变语言。我正在尝试设置所需的区域设置,但我一设置,应用程序就崩溃了,抱怨它找不到资源(比如r.layout.*r.drawable.*) 这是我用来设置新区域设置的代码: 编辑:已添加日志 E/AndroidRuntime:致命异常:main java.lang.RuntimeException:无法启动activity组件Info{com.flavorburst

    • 我试图在SpringMVC中运行SpringBoot应用程序,在SpringMVCPOM中添加SpringBoot应用程序依赖项,并扫描SpringBoot包,但我面临以下问题

    • 问题内容: 如何在Tomcat中更改时区?Webapp之一(Solr)使用的时区不正确 (与MySQL时间戳相比) ,我认为更改Tomcat的时区会有所帮助。谢谢! 问题答案: 除非tomcat具有个人的TZ环境变量,否则它将在我的系统上使用的副本。 Tomcat的个人时区将在其启动脚本中以如下形式指定:

    • 问题内容: 我正在使用FXML中描述的核心组件制作JavaFX桌面应用程序,我想为用户提供更改语言的选项。但是,一旦从FXML加载了组件,我还没有找到任何直接的方法来更改语言。 问题是,有什么标准方法可以处理JavaFX中的语言切换。 问题答案: 你可以做这样的事情。正如您在回答中一样,您可能希望将其实现为单例,或者使用DI框架在需要的地方注入单个实例: 现在,您可以执行以下操作: 而且任何时候您