JVM TimeZone को सही तरीके से कैसे सेट करें


141

मैं एक जावा प्रोग्राम चलाने की कोशिश कर रहा हूं, लेकिन यह ओएस परिभाषित टाइमज़ोन के बजाय डिफ़ॉल्ट जीएमटी टाइमज़ोन ले रहा है। मेरा JDK संस्करण 1.5 है और OS विंडोज सर्वर एंटरप्राइज (2007) है

विंडोज में एक केंद्रीय टाइमज़ोन निर्दिष्ट है, लेकिन जब मैं निम्नलिखित कार्यक्रम चलाता हूं, तो यह मुझे जीएमटी समय देता है।

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

कृपया ध्यान दें कि मैं एप्लिकेशन से टाइमज़ोन सेट नहीं करना चाहता। मैं चाहता हूं कि जेवीएम द्वारा उपयोग किया जाने वाला समयक्षेत्र ओएस में निर्दिष्ट होना चाहिए। (मैं इस मुद्दे को अन्य सर्वरों के साथ नहीं खोज रहा हूं जिनके पास जेडीके और माइक्रोसॉफ्ट सर्वर 2003 के संस्करण 1.4 हैं)।

किसी भी विचार बहुत सराहना की जाएगी।


1
हम्म, यह अजीब है। जेवीएम / ओएस बग या कुछ अजीब गलतफहमी जैसा दिखता है।
माइकल बोर्गवर्ड

आप DateTestकक्षा को कैसे आमंत्रित कर रहे हैं ?
मैट बी

@ एम बी: मैं विंडोज़ कमांड प्रॉम्प्ट से डेटटेस्ट को कंपाइल और कॉल कर रहा हूं। लेकिन यह सिर्फ टेस्ट क्लास है। मूल समस्या IBM cognos सर्वर के लिए कुछ ETL प्रक्रिया के साथ थी।
कुशाल पौड्याल

1
बस किसी भी खोल / बैच स्क्रिप्ट जो एक साथ गुजर रहा हो सकता है के माध्यम से यह शुरू करने से इनकार करना चाहता था -Duser.timezoneमूल्य
ख मैट

जवाबों:


220

आप इस परम को जेवीएम पास कर सकते हैं

-Duser.timezone

उदाहरण के लिए

-Duser.timezone=Europe/Sofia

और यह चाल चलनी चाहिए। एनवायरनमेंट वैरिएबल टीबी सेट करना लिनक्स पर ट्रिक भी करता है।


हमें JDK DST Timezone अपडेट टूल - 1.3.25 (tzupdater) का उपयोग करना था और फिर जेवीएम पैरामीटर को बदलना चाहिए जैसा कि आपने सुझाव दिया था और हमने आखिरकार इस मुद्दे से छुटकारा पा लिया। वैसे, टाइमजोन जानकारी कुछ रजिस्ट्री में विंडोज द्वारा संग्रहीत की जाती है। Updater मैंने रजिस्ट्री मानों को भी अद्यतन किया।
कुशाल पौड्याल

1
मैं इस पैरामीटर का उपयोग करके अपने जेवीएम को स्टार्टअप करने की कोशिश कर रहा हूं, लेकिन लगता है कि इसमें कोई बदलाव नहीं हुआ है ... अगर मैं यूटीसी पर शुरू करना चाहता हूं तो मैं पैरामीटर के रूप में क्या उपयोग करूंगा !?
rafa.ferreira

अपने आवेदन में मैं कुछ स्थानों को बदल रहा हूं और उस स्थानों के टाइमजोन प्राप्त कर रहा हूं। समयक्षेत्र का उपयोग करते हुए मैं आगे की प्रक्रिया कर रहा हूं। लेकिन जब पहली बार आवेदन शुरू होता है, तो मुझे सही मान मिल रहे हैं। जब मैं TimeZone को बदलता हूं और नए टाइमज़ोन को डिफ़ॉल्ट टाइमज़ोन के रूप में सेट करता हूं, तो मुझे सही मान नहीं मिल रहा है। क्या मुद्दा है? टाइमजोन को बिल्कुल कैसे बदलना है। मैं टाइमजोन.सेटडाल्ट (टाइमजोन.गेट टाइमजोन) ("my_time_zone") का उपयोग करके टाइमजोन को बदल रहा हूं;
ड्रे

