2010-04-13 15 views
66

के रूप में फोर्स जावा टाइमज़ोन को मशीन पर टाइमज़ोन सेट किए बिना, जीएमटी/यूटीसी को किसी भी समय संबंधित ऑपरेशन को मजबूर करने की आवश्यकता है। कोड में ऐसा करने का कोई सुविधाजनक तरीका?जीएमटी/यूटीसी

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

धन्यवाद!

+0

दरअसल, उसकी समस्या मेरा एक सबसेट है, लेकिन मुझे एक समाधान मिला। – SyBer

+0

डुप्लिकेट प्रश्न देखें, और "जोडा" और "डेटटाइमज़ोन" की खोज करें। –

उत्तर

90

ओपी इस सवाल का जवाब एक चल JVM का एक उदाहरण के लिए डिफ़ॉल्ट समय क्षेत्र बदलने के लिए, user.timezone प्रणाली गुण सेट:

java -Duser.timezone=GMT ... <main-class> 

आप के लिए की जरूरत है ResultSet डेटाबेस से दिनांक/समय/टाइमस्टैम्प ऑब्जेक्ट्स को पुनर्प्राप्त करते समय विशिष्ट समय क्षेत्र सेट करें, getXXX विधियों का दूसरा रूप उपयोग करें जो Calendar ऑब्जेक्ट लेता है:

Calendar tzCal = Calendar.getInstance(TimeZone.getTimeZone("GMT")); 
ResultSet rs = ...; 
while (rs.next()) { 
    Date dateValue = rs.getDate("DateColumn", tzCal); 
    // Other fields and calculations 
} 

या, एक PreparedStatement में तारीख की स्थापना:

Calendar tzCal = Calendar.getInstance(TimeZone.getTimeZone("GMT")); 
PreparedStatement ps = conn.createPreparedStatement("update ..."); 
ps.setDate("DateColumn", dateValue, tzCal); 
// Other assignments 
ps.executeUpdate(); 

ये सुनिश्चित करेंगे कि डेटाबेस में संग्रहीत मूल्य संगत है जब डेटाबेस स्तंभ समयक्षेत्र जानकारी नहीं रखता।

java.util.Date और java.sql.Date कक्षाएं यूटीसी में वास्तविक समय (मिलीसेकंड) स्टोर करती हैं। इन आउटपुट पर किसी अन्य टाइमज़ोन पर प्रारूपित करने के लिए, SimpleDateFormat का उपयोग करें। तुम भी एक कैलेंडर वस्तु का उपयोग कर मूल्य के साथ एक समय क्षेत्र संबद्ध कर सकते हैं:

TimeZone tz = TimeZone.getTimeZone("<local-time-zone>"); 
//... 
Date dateValue = rs.getDate("DateColumn"); 
Calendar calValue = Calendar.getInstance(tz); 
calValue.setTime(dateValue); 
+0

संपूर्ण JVM के लिए टाइमज़ोन सेट करने के बारे में ध्यान देने योग्य एक बात यह है कि यह लॉगिंग के रूप में ऐसी सभी चीज़ों को प्रभावित करता है। अगर यह वांछित प्रभाव है तो ध्यान में रखने के लिए बस कुछ। –

+0

हाँ, वह ठीक है। उल्लेख करने के लिए बस एक बिंदु, कि मैं वास्तव में उपयोगकर्ता को .timezone सीधे कोड में सेट करता हूं, बल्कि -D पैरामीटर के माध्यम से। – SyBer

+5

@SyBer: यह काम करता है लेकिन आपको यह सुनिश्चित करना होगा कि आप TimeZone.getDefault() विधि को किसी भी विधि को कॉल करने से पहले इसे सेट कर लें। यदि नहीं, तो आपको कुछ भ्रम होगा क्योंकि डिफ़ॉल्ट निष्पादन के बाद डिफॉल्ट कैश किया गया है। इसका मतलब यह भी है कि यदि आप एपीआई/लाइब्रेरी (सादा दृश्य से छिपाए गए) के अंदर ऐसा करते हैं तो यह एक समस्या हो सकती है - आप जो भी कर रहे हैं उसे भारी दस्तावेज करना सुनिश्चित करें। –

6

मैं डीबी से कच्चे रूप (लंबे टाइमस्टैम्प या जावा की तारीख) में समय प्राप्त कर दूंगा, और उसके बाद इसे प्रारूपित करने के लिए SimpleDateFormat का उपयोग कर सकता हूं, या कैलेंडर को कुशलतापूर्वक उपयोग कर सकता हूं। दोनों मामलों में आपको इसका उपयोग करने से पहले ऑब्जेक्ट्स का टाइमज़ोन सेट करना चाहिए।

SimpleDateFormat.setTimeZone(..) और Calendar.setTimeZone(..) जानकारी के लिए देखें

10

मैं Windows 2003 सर्वर के लिए JVM समय क्षेत्र सेट करना पड़ा है क्योंकि यह हमेशा नई तिथि के लिए जीएमटी लौटे();

-Duser.timezone=America/Los_Angeles

या अपने उचित समय क्षेत्र। समय क्षेत्र की एक सूची ढूंढना थोड़ा चुनौतीपूर्ण साबित हुआ ...

यहां दो सूची हैं;

http://wrapper.tanukisoftware.com/doc/english/prop-timezone.html

http://publib.boulder.ibm.com/infocenter/iseries/v5r3/index.jsp?topic=%2Frzatz%2F51%2Fadmin%2Freftz.htm

3

आप समय क्षेत्र TimeZone.setDefault() का उपयोग कर बदल सकता है - यहां तक ​​कि केवल अस्थायी रूप से कुछ कार्यों के लिए।

+0

कोई अपराध नहीं, लेकिन अस्थायी रूप से एक वैश्विक स्थिर स्थिति को संशोधित करना बहुत बुरा विचार है ... –

12

इसके अलावा, आप JVM समय क्षेत्र इस तरह

System.setProperty("user.timezone", "EST"); 

या -Duser.timezone=GMT JVM args में सेट कर सकते हैं।

7
मेरे लिए

, बस त्वरित SimpleDateFormat,

private static final SimpleDateFormat GMT = new SimpleDateFormat("yyyy-MM-dd"); 
    private static final SimpleDateFormat SYD = new SimpleDateFormat("yyyy-MM-dd"); 
    static { 
     GMT.setTimeZone(TimeZone.getTimeZone("GMT")); 
    SYD.setTimeZone(TimeZone.getTimeZone("Australia/Sydney")); 
    } 

तो अलग समय क्षेत्र के साथ दिनांक स्वरूप।

1

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

-2

यदि आप केवल जीएमटी समय को इंटीगर के साथ प्राप्त करना चाहते हैं: var currentTime = new Date(); var currentYear = '2010' var currentMonth = 10; वर currentDay = '30 ' वर currentHours = '20' वर currentMinutes = '20 ' वर currentSeconds = 00' ' वर currentMilliseconds = 00' '

currentTime.setFullYear(currentYear); 
currentTime.setMonth((currentMonth-1)); //0is January 
currentTime.setDate(currentDay); 
currentTime.setHours(currentHours); 
currentTime.setMinutes(currentMinutes); 
currentTime.setSeconds(currentSeconds); 
currentTime.setMilliseconds(currentMilliseconds); 

var currentTimezone = currentTime.getTimezoneOffset(); 
currentTimezone = (currentTimezone/60) * -1; 
var gmt =""; 
if (currentTimezone !== 0) { 
    gmt += currentTimezone > 0 ? ' +' : ' '; 
    gmt += currentTimezone; 
} 
alert(gmt) 
+2

जो मुझे जावास्क्रिप्ट (! = जावा) जैसा दिखता है। – Phil

1

वाह। मुझे पता है कि यह एक प्राचीन धागा है लेकिन मैं बस इतना कह सकता हूं कि किसी भी उपयोगकर्ता-स्तरीय कोड में TimeZone.setDefault() को कॉल न करें। यह हमेशा पूरे JVM के लिए टाइमज़ोन सेट करता है और लगभग हमेशा एक बहुत बुरा विचार है। Joda.time लाइब्रेरी या जावा 8 में नई डेटटाइम क्लास का उपयोग करना सीखें जो joda.time लाइब्रेरी के समान है।

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

  • कोई संबंधित समस्या नहीं^_^