दिलचस्प पोस्ट
API V3 के साथ प्रति पृष्ठ कई Google मानचित्र कैसे प्रदर्शित करें रनटाइम पर विशेषता का पैरामीटर बदलें YouTube लाइव प्रसारण के दौरान 'चैट' बॉक्स के माध्यम से दर्ज की गई टिप्पणियों की फ़ीड कैसे प्राप्त करें? एंड्रॉइड में एक रेखा कैसे खींचना है जांचें कि क्या कुछ पायथन में सूची में नहीं है कैसे हाइबरनेट के साथ एक समग्र कुंजी मैप करने के लिए? \ B और \ r का उपयोग सी में संदर्भ: चर गुंजाइश क्या है, जहां से चर "अनपरिर्वरित चर" त्रुटियों और कहां से सुलभ हैं? क्या पता लगाने का कोई तरीका है कि कोई ब्राउज़र विंडो वर्तमान में सक्रिय नहीं है? javascript – document.write त्रुटि? एक आंतरिक वर्ग के साथ जावा कोड एक तीसरा SomeClass $ 1. वर्ग फ़ाइल क्यों बनाता है? जावा हैशसेट में डुप्लिकेट हैं यदि तत्व में संशोधन किया गया है उत्तरदायी सीएसएस सर्किल "उदार" का क्या उपयोग है? मैं अजगर कोड लाइन-बाय-लाइन कैसे प्रोफ़ाइल कर सकता हूं?

क्या जावा एसक्यूएल.टैमस्टैम्प समयक्षेत्र विशिष्ट है?

मुझे डीबी में यूटीसी डेटटाइम को स्टोर करना होगा
मैंने विशिष्ट समय-क्षेत्र में दिए गए दिनांक समय को यूटीसी में बदल दिया है। इसके लिए मैं नीचे कोड का पालन किया।
मेरा इनपुट दिनांक "20121225 10:00:00 Z" समय क्षेत्र "एशिया / कलकत्ता" है
मेरा सर्वर / डीबी (ओरेकल) एक ही समय क्षेत्र (आईएसटी) "एशिया / कलकत्ता" में चल रहा है

इस विशिष्ट समयक्षेत्र में दिनांक ऑब्जेक्ट प्राप्त करें

String date = "20121225 10:00:00 Z"; String timeZoneId = "Asia/Calcutta"; TimeZone timeZone = TimeZone.getTimeZone(timeZoneId); DateFormat dateFormatLocal = new SimpleDateFormat("yyyyMMdd HH:mm:ss z"); //This date object is given time and given timezone java.util.Date parsedDate = dateFormatLocal.parse(date + " " + timeZone.getDisplayName(false, TimeZone.SHORT)); if (timeZone.inDaylightTime(parsedDate)) { // We need to re-parse because we don't know if the date // is DST until it is parsed... parsedDate = dateFormatLocal.parse(date + " " + timeZone.getDisplayName(true, TimeZone.SHORT)); } //assigning to the java.sql.TimeStamp instace variable obj.setTsSchedStartTime(new java.sql.Timestamp(parsedDate.getTime())); 

डीबी में स्टोर करें

  if (tsSchedStartTime != null) { stmt.setTimestamp(11, tsSchedStartTime); } else { stmt.setNull(11, java.sql.Types.DATE); } 

आउटपुट

डीबी (ओरेकल) ने उसी दिए गए dateTime: "20121225 10:00:00 को संग्रहीत किया है dateTime: "20121225 10:00:00 यूटीसी में नहीं।

मैंने नीचे एसक्यूएल से पुष्टि की है

  select to_char(sched_start_time, 'yyyy/mm/dd hh24:mi:ss') from myTable 

मेरा डीबी सर्वर एक ही समय क्षेत्र "एशिया / कलकत्ता" पर भी चल रहा है

यह मुझे नीचे दिखावे देता है

  1. Date.getTime() यूटीसी में नहीं है
  2. या टाइमस्टैम्प में डीबी में भंडारण करते समय टाइमज़ोन का प्रभाव होता है मैं यहाँ क्या गलत कर रहा हूं?

एक और प्रश्न:

क्या स्थानीय समयक्षेत्र में java.util.date में timeStamp.toString() प्रिंट होगा? यूटीसी नहीं है?

वेब के समाधान से एकत्रित समाधान "क्या जावा एसक्यूएल.टैमस्टैम्प समयक्षेत्र विशिष्ट है?"

यद्यपि यह setTimestamp(int parameterIndex, Timestamp x) लिए स्पष्ट रूप से निर्दिष्ट नहीं है setTimestamp(int parameterIndex, Timestamp x) तो setTimestamp(int parameterIndex, Timestamp x, Calendar cal) द्वारा स्थापित नियमों का पालन करना setTimestamp(int parameterIndex, Timestamp x, Calendar cal) :

दिए गए Calendar ऑब्जेक्ट का उपयोग करते हुए निर्दिष्ट java.sql.Timestamp मान के लिए निर्दिष्ट पैरामीटर सेट करता है ड्रायवर Calendar ऑब्जेक्ट का उपयोग करता है एक एसक्यूएल TIMESTAMP मान, जो कि चालक तब डेटाबेस को भेजता है। एक Calendar ऑब्जेक्ट के साथ, ड्राइवर टाइमस्टैंप को एक कस्टम समय क्षेत्र को ध्यान में रख कर गणना कर सकता है। यदि कोई Calendar ऑब्जेक्ट निर्दिष्ट नहीं है, तो ड्रायवर डिफ़ॉल्ट टाइम ज़ोन का उपयोग करता है, जो वर्चुअल मशीन को एप्लिकेशन चल रहा है।

जब आप setTimestamp(int parameterIndex, Timestamp x) से कॉल करते हैं तो जेडीबीसी ड्राइवर उस समय क्षेत्र में टाइमस्टैम्प की तारीख और समय की गणना के लिए वर्चुअल मशीन का समय क्षेत्र का उपयोग करता है। यह तारीख और समय डेटाबेस में संग्रहीत है, और यदि डेटाबेस कॉलम समय क्षेत्र की जानकारी संग्रहीत नहीं करता है, तो ज़ोन के बारे में कोई भी जानकारी खो जाती है (जिसका अर्थ है कि इसका उपयोग करने के लिए डेटाबेस का उपयोग करने के लिए आवेदन (ओं) पर निर्भर है एक ही समय क्षेत्र लगातार या एक अन्य योजना के साथ समय क्षेत्र (यानी एक अलग कॉलम में स्टोर) को समझने के लिए आते हैं।

उदाहरण के लिए: आपका स्थानीय समय क्षेत्र GMT + 2 है आप "2012-12-25 10:00:00 यूटीसी" स्टोर करते हैं। डाटाबेस में जमा वास्तविक मान "2012-12-25 12:00:00" है। आप इसे पुनः प्राप्त करते हैं: आप इसे "2012-12-25 10:00:00 यूटीसी" के रूप में पुनः प्राप्त कर getTimestamp(..) लेकिन सिर्फ अगर आप इसे getTimestamp(..) का उपयोग करते हुए प्राप्त करते हैं, लेकिन जब एक अन्य एप्लिकेशन समय क्षेत्र में डेटाबेस को एक्सेस करता है GMT +0, यह "2012-12-25 12: 00:00 यूटीसी" के रूप में टाइमस्टैम्प को पुनः प्राप्त करेगा।

यदि आप उसे किसी भिन्न समयक्षेत्र में संग्रहीत करना चाहते हैं, तो आपको आवश्यक समयक्षेत्र में कैलेंडर आवृत्ति के साथ setTimestamp(int parameterIndex, Timestamp x, Calendar cal) का उपयोग करना होगा। बस सुनिश्चित करें कि आप मान प्राप्त करते समय एक ही समय क्षेत्र के समकक्ष प्राप्तकर्ता का उपयोग करते हैं (यदि आप TIMESTAMP उपयोग अपने डेटाबेस में समयक्षेत्र जानकारी के बिना) करते हैं।

तो, मान लें कि आप वास्तविक जीएमटी टाईमजोन को स्टोर करना चाहते हैं, आपको उपयोग करने की आवश्यकता है:

 Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT")); stmt.setTimestamp(11, tsSchedStartTime, cal); 

जेडीबीसी 4.2 के साथ एक शिकायत चालक को java.time.LocalDateTime (और java.time.LocalTime ) को TIMESTAMP (और TIME ) के get/set/updateObject माध्यम से। java.time.Local* वर्ग समय के बिना हैं, इसलिए कोई रूपांतरण लागू नहीं किया जा सकता है (हालांकि यदि आपके कोड ने कोई विशिष्ट समय क्षेत्र मान लिया है, तो यह समस्या का एक नया सेट खोल सकता है)।

मुझे लगता है कि सही जवाब जावा होना चाहिए। Sql.Timestamp समय क्षेत्र विशिष्ट नहीं है टाइमस्टैम्प जावा का एक समग्र संलयन है। यूटिल.डेट और एक अलग नैनोसेकंड मूल्य। इस वर्ग में कोई समयक्षेत्र जानकारी नहीं है इस प्रकार इस श्रेणी की तारीख 1 जनवरी, 1 9 70, 00:00:00 जीएमटी + नैनोस के बाद से केवल मिलीसेकेंड की संख्या रखती है।

PreparedStatement.setTimestamp में (इंट पैरामीटर इन्डैक्स, टाइमस्टैम्प एक्स, कैलेंडर कैल) कैलेंडर का उपयोग डिफ़ॉल्ट समयक्षेत्र बदलने के लिए ड्राइवर द्वारा किया जाता है। लेकिन टाइमस्टैम्प अभी भी जीएमटी में मिलीसेकंड रखता है।

एपीआई इस बारे में स्पष्ट नहीं है कि जेडीबीसी ड्राइवर कैलेंड का उपयोग कैसे कर सकता है। प्रदाताओं की व्याख्या कैसे की जा सकती है, इसके बारे में मुझे बेझिझक लगता है, उदाहरण के लिए, पिछली बार जब मैंने MySQL 5.5 कैलेंडर के साथ काम किया था, तो चालक ने केवल तैयार किए गए कैलेंडर दोनों को तैयार किया था .सेटटैमस्टैम्प और ResultSet.getTimestamp

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

 java -Duser.timezone="America/New_York" GetCurrentDateTimeZone 

इसके अलावा:

 to_char(new_time(sched_start_time, 'CURRENT_TIMEZONE', 'NEW_TIMEZONE'), 'MM/DD/YY HH:MI AM') 

रूपांतरण को सही तरीके से संभालने में भी मूल्य हो सकता है। यहां से लिया गया

Mysql के लिए, हमारे पास एक सीमा है ड्राइवर Mysql डॉक्टर में , हमारे पास है:

MySQL कनेक्टर / जे के लिए कुछ ज्ञात मुद्दे और सीमाएं हैं: जब संबंधक / जे परिणाम स्वरूप पर GetTimeStamp () पद्धति का उपयोग करके डेलाइट सेविंग टाइम (डीएसटी) स्विच दिन के लिए टाइमस्टैप्स को पुनः प्राप्त करता है, तो कुछ लौटा मूल्य गलत हो सकते हैं। किसी डेटाबेस से कनेक्ट होने पर निम्न कनेक्शन विकल्पों का उपयोग करके त्रुटियों को बचाया जा सकता है:

 useTimezone=true useLegacyDatetimeCode=false serverTimezone=UTC 

इसलिए, जब हम इस मापदंडों का उपयोग नहीं करते हैं और हम setTimestamp or getTimestamp साथ या कैलेंडर के बिना setTimestamp or getTimestamp को कॉल setTimestamp or getTimestamp , तो हमारे पास jvm setTimestamp or getTimestamp में टाइमस्टैम्प है।

उदाहरण :

जीवीएम टाइमज़न जीएमटी + 2 है डेटाबेस में, हमारे पास एक टाइमस्टैम्प है: 1461100256 = 19/04/16 21: 10: 56,000000000 GMT

 Properties props = new Properties(); props.setProperty("user", "root"); props.setProperty("password", ""); props.setProperty("useTimezone", "true"); props.setProperty("useLegacyDatetimeCode", "false"); props.setProperty("serverTimezone", "UTC"); Connection con = DriverManager.getConnection(conString, props); ...... Calendar nowGMT = Calendar.getInstance(TimeZone.getTimeZone("GMT")); Calendar nowGMTPlus4 = Calendar.getInstance(TimeZone.getTimeZone("GMT+4")); ...... rs.getTimestamp("timestampColumn");//Oracle driver convert date to jvm timezone and Mysql convert date to GMT (specified in the parameter) rs.getTimestamp("timestampColumn", nowGMT);//convert date to GMT rs.getTimestamp("timestampColumn", nowGMTPlus4);//convert date to GMT+4 timezone 

पहला तरीका रिटर्न: 1461100256000 = 1 9/04/2016 – 21:10:56 GMT

दूसरी विधि रिटर्न: 1461100256000 = 1 9/04/2016 – 21:10:56 GMT

तीसरा तरीका रिटर्न: 1461085856000 = 1 9/04/2016 – 17:10:56 GMT

ओरेकल के बजाय, जब हम एक ही कॉल का उपयोग करते हैं, तो हमारे पास:

पहला तरीका रिटर्न: 14610 93056000 = 1 9/04/2016 – 19:10:56 GMT

दूसरी विधि रिटर्न: 1461100256000 = 1 9/04/2016 – 21:10:56 GMT

तीसरा तरीका रिटर्न: 1461085856000 = 1 9/04/2016 – 17:10:56 GMT

एनबी: ओरेकल के लिए पैरामीटर निर्दिष्ट करना आवश्यक नहीं है।