2
TZ के लिए टाइमज़ोन की एक सूची यहां है: en.wikipedia.org/wiki/List_of_tz_database_time_zones । टाइमज़ोन नाम का उपयोग ऑफसेट से बेहतर है क्योंकि यह दिन के उजाले की बचत को संभालेगा।
ब्रायन

65

आप निम्न कोड का उपयोग करके अपने कोड में डिफ़ॉल्ट समय क्षेत्र भी सेट कर सकते हैं।

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

तुम्हारे लिए

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

1
"कृपया ध्यान दें कि मैं एप्लिकेशन से टाइमज़ोन सेट नहीं करना चाहता।"
अबवोग 14

22

ऊपर स्वीकार किए गए उत्तर:

-Duser.timezone="Europe/Sofia" 

मेरे लिए बिल्कुल काम नहीं किया। मैं केवल अपने समयक्षेत्र को सफलतापूर्वक बदलने में सक्षम था जब मेरे पास मापदंडों के आसपास उद्धरण नहीं थे:

-Duser.timezone=Europe/Sofia

2
मैं सहमत हूँ। मैंने उद्धरणों को हटाने के लिए मूल उत्तर को संपादित किया है।
GaZ

1
यह प्रयुक्त शेल पर निर्भर करता है।
vadipp

10

विंडोज 7 पर और के लिए JDK6, मैं जोड़ने के लिए किया था -Duser.timezone="Europe/Sofia"के लिए JAVA_TOOL_OPTIONS प्रणाली के तहत "मेरे कंप्यूटर => गुण => उन्नत सिस्टम सेटिंग => पर्यावरण चर" स्थित चर।

यदि आपके पास पहले से ही JAVA_TOOL_OPTIONSएक स्थान जोड़ने के लिए कुछ अन्य संपत्ति सेट है और फिर अपनी संपत्ति स्ट्रिंग डालें।


5

दो विकल्प जो मुझे नहीं लगता कि अन्य उत्तरों में शामिल थे:

जरूरत से बचें

जेवीएम डिफ़ॉल्ट समय क्षेत्र को सेट करने के लिए आप जो भी करते हैं, यह सुनिश्चित करना बहुत कठिन है कि कोई और इसे अलग तरीके से सेट न करे। यह किसी भी समय आपके कार्यक्रम के किसी अन्य भाग से या उसी JVM में चल रहे किसी अन्य प्रोग्राम से सूचना के बिना सेट किया जा सकता है। इसलिए आपके समय के कार्यों में स्पष्ट होना चाहिए कि आप किस समय क्षेत्र को चाहते हैं, और आपको हमेशा पता चलेगा कि आपको जेवीएम सेटिंग से स्वतंत्र रूप से क्या मिलता है। उदाहरण:

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

उदाहरण आउटपुट:

2018-10-11T14: 59: १६.७४२०२० + 05: 00 [एशिया / दुशांबे]

System.setProperty

कई उद्देश्यों के लिए निम्नलिखित पसंदीदा तरीका नहीं होगा, और निश्चित रूप से इसका दुरुपयोग किया जा सकता है। "दूर फेंक" कार्यक्रमों के लिए मुझे कभी-कभी यह व्यावहारिक लगता है। आप जावा के भीतर से एक सिस्टम प्रॉपर्टी भी सेट कर सकते हैं:

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

यह सिर्फ छपा:

2018-10-11T21: 03: १२.२१८९५९ + 11: 00 [ऑस्ट्रेलिया / तस्मानिया]

यदि आप उस स्ट्रिंग का सत्यापन चाहते हैं जो आप पास कर रहे हैं, तो उपयोग करें:

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

4

यदि आप मावेन का उपयोग कर रहे हैं :

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

mvn spring-boot:run -Drun.jvmArguments="-Duser.timezone=UTC"स्प्रिंग बूट के लिए v1।
च्लोए

0

Win7 में, यदि आप JRE में एक पैरामीटर के रूप में सही टाइमज़ोन सेट करना चाहते हैं, तो आपको स्ट्रिंग my_time_zone को जोड़कर deployment.propertiesपथ में संग्रहीत फ़ाइल को संपादित करना होगाc:\users\%username%\appdata\locallow\sun\java\deploymentdeployment.javaws.jre.1.args=-Duser.timezone\=


मैंने इसे आज़माया और यह काम नहीं करता है (jvm को intellij के भीतर से निष्पादित किया गया है)
kumetix
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.