JVM Zaman Dilimi Düzgün nasıl ayarlanır


141

Bir Java programını çalıştırmaya çalışıyorum, ancak işletim sistemi tanımlı bir saat dilimi yerine varsayılan bir GMT saat dilimi alıyor. JDK sürümüm 1.5 ve işletim sistemi Windows Server Enterprise (2007)

Windows'ta Merkezi saat dilimi belirtilmiş, ancak aşağıdaki programı çalıştırdığımda bana GMT zamanı veriyor.

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

İşte çıktı

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

Uygulamadan saat dilimini ayarlamak istemediğimi lütfen unutmayın. JVM tarafından kullanılan saat diliminin işletim sisteminde belirtilen saat dilimi olmasını istiyorum. (Bu sorunu JDK ve Microsoft Server 2003 1.4 sürümüne sahip diğer sunucularla bulamıyorum).

Herhangi bir düşünce çok takdir edilecektir.


1
Hm, bu garip. Bir JVM / OS hatası veya garip bir yanlış yapılandırma gibi görünüyor.
Michael Borgwardt

DateTestdersi nasıl çağırıyorsun
matt b

@matt b: Windows komut isteminden DateTest'i derliyorum ve çağırıyorum. Ama bu sadece bir Test sınıfı. Orijinal sorun, IBM cognos sunucusu için bazı ETL işlemlerinde oldu.
Kushal Paudyal

1
sadece bir -Duser.timezonedeğerden geçebilecek herhangi bir kabuk / toplu komut dosyası aracılığıyla başlatmayı ekarte etmek istedim
mat b

Yanıtlar:


220

JVM'yi bu paramden geçebilirsiniz

-Duser.timezone

Örneğin

-Duser.timezone=Europe/Sofia

ve bu hile yapmalı. Ortam değişkeni TZ'nin ayarlanması Linux'ta da hile yapar.


JDK DST Saat Dilimi Güncelleme Aracı - 1.3.25'i (tzupdater) kullanmak ve önerdiğiniz gibi JVM parametresini değiştirmek zorunda kaldık ve sonunda sorundan kurtulduk. Bu arada, saat dilimi bilgileri bazı kayıt defterinde Windows tarafından saklanır. Kullandığım güncelleyici de kayıt defteri değerlerini güncelledi.
Kushal Paudyal

1
Bu parametreyi kullanarak benim JVM başlatmaya çalışıyorum, ancak hiçbir değişiklik var gibi görünüyor ... UTC üzerinde başlamak istiyorsanız ne parametre olarak kullanmalıyım !?
rafa.ferreira

Uygulamamda bazı konumları değiştiriyorum ve bu konumların zaman dilimlerini alıyorum. Saat dilimini kullanarak daha fazla işlem yapıyorum.Ancak uygulama ilk kez başladığında doğru değerleri alıyorum. Zaman Dilimi'ni değiştirdiğimde ve yeni saat dilimini varsayılan saat dilimi olarak ayarladığımda, doğru değerleri alamıyorum. Sorun nedir? Saat dilimini tam olarak nasıl değiştirebilirim? TimeZone.setDefault (TimeZone.getTimeZone ("my_time_zone")) kullanarak saat dilimini değiştiriyorum;
Dray

2
TZ için zaman dilimlerinin listesi burada: en.wikipedia.org/wiki/List_of_tz_database_time_zones . Saat dilimi adını kullanmak, ofsetten daha iyidir, çünkü gün ışığından tasarruf sağlar.
Brian

65

Aşağıdaki kodu kullanarak kodunuzdaki varsayılan saat dilimini de ayarlayabilirsiniz.

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

Sizinkine

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

1
"Uygulamadan saat dilimini ayarlamak istemediğimi lütfen unutmayın."
AbVog

22

Yukarıdaki kabul edilen cevap:

-Duser.timezone="Europe/Sofia" 

Benim için tam olarak çalışmadı. Ben sadece parametreleri etrafında tırnak yoktu zaman zaman dilimimi başarıyla değiştirmeyi başardı:

-Duser.timezone=Europe/Sofia

2
Katılıyorum. Alıntıları kaldırmak için orijinal yanıtı düzenledim.
GaZ

1
Bu kullanılan kabuğa bağlıdır.
vadipp

10

JDK6 pencereler 7 günü ve, ben eklemek zorunda -Duser.timezone="Europe/Sofia"için JAVA_TOOL_OPTIONS "Bilgisayarım => Özellikler => Gelişmiş Sistem Ayarları => Ortam Değişkenleri" altında bulunan sistem değişkeni.

Zaten ayarlanmış başka bir özelliğiniz varsa, JAVA_TOOL_OPTIONSbir boşluk ekleyin ve özellik dizenizi ekleyin.


5

Düşündüğüm iki seçenek diğer cevaplarda ele alındı:

İhtiyaçtan kaçının

JVM varsayılan saat dilimini ayarlamak için ne yaparsanız yapın, başka hiç kimsenin farklı ayarlamadığından emin olmak çok zordur. Programınızın başka bir bölümünden veya aynı JVM'de çalışan başka bir programdan haber vermeksizin herhangi bir zamanda ayarlanabilir. Bu nedenle, zaman işlemlerinizde hangi saat dilimini istediğiniz konusunda açık olun ve JVM ayarından bağımsız olarak ne elde ettiğinizi her zaman bileceksiniz. Misal:

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

Örnek çıktı:

2018-10-11T14: 59: 16,742020 + 05: 00 [Asya / Duşanbe]

System.setProperty

Birçok amaç için aşağıdakiler tercih edilen yol olmayacaktır ve kesinlikle yanlış kullanılabilir. “Atmak” programları için bazen pratik buluyorum. Java içinden bir sistem özelliği de ayarlayabilirsiniz:

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

Bu sadece yazdırıldı:

2018-10-11T21: 03: 12,218959 + 11: 00 [Avustralya / Tasmania]

Geçtiğiniz dizenin doğrulanmasını istiyorsanız şunu kullanın:

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

4

Maven kullanıyorsanız :

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

mvn spring-boot:run -Drun.jvmArguments="-Duser.timezone=UTC"Spring Boot v1 için.
Chloe

0

Win7'de , JRE'de doğru saat dilimini parametre olarak ayarlamak istiyorsanız, my_time_zone dizesini ekleyerek deployment.propertiesyolda depolanan dosyayı düzenlemeniz gerekirc:\users\%username%\appdata\locallow\sun\java\deploymentdeployment.javaws.jre.1.args=-Duser.timezone\=


Denedim ve çalışmıyor (jvm intellij içinden idam edildi)
kumetix
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.