2011-08-15 14 views
8

मुझे जावा टाइमज़ोन के साथ कोई समस्या है, अगर कोई मेरी मदद कर सकता है।जेवीएम और टाइमज़ोन

मैं एक वेब अनुप्रयोग पर चल रहे हैं बिल्ला 5.5 (यकीन नहीं अगर यह प्रासंगिक है), निम्नलिखित JVM संस्करण

[[email protected] bin]$ java -version 
java version "1.5.0_06" 
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_06-b05) 
Java HotSpot(TM) Server VM (build 1.5.0_06-b05, mixed mode) 
[[email protected] bin]$ 

प्रणाली की तारीख है साथ, कहते हैं -

[[email protected] bin]$ date 
Mon Aug 15 09:09:46 EST 2011 

के भीतर वेब एप्लिकेशन, मैं एक निश्चित बिंदु पर Calendar.getInstance().getTime() पर कॉल करता हूं, और मैं लॉग में इस टाइमस्टैम्प को प्रिंट करता हूं।

समस्या यह है कि यह टाइमस्टैम्प ईडीटी में वापस आ जाता है, हालांकि सर्वर का समय ईएसटी में है। इस कारण से, लौटाई गई तारीख 1 घंटे बाद की जानी चाहिए।

जो मैं प्राप्त करना चाहता हूं वह Calendar.getInstance().getTime() को सिस्टम के समान समय क्षेत्र में एक तिथि वापस करने के लिए बनाता है।

मैंने मंचों की खोज की है, और कुछ सुझाव मिले हैं कि जेवीएम सिस्टम के टाइमज़ोन को सही ढंग से नहीं पढ़ रहा है। मैंने -Duser.timezone=EST पैरामीटर के साथ टॉमकैट शुरू करने का प्रयास किया है, लेकिन सिस्टम ईडीटी टाइमज़ोन में टाइमस्टैम्प लौटता रहता है। कृपया ध्यान दें - एक गैर-अनुमान पैरामीटर के साथ -Duser.timezone का प्रयास करना प्रतीत होता है। समस्याएं एक अलग प्रकृति की प्रतीत होती हैं।

मेरा मुद्दा किसी भी तरह this SO question के समान है। हालांकि, मैं केवल उसी समय क्षेत्र में तारीख प्राप्त करने की कोशिश कर रहा हूं क्योंकि सिस्टम किसी भी विशेष हैंडलिंग के बिना है।

क्या आप मदद कर सकते हैं?

+0

ध्यान रखें कि यदि आप केवल वर्तमान समय के साथ डेट ऑब्जेक्ट की तलाश में हैं तो आप कैलेंडर का उपयोग करने के बजाय नई तिथि() को कॉल कर सकते हैं। हालांकि आपको डिफ़ॉल्ट टाइमज़ोन सेट करके मॉरिसियो की सलाह का पालन करना होगा। – jpredham

+0

आप शायद पहले ही जानते हैं, लेकिन ईडीटी और ईएसटी डीएसटी के साथ/बिना एक ही समय क्षेत्र हैं। अगस्त आमतौर पर ईडीटी है, इसलिए _practically_ अमेरिका में अगस्त में कोई ईएसटी नहीं है। http://en.wikipedia.org/wiki/Eastern_Time_Zone – Nivas

+0

हां, मुझे लगता है कि समस्या उस से संबंधित हो सकती है, क्योंकि -Duser.timezone = उदाहरण के लिए एईटी काम करता है। हालांकि मैं कामकाज करने की बजाय इस समस्या के लिए स्थायी फिक्स की तलाश में हूं। – Andrei

उत्तर

4

मुझे एक ही समस्या थी। यह मेरे लिए निकला है कि जावा /etc/sysconfig/clock फ़ाइल में देख रहा था /etc/localtime फ़ाइल नहीं। यह more info

5

ईएसटी और ईडीटी बहुत विशिष्ट हैं, और उनमें से एक साल के समय के आधार पर हमेशा "गलत" होगा। बस "अमेरिका/न्यू यॉर्क में" समय क्या है "पाने के लिए" अमेरिका/न्यू_यॉर्क "का टाइमज़ोन आज़माएं।

उदा।

DateFormat formatterET = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss zzz"); 
    formatterET.setTimeZone(TimeZone.getTimeZone("America/New_York")); 

    String timestamp = formatterET.format(new Date()); 

उपयोगी समय क्षेत्रों सूची:

https://calendar.york.ac.uk/en/chcncpt.html#wp1056628

+0

हाय और उत्तर देने के लिए धन्यवाद। हालांकि मुझे पता है कि कुछ कामकाज संभव हैं, मैं असली मुद्दे को ठीक करना चाहता हूं। मेरा प्रश्न संक्षेप में है: "जेवीएम को सिस्टम के टाइमज़ोन को कैसे पढ़ा जाए और डिफ़ॉल्ट रूप से इसका उपयोग करें" – Andrei

+0

मुझे लगता है कि आपका क्या मतलब है; शायद यह एक कामकाज पर विचार करें जो एक ही प्रभाव होना चाहिए यदि आपको अधिक निश्चित उत्तर नहीं मिल रहा है। मुझे यह देखने में दिलचस्पी होगी कि कोई जवाब है या नहीं, मुझे वर्तमान में ऐसी सेटिंग पता नहीं है। – Brian

3

यह आपके एप्लिकेशन मुख्य विधि (या servlet संदर्भ) में इस ऐड काफी सरल है:

TimeZone.setDefault(TimeZone.getTimeZone("GMT-4")); 

इस समय क्षेत्र सेट आपके सिस्टम में सभी तिथियों के लिए।

+0

एनबी ध्यान रखें कि यह विधि केवल JVM इंस्टेंस के जीवनकाल के लिए प्रभावी रहेगी उदा। टॉमकैट के पुनरारंभ नहीं होंगे। – jpredham

+0

हां, यही कारण है कि आपको इसे सर्वलेट संदर्भ श्रोता या उस तरह कुछ ऐसा जोड़ना चाहिए, यह सुनिश्चित कर लें कि जब भी आपका ऐप लोड हो जाए तो यह चलता है। –

+0

हाय और उत्तर देने के लिए धन्यवाद। हालांकि मुझे पता है कि कुछ कामकाज संभव हैं, मैं असली मुद्दे को ठीक करना चाहता हूं। मेरा प्रश्न संक्षेप में है: "जेवीएम को सिस्टम के टाइमज़ोन को कैसे पढ़ा जाए और इसे डिफ़ॉल्ट रूप से उपयोग करें" – Andrei

1

ईडीटी & ईएसटी - यह वही भौगोलिक क्षेत्र है। लेकिन ईएसटी एक मानक समय है और यह केवल सर्दियों में (और कुछ स्थानों में भी गर्मियों में) काम करता है, और ईडीटी डेलाइट सेविंग समकक्ष है। आपकी समस्या शायद डेलाइट सेविंग मूवमेंट से संबंधित है, इसलिए मैं इस दिशा में खोदूँगा। आप डिफॉल्ट टाइमज़ोन सेट करके एक विशेष टाइमज़ोन (आमतौर पर देश/शहर प्रारूप में) निर्दिष्ट भी कर सकते हैं, लेकिन इस मामले में आपको यह सुनिश्चित करना चाहिए कि आपके सर्वर के वर्तमान टाइमज़ोन और जिसे आप डिफॉल्ट के रूप में निर्दिष्ट करते हैं, के साथ कोई भी संघर्ष नहीं होगा।

+0

क्षमा करें, मुझे नहीं लगता कि यह महत्वपूर्ण है कि उनके बीच क्या अंतर है।मैं चाहता हूं कि जेवीएम एक ही समय/टाइमज़ोन को सिस्टम की घड़ी के रूप में रिपोर्ट करे। – Andrei

2

मुझे यकीन नहीं है कि यह जावा में वास्तव में संभव है, लेकिन यदि ऐसा है तो यह निश्चित रूप से चीजों को करने का डिफैक्टो तरीका नहीं है जैसा कि अन्य ने कहा है।, इस मामले पर Oracle के नोट्स के लिए here देखें विशेष रूप से:

जावा SE मंच के समय क्षेत्र डेटा स्थानीय या होस्ट ऑपरेटिंग सिस्टम (ओएस), से पढ़ा नहीं है इसलिए ओएस समय क्षेत्र पैच JRE सॉफ्टवेयर के समय क्षेत्र डेटा अपडेट नहीं करेंगे ।

1

लिनक्स पर, यह थोड़ा परेशान है क्योंकि लंबे समय तक जावा (कम से कम ओरेकल/सन जावा) ने एक दोषपूर्ण विधि का उपयोग किया (ठीक है, मुझे लगता है कि यह शुरू होने पर कम दोषपूर्ण था, लेकिन चीजें बदल गई हैं।)

मेरी सबसे अच्छी सिफारिश टीजेड पर्यावरण चर सेट करने के लिए होगी, क्योंकि यह पहली चीज है जिसे यह देखना होगा; अन्य स्थान देखेंगे (उदाहरण के लिए/etc/sysconfig/घड़ी,/आदि/लोकलटाइम) दोषपूर्ण हैं। मेरे पास http://distracted-it.blogspot.co.nz/2014/09/dont-let-java-on-linux-determine-its.html पर इसके बारे में अधिक विस्तृत पोस्ट है, जिसमें कुछ पृष्ठभूमि संदर्भ और एक सत्यापन चरण शामिल है।

-Duser.timezone=Pacific/Auckland भी काम कर सकता है, लेकिन जब मैंने कोशिश की, तो ऐसा नहीं हुआ।

यदि टीजेड सेट करना है, तो आपको यह सुनिश्चित करना चाहिए कि आप इसे उचित स्थान पर सेट करें। उदाहरण के लिए, वेबलॉगिक मिडलवेयर कंटेनर में, आपको इसे setDomainEnv.sh में सेट करना चाहिए, क्योंकि वेबलोगिक पहले पर्यावरण को स्वच्छ कर देगा और टीजेड नहीं देखा जाएगा (मेरी पोस्ट दिखाती है कि आप कैसे सत्यापित कर सकते हैं कि एक JVM प्रक्रिया इसे देख रही है।)

1

मुझे उबंटू सर्वर पर एक ही समस्या थी, और/etc/sysconfig/घड़ी फ़ाइल नहीं मिल सका।

मैंने इसे टाइमज़ोन सेट करने के लिए timedatectl का उपयोग करने का हल किया।

sudo timedatectl set-timezone America/New_York 
संबंधित मुद्दे