Как заставить JVM Spring Boot перейти в часовой пояс UTC?

Я видел Принудительно использовать часовой пояс Java как GMT/UTC

Я пытался

  • mvn spring-boot: запустить -Dexec.args="-Duser.timezone=GMT"
  • mvn spring-boot: запустить -Dexec.args="-Duser.timezone=UTC"
  • user.timezone=UTC в 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,offset=-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]]

Весенняя загрузка 1.5.19, Java 8

Это работает для Spring Boot v1: mvn spring-boot:run -Drun.jvmArguments = "-Duser.timezone=UTC"

Chloe 23.01.2019 23:40
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
22
1
69 763
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

Используйте spring-boot.run.jvmArguments свойство, если вы хотите передать параметры JVM из плагина Maven Spring Boot в разветвленное приложение Spring Boot:

<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

Первый вариант <properties не сработал. Он по-прежнему печатает id = "America/New_York". Второй вариант -Dspring-boot.run.jvmArguments... тоже не сработал.

Chloe 22.01.2019 22:38

@Chloe работает на меня с -Dspring-boot.run.jvmArguments = "-Duser.timezone=UTC" или -Dspring-boot.run.jvmArguments = "-Duser.timezone=America/New_‌​York с Spring Boot 2.1.2.RELEASE и Java 11. Проект создан с помощью start.spring.io.

Karol Dowbecki 22.01.2019 22:45

Я понимаю. Должна быть ошибка в v1 и исправлена ​​​​в v2. java -Duser.timezone=UTC -jar target\App-SNAPSHOT.warделает работает.

Chloe 23.01.2019 23:19

<properties> <spring-boot.run.jvmArguments>-Duser.timezone=UTC</spring-bo‌​ot.run.jvmArguments> </properties> это не сработало, но если вместо этого вы используете jvmArguments, это сработало для меня. ссылка: docs.spring.io/spring-boot/docs/2.2.2.RELEASE/maven-plugin/… так же просто, как: <jvmArguments>-Duser.timezone=UTC</jvmArguments>

RMati 05.10.2020 03:22

Обратите внимание, что jvmArguments применяются только в том случае, если вы также установили для свойства fork значение true. Однако мне удалось заставить его работать с mvn spring-boot:run -Duser.timezone=UTC.

J. S. 04.08.2021 11:34

@KarolDowbecki, есть ли возможность поместить это в файл application.properties?

Artanis Zeratul 07.09.2021 04:35

Вы можете настроить часовой пояс с помощью класса, аннотированного аннотацией @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());
    }
}

См. оригинальная статья

Я думаю, вы можете установить часовой пояс вашего приложения на уровне вашего приложения. Я думаю, что эта ссылка поможет вам. https://www.onlinetutorialspoint.com/spring-boot/how-to-set-spring-boot-settimezone.html

Итак, что вам нужно сделать, это добавить аннотацию «@PostConstruct» в основной класс, где находится аннотация «@SpringBootApplication», и добавить туда метод настройки часового пояса. Вот пример.

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

}

Надеюсь, это поможет вам!

Это не будет работать для кода, который запускается до вызова метода init(), например. Инициализация JVM или конструкции bean-компонентов Spring. Во всяком случае, было бы более разумно сделать это в методе main(), но надежный способ - использовать параметры -D.

Karol Dowbecki 04.08.2020 21:13

Дополнительные параметры, если ваше приложение работает под 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 в POD с командой и аргументом.

<properties> <spring-boot.run.jvmArguments>-Duser.timezone=UTC</spring-boot.run.jvmArguments> </properties> Это не сработало для меня.

Но если вместо этого вы используете jvmАргументы, это сработало для меня. Ссылка: https://docs.spring.io/spring-boot/docs/current/maven-plugin/reference/html/

просто <configuration> <jvmArguments>-Duser.timezone=UTC</jvmArguments> </configuration>

Другие вопросы по теме