JVM TimeZone을 올바르게 설정하는 방법


141

Java 프로그램을 실행하려고하는데 OS 정의 시간대 대신 기본 GMT 시간대를 사용하고 있습니다. JDK 버전은 1.5이고 OS는 Windows Server Enterprise (2007)입니다.

Windows에는 중앙 시간대가 지정되어 있지만 다음 프로그램을 실행하면 GMT 시간이 표시됩니다.

import java.util.Calendar;

public class DateTest
{
    public static void main(String[] args)
    {
        Calendar now = Calendar.getInstance();
        System.out.println(now.getTimeZone());
        System.out.println(now.getTime());
    }
}

출력은 다음과 같습니다

sun.util.calendar.ZoneInfo[id="GMT",
offset=0,
dstSavings=0,
useDaylight=false,
transitions=0,
lastRule=null]
Mon Mar 22 13:46:45 GMT 2010

응용 프로그램에서 시간대를 설정하고 싶지 않습니다. JVM에서 사용하는 시간대가 OS에 지정된 시간대 여야합니다. (JDK 버전 1.4와 Microsoft Server 2003이 설치된 다른 서버에서는이 문제를 찾을 수 없습니다).

어떤 생각이라도 높이 평가할 것입니다.


1
흠, 이상하다. JVM / OS 버그 또는 이상한 구성 오류처럼 보입니다.
Michael Borgwardt

당신은 어떻게 호출하는 DateTest클래스를?
matt b

@ matt b : Windows 명령 프롬프트에서 DateTest를 컴파일하고 호출합니다. 그러나 이것은 단지 테스트 클래스입니다. 원래 문제점은 IBM cognos 서버에 대한 일부 ETL 프로세스와 관련이있었습니다.
Kushal Paudyal

1
-Duser.timezone값을 전달할 수있는 쉘 / 배치 스크립트를 통해 실행을 배제하고 싶었습니다
matt b

답변:


220

이 매개 변수로 JVM을 전달할 수 있습니다.

-Duser.timezone

예를 들어

-Duser.timezone=Europe/Sofia

그리고 이것은 트릭을해야합니다. 환경 변수 TZ를 설정하면 Linux에서 트릭을 수행합니다.


JDK DST 표준 시간대 업데이트 도구-1.3.25 (tzupdater)를 사용하고 제안한대로 JVM 매개 변수를 변경해야했고 결국 문제가 해결되었습니다. 그런데 표준 시간대 정보는 Windows에 의해 일부 레지스트리에 저장됩니다. 내가 사용한 업데이터는 레지스트리 값도 업데이트했습니다.
Kushal Paudyal

1
이 매개 변수를 사용하여 JVM을 시작하려고하는데 변경 사항이없는 것 같습니다 ... UTC에서 시작하려면 매개 변수로 무엇을 사용해야합니까!?
rafa.ferreira

내 응용 프로그램에서 일부 위치를 변경하고 해당 위치의 시간대를 가져옵니다. 시간대를 사용하여 추가 처리하고 있지만 응용 프로그램을 처음 시작할 때 올바른 값을 얻습니다. TimeZone을 변경하고 새 시간대를 기본 시간대로 설정하면 올바른 값을 얻지 못합니다. 시간대를 정확하게 변경하는 방법 TimeZone.setDefault (TimeZone.getTimeZone ( "my_time_zone"));
Dray

2
TZ를위한 시간대의 목록은 여기에 있습니다 : en.wikipedia.org/wiki/List_of_tz_database_time_zones . 시간대 이름을 사용하면 일광 절약 시간제를 처리하므로 오프셋보다 낫습니다.
Brian

65

다음 코드를 사용하여 코드에서 기본 시간대를 설정할 수도 있습니다.

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

당신에게

 TimeZone.setDefault(TimeZone.getTimeZone("Europe/Sofia"));

1
"응용 프로그램에서 시간대를 설정하고 싶지 않습니다."
AbVog

22

위의 답변은 다음과 같습니다.

-Duser.timezone="Europe/Sofia" 

나를 위해 정확하게 작동하지 않았습니다. 매개 변수에 따옴표가 없으면 시간대를 성공적으로 변경할 수있었습니다.

-Duser.timezone=Europe/Sofia

2
나는 동의한다. 따옴표를 제거하기 위해 원래 답변을 편집했습니다.
GaZ

1
이것은 사용 된 쉘에 따라 다릅니다.
vadipp

10

Windows 7 및 JDK6의 경우 "내 컴퓨터 => 속성 => 고급 시스템 설정 => 환경 변수" -Duser.timezone="Europe/Sofia"에있는 JAVA_TOOL_OPTIONS 시스템 변수 를 추가 해야했습니다 .

이미 다른 속성이 설정되어 있으면 JAVA_TOOL_OPTIONS공백을 추가하고 속성 문자열을 삽입하십시오.


5

내가 생각하지 않은 두 가지 옵션은 다른 답변에서 다루었습니다.

필요를 피하십시오

JVM 기본 시간대를 설정하기 위해 무엇을 하든지 다른 사람이 다르게 설정하지 않는 것은 매우 어렵습니다. 프로그램의 다른 부분이나 동일한 JVM에서 실행중인 다른 프로그램의 통지없이 언제든지 설정할 수 있습니다. 따라서 시간대 작업에서 원하는 시간대를 명시하고 JVM 설정과 독립적으로 얻는 것을 항상 알 수 있습니다. 예:

    System.out.println(ZonedDateTime.now(ZoneId.of("Asia/Dushanbe")));

출력 예 :

2018-10-11T14 : 59 : 16.742020 + 05 : 00 [아시아 / 두샨베]

System.setProperty

많은 목적을 위해 다음이 바람직한 방법이 아니며 잘못 사용될 수 있습니다. “버려지는”프로그램을 위해 나는 때때로 그것이 실용적이라고 생각합니다. Java 내에서 시스템 특성을 설정할 수도 있습니다.

    System.setProperty("user.timezone", "Australia/Tasmania");
    System.out.println(ZonedDateTime.now());

이것은 방금 인쇄했습니다.

2018-10-11T21 : 03 : 12.218959 + 11 : 00 [오스트레일리아 / 태즈 매니아]

전달하는 문자열의 유효성을 검사하려면 다음을 사용하십시오.

        System.setProperty("user.timezone", ZoneId.of("Australia/Tasmania").getId());

4

Maven 을 사용하는 경우 :

mvn -Dexec.args="-Duser.timezone=Europe/Sofia ....."

mvn spring-boot:run -Drun.jvmArguments="-Duser.timezone=UTC"스프링 부트 v1 용.
Chloe

0

win7에서 JRE에서 올바른 시간대를 매개 변수로 설정하려면 deployment.properties경로 my_time_zone을c:\users\%username%\appdata\locallow\sun\java\deployment 추가하여 경로에 저장된 파일을 편집해야합니다.deployment.javaws.jre.1.args=-Duser.timezone\=


나는 그것을 시도하고 (인 IntelliJ 내에서 실행되는 JVM) 작동하지 않습니다
kumetix
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.