如何强制Spring Boot JVM进入UTC时区?

时间:2019-01-22 21:25:22

标签: java spring spring-boot timezone

我看到了Force Java timezone as GMT/UTC

我尝试过

  • mvn spring-boot:run -Dexec.args =“-Duser.timezone = GMT”
  • mvn spring-boot:run -Dexec.args =“-Duser.timezone = UTC”
  • user.timezone=UTC中的{li> config/application.properties
  • user.timezone=GMT
  • 在pom.xml中:

        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <properties>
                  <spring-boot.run.jvmArguments>-Duser.timezone=UTC</spring-boot.run.jvmArguments>
                </properties>
            </configuration>
        </plugin>
    
  • mvn spring-boot:run -Dspring-boot.run.jvmArguments =“-Duser.timezone = UTC”

但是它会打印出来

System.out.println(TimeZone.getDefault());
  

sun.util.calendar.ZoneInfo [id =“ America / New_York”,offset = -18000000,dstSavings = 3600000,useDaylight = true,transitions = 235,lastRule = java.util.SimpleTimeZone [id = America / New_York,偏移量= -18000000,dstSavings = 3600000,useDaylight = true,startYear = 0,startMode = 3,startMonth = 2,startDay = 8,startDayOfWeek = 1,startTime = 7200000,startTimeMode = 0,endMode = 3,endMonth = 10,endDay = 1,endDayOfWeek = 1,endTime = 7200000,endTimeMode = 0]]

Spring Boot 1.5.19,Java 8

6 个答案:

答案 0 :(得分:1)

好吧,根据您的问题,您有两种选择:

  1. 在参数行user.timezone的pom.xml设置中,在surefire设置systemPropertyVariables中的属性之前:

    <plugin>
     ...
      <configuration>
        <argLine>-Duser.timezone=UTC</argLine>
      </configuration>
      ... 
    </plugin>
    
  2. 在您的Application类或某些Configuration类中以及在方法setDefault Time Zone to UTC中创建一个初始化方法:

    @PostConstruct
    public void init() {
       TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
       // OR you can use the line below
       // System.setProperty("user.timezone", "UTC")
    }
    

答案 1 :(得分:1)

您可以使用带有@Configuration注释的类来配置时区。您可以将其放在项目中的任何位置。我通常将所有属于该类别的类包含在名为config的程序包中。确保将@PostConstruct批注添加到实际设置时区的方法中。

import org.springframework.context.annotation.Configuration;

import javax.annotation.PostConstruct;

@Configuration
public class LocaleConfig {

    @PostConstruct
    public void init() {

        TimeZone.setDefault(TimeZone.getTimeZone("UTC"));

        System.out.println("Date in UTC: " + new Date().toString());
    }
}

请参见original article

答案 2 :(得分:1)

我认为您可以在应用程序级别设置应用程序的时区。我认为此链接将为您提供帮助。 https://www.onlinetutorialspoint.com/spring-boot/how-to-set-spring-boot-settimezone.html

因此,您需要做的是向“ @SpringBootApplication”注释所在的主类中添加“ @PostConstruct”注释,然后在其中添加时区设置方法。这是一个例子。

@SpringBootApplication
public class HellotimezoneApplication {

    public static void main(String[] args) {
        SpringApplication.run(HellotimezoneApplication.class, args);
    }

    @PostConstruct
    public void init(){
      // Setting Spring Boot SetTimeZone
      TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
    }

}

希望这可以为您提供帮助!

答案 3 :(得分:0)

如果要将JVM选项从Maven Spring Boot插件传递到派生的Spring Boot应用程序,请使用spring-boot.run.jvmArguments property

<properties>
  <spring-boot.run.jvmArguments>-Duser.timezone=UTC</spring-boot.run.jvmArguments>
</properties>

这等效于命令行语法:

mvn spring-boot:run -Dspring-boot.run.jvmArguments="-Duser.timezone=UTC"

或运行完全打包的Spring Boot应用程序时:

java -Duser.timezone=UTC -jar app.jar

答案 4 :(得分:0)

如果您的应用程序在linux下运行,则提供更多选项:

设置TZ环境变量

请参阅“在POSIX系统中,用户可以通过TZ环境变量指定时区”(https://www.gnu.org/software/libc/manual/html_node/TZ-Variable.html)。

此选项在任何云环境中特别有用。

符号链接/etc/locatime

即在我的本地系统/etc/locatime中与/usr/share/zoneinfo/Europe/Berlin的符号链接:

➜ ls -l /etc/localtime  
lrwxrwxrwx 1 root root 33 22. Jan 23:01 /etc/localtime -> /usr/share/zoneinfo/Europe/Berlin

您可以使用ln -s /usr/share/zoneinfo/GMT /etc/localtime轻松更改符号链接,可以在/usr/share/zoneinfo/中找到可能的值。

通过安装主机卷,该选项还可在许多云环境中使用,请参见kubernetes timezone in POD with command and argument

答案 5 :(得分:-1)

<properties> <spring-boot.run.jvmArguments>-Duser.timezone=UTC</spring-boot.run.jvmArguments> </properties> 那对我没用。

但是,如果您使用 jvmArguments ,那对我有用。 参考:official docs

<configuration> <jvmArguments>-Duser.timezone=UTC</jvmArguments> </configuration>