2010-01-21 15 views
9

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

मैंने पहली बार सिस्टम घड़ी के माध्यम से विंडोज़ समय की जांच की, फिर HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/ और ControlSet001, ControlSet002 की जांच की। सभी सिडनी समय क्षेत्र में सेट हैं।

क्या किसी को पता है कि यह जावा में एक बग है, या यदि यह कहीं और सेट समय का जिक्र कर रहा है?

जावा संस्करण 1.6.0_06

+0

बहुत पुराने दिनों में मैंने एक जेवीएम देखा है कि ओएस/2 में "एमईटी" टाइमज़ोन मध्य यूरोपीय टाइमज़ोन लेकिन मध्य पूर्वी टाइमज़ोन नहीं था। मुझे यह पता लगाने में थोड़ी देर लग गई कि सभी तिथियां 3.5 घंटे क्यों बंद थीं। –

उत्तर

11

सुनिश्चित करें कि आप JVM के लिए समय क्षेत्र सेट जब आवेदन प्रारंभ हो रहा है:

अपने अनुप्रयोग में
-Duser.timezone="Australia/Sydney" 
+0

एक उचित समाधान की उम्मीद कर रहा था, लेकिन इस कामकाज के साथ समाप्त हो गया। –

+0

और यदि मैं यूटीसी पर सेट करना चाहता हूं? –

+0

-Duser.timezone = "यूटीसी" –

2

प्रयास करें मैन्युअल रूप से डिफ़ॉल्ट समय क्षेत्र, या समय क्षेत्र सेट प्राप्त करने के लिए (टिप्पणी की लाइन)।

मेरा लिटिल उदाहरण:

import java.text.DateFormat; 
import java.util.Date; 
import java.util.Locale; 
import java.util.TimeZone; 

public class Main { 
    public static void main(String[] args) { 
     Locale locale = Locale.getDefault(); 
     TimeZone localTimeZone = TimeZone.getDefault(); 
     //TimeZone localTimeZone = TimeZone.getTimeZone("Australia/Sydney"); 
     DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL, locale); 
     dateFormat.setTimeZone(localTimeZone); 
     Date rightNow = new Date(); 
     System.out.println(locale.toString() + ": " + dateFormat.format(rightNow)); 
    } 
} 
+0

धन्यवाद दोस्तों, मैं सोच रहा हूं हालांकि _why_ मुझे समय क्षेत्र को मैन्युअल रूप से निर्दिष्ट करना होगा। क्या यह ओएस के समान नहीं होना चाहिए? –

+0

बीटीडब्ल्यू, उपरोक्त कोड सही लोकेल देता है, लेकिन गलत समय क्षेत्र। –

+0

यह होना चाहिए। यदि कोई बग है तो आप जावा को नवीनतम संस्करण में अपडेट करने का प्रयास कर सकते हैं। – balent

5

आप अपने JRE/SDK अद्यतन करना चाहिए, लेकिन TZUpdater पर्याप्त हो सकता है। नीचे दिए गए लिंक पर

6

चेक जानकारी: http://techtavern.wordpress.com/2010/04/15/java-and-incorrect-timezone-on-windows-xp/
इससे पता चलता है, वहाँ JVM में एक बग है कि, खिड़कियां रजिस्ट्री से गलत डिफ़ॉल्ट समय क्षेत्र पढ़ने के कारण। अभी तक कोई बग फिक्स नहीं है।

2

मुझे हाल ही में एक ही समस्या थी, जाहिर है यह एक अस्पष्टता के कारण होता है कि विंडोज रजिस्ट्री में अपनी टाइमज़ोन सेटिंग्स का प्रतिनिधित्व करता है और जावा इसे सही तरीके से समझने में विफल रहता है।

अधिक जानकारी this article में पाया जा सकता है, यह भी प्रभावित मशीन के लिए "इलाज" का वर्णन करता है जो:

  • मैन्युअली बदलना दिनांक/समय और उसके बाद मूल रूप से सही समय पर वापस बदल रहा है।
  • टाइमज़ोन बदलना और फिर मूल पर वापस जाना।
  • समय सर्वर से स्वचालित समय अपडेट का अनुरोध।
+0

काम करता है हमारे पास Windows Server 2008 के नवीनीकरण के बाद जावा 7 के साथ एक ही समस्या थी। सिस्टम के टाइमज़ोन को बदलना और फिर इसे पुनर्स्थापित करना हमारे लिए समस्या को ठीक करता है। –

0

मैं, एक ही त्रुटि थी, जबकि मैं मलय प्रायद्वीप मानक समय के लिए अपने समय क्षेत्र की स्थापना की गई थी, JVM मुझे वेनेजुएला समय समय क्षेत्र दे दी है।

निम्नलिखित ठीक मेरे लिए काम करता है:

रजिस्ट्री संपादक में, आपके समय क्षेत्र एक और समय-क्षेत्र पर (मैं "सिंगापुर टाइम" की तरह एक और पाठ डाल करने के लिए कोशिश कर रहा था संपादित आप रजिस्ट्री यहाँ पा सकते हैं:।

HKEY_LOCAL_MACHINE/सिस्टम/CurrentControlSet/नियंत्रण/TimeZoneInformation

और फिर, मैं इसे वापस जब मैं वापस रजिस्ट्री संपादक को देखने के नियंत्रण कक्ष, दिनांक और समय सेटिंग। उपयोग करते हुए मेरे वांछित समय-क्षेत्र पर रीसेट, मैं देख सकता हूँ यह पूर्ववत कर दिया जाता मलय प्रायद्वीप मानक समय के लिए। और मेरा जेवीएम इसे सही ढंग से पढ़ता है अभी व...

1

ऐसी समस्याओं का इतिहास है जो आते हैं और जाते हैं, और कोई उचित समाधान नहीं है। अधिक देखें: Java incorrect time zone bug on Windows

संपादित करें: टॉम और फ्रांसिस का जवाब: संक्षेप में, जावा रनटाइम कठिन समय कंप्यूटर पर वर्तमान समय क्षेत्र बाहर सही ढंग से खोजने का काम कर रहा है।

समय क्षेत्र पर विंडोज रजिस्ट्री जानकारी अविश्वसनीय है, और देशी विंडोज एपीआई के लिए यह है जो msvcrt.dll और विभिन्न msvcrxx.dll पर निर्भर करता है। प्रबंधित (.NET) API भी है जिसके लिए .NET Framework का एक निश्चित संस्करण स्थापित करने की आवश्यकता है जो जावा की पोर्टेबिलिटी के विपरीत है।

इस प्रकार, जावा रनटाइम के डेवलपर्स के पास विंडोज़ पर वर्तमान समय क्षेत्र के साथ कठिन समय होता है, और यह तब तक जारी रह सकता है जब तक माइक्रोसॉफ्ट के पास सहयोग करने का कोई कारण न हो।

यदि आप चाहते हैं कि आपका जावा एप्लिकेशन किसी भी समय क्षेत्र में सही तरीके से काम करे, तो उपयोगकर्ताओं को समय क्षेत्र को जीयूआई के माध्यम से सही करने की संभावना दें।

+0

हालांकि यह लिंक प्रश्न का उत्तर दे सकता है, लेकिन यहां उत्तर के आवश्यक हिस्सों को शामिल करना बेहतर है और संदर्भ के लिए लिंक प्रदान करना बेहतर है। लिंक किए गए पृष्ठ में परिवर्तन होने पर लिंक-केवल उत्तर अमान्य हो सकते हैं। – Tom

संबंधित मुद्दे