2010-02-01 16 views
16

में टाइमज़ोन.सेटडिफॉल्ट परिवर्तन मैंने अभी देखा है कि जेडीके 6 के पास जेडीके 5 की तुलना में डिफ़ॉल्ट टाइमज़ोन सेट करने के लिए एक अलग दृष्टिकोण है।जेडके 6

पहले नया डिफ़ॉल्ट थ्रेड-स्थानीय चर में संग्रहीत किया जाएगा। जेडीके 6 के साथ (मैंने अभी 1.6.0.18 की समीक्षा की है) कार्यान्वयन बदल गया है, ताकि यदि उपयोगकर्ता "user.timezone" संपत्ति को लिख सकता है, या यदि कोई सुरक्षा प्रबंधक स्थापित नहीं है, तो टाइमज़ोन VM-wide बदलता है! अन्यथा एक थ्रेड-स्थानीय परिवर्तन होता है।

क्या मैं गलत हूँ? यह काफी कठोर परिवर्तन प्रतीत होता है, और मुझे इसके बारे में वेब पर कुछ भी नहीं मिला।

private static boolean hasPermission() { 
    boolean hasPermission = true; 
    SecurityManager sm = System.getSecurityManager(); 
    if (sm != null) { 
    try { 
    sm.checkPermission(new PropertyPermission("user.timezone", "write")); 
    } catch (SecurityException e) { 
    hasPermission = false; 
    } 
    } 
    return hasPermission; 
} 

/** 
    * Sets the <code>TimeZone</code> that is 
    * returned by the <code>getDefault</code> method. If <code>zone</code> 
    * is null, reset the default to the value it had originally when the 
    * VM first started. 
    * @param zone the new default time zone 
    * @see #getDefault 
    */ 
public static void setDefault(TimeZone zone) 
{ 
    if (hasPermission()) { 
    synchronized (TimeZone.class) { 
    defaultTimeZone = zone; 
    defaultZoneTL.set(null); 
    } 
    } else { 
    defaultZoneTL.set(zone); 
    } 
} 

जबकि पहले (JDK5 में) यह केवल था:

/** 
    * Sets the <code>TimeZone</code> that is 
    * returned by the <code>getDefault</code> method. If <code>zone</code> 
    * is null, reset the default to the value it had originally when the 
    * VM first started. 
    * @param zone the new default time zone 
    * @see #getDefault 
    */ 
public static synchronized void setDefault(TimeZone zone) 
{ 
    defaultZoneTL.set(zone); 
} 

उत्तर

12

कीड़े डेटाबेस सर्च कर रहे हैं वास्तव में काफी एक अच्छा विचार :)

http://bugs.sun.com/view_bug.do?bug_id=6352812

और भी (डॉक्स फिर से) था:

http://bugs.sun.com/view_bug.do?bug_id=6181786

सारांश: JDK 1.5 के लिए एक अपवाद था नियम, जेडीके 1.6 चीजों के साथ 'सामान्य' पर वापस आ गया है, जो दस्तावेज़ों के मुताबिक, एक टाइमज़ोन परिवर्तन वीएम चौड़ा है।

4

यह शायद एक बग को ठीक करने में किया गया था

यहाँ JDK6 कोड है। मैं इसके लिए तर्क खोजने के लिए bugs.sun.com खोजूंगा। (सुराग भी release notes में पाया जा सकता है।)

1

TimeZone.getDefault (के लिए API दस्तावेज़) कहा गया है कि "डिफ़ॉल्ट के स्रोत समयक्षेत्र कार्यान्वयन के साथ भिन्न हो सकते हैं।" यदि आपका कोड मानक एपीआई कक्षाओं के कार्यान्वयन विशिष्ट व्यवहार पर निर्भर करता है (इस मामले में, डिफ़ॉल्ट समय क्षेत्र को थ्रेड स्थानीय स्तर पर रखा जाता है), तो आपको यह उम्मीद करनी होगी कि आपका कोड वीएम के नए संस्करणों या वीएम के साथ अलग-अलग हो विक्रेताओं।