java - जावा दिनांक और टाइमस्टैम्प से तत्काल ZonedDateTime UTC




sql timestamp (3)

मेरे पास एक जावा एप्लिकेशन है जिसमें मैं यूटीसी में समय चाहूंगा। वर्तमान में, कोड java.util.Date और java.sql.Timestamp का एक मिश्रण का उपयोग करता है। यूटीसी में समय पाने के लिए, प्रोग्रामर से पहले मुझे इस्तेमाल किया गया था:

तिथि के लिए:

 Date.from(ZonedDateTime.now(ZoneOffset.UTC)).toInstant();

टाइमस्टैम्प के लिए:

 Timestamp.from(ZonedDateTime.now(ZoneOffset.UTC).toInstant());

हालांकि मैंने इस कोड के साथ कई परीक्षण खुद चलाए हैं और इन दोनों पंक्तियों की वर्तमान तिथि / समय (मेरे वर्तमान समयक्षेत्र में) वापस आ गई है। मैंने जो कुछ पढ़ा है, वह प्रतीत होता है कि दिनांक / टाइमस्टैम्प के पास ज़ोनऑफ़सेट मान नहीं है, लेकिन मुझे इसके बारे में ठोस कथन नहीं मिल रहा है।

क्या किसी भी समय ज़ोन (यूटीसी) को दिनांक या टाइमस्टैम्प ऑब्जेक्ट्स के अंदर रखने के लिए, या क्या मुझे कुछ रिफैक्टरिंग करने की ज़रूरत है और क्या मेरे ज़ोन के दौरान वास्तविक ज़ोनडेटाइट ऑब्जेक्ट का उपयोग करना है? क्या इस ज़ोन डेटटाइम ऑब्जेक्ट को एसक्यूएल के लिए वर्तमान टाइमस्टैम्प ऑब्जेक्ट के साथ संगत भी किया जाएगा?

उदाहरण:

public static void main (String args[])
{
    ZonedDateTime zonedDateTime = ZonedDateTime.now(ZoneOffset.UTC);
    Timestamp timestamp = Timestamp.from(ZonedDateTime.now(ZoneOffset.UTC).toInstant());
    Date date = Date.from(ZonedDateTime.now(ZoneOffset.UTC).toInstant());
    System.out.println("ZonedDateTime: " + zonedDateTime);
    System.out.println("Timestamp: " + timestamp);
    System.out.println("Date: " + date);
}

आउटपुट:

 ZonedDateTime: 2017-04-06T15:46:33.099Z
 Timestamp: 2017-04-06 10:46:33.109
 Date: Thu Apr 06 10:46:33 CDT 2017

Answers

जावा में, Date समय में एक बिंदु का प्रतिनिधित्व करता है। यह टाइमस्टैम्प से संबंधित नहीं है जब आप किसी Date ऑब्जेक्ट के toString() विधि को कॉल करते हैं, तो वह उस समय को प्लेटफ़ॉर्म की डिफ़ॉल्ट टाइमस्टैम्प में परिवर्तित कर देता है, उदा। यूटीसी में दिनांक / समय प्रिंट करेगा (जैसा कि यह यूटीसी के लिए डिफ़ॉल्ट समयक्षेत्र सेट करता है):

TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
ZonedDateTime zonedDateTime = ZonedDateTime.now(ZoneOffset.UTC);
Timestamp timestamp = Timestamp.from(ZonedDateTime.now(ZoneOffset.UTC).toInstant());
Date date = Date.from(ZonedDateTime.now(ZoneOffset.UTC).toInstant());
System.out.println("ZonedDateTime: " + zonedDateTime);
System.out.println("Timestamp: " + timestamp);
System.out.println("Date: " + date);

Java.time का उपयोग करना

इससे पहले कि आप प्रोग्रामर को नए आधुनिक जावा के टाइम क्लास का इस्तेमाल कर रहे थे, जो कि आज की Date , Calendar , Timestamp जैसे कुख्यात परेशानी वाले पुरानी विरासत तिथि-समय कक्षाओं को हटाते हैं।

Instant

Instant क्लास नैनोसेकंड के एक संकल्प के साथ यूटीसी में टाइमलाइन पर एक पल का प्रतिनिधित्व करता है (दशमलव अंश के नौ (9) अंक तक)। यूटीसी में वर्तमान क्षण प्राप्त करने के लिए बिल्कुल सरल है: Instant.now । अब

Instant instant = Instant.now();

परिवर्तित

आपको java.time वर्गों से चिपक जाना चाहिए और विरासत कक्षाओं से बचें। लेकिन यदि बिल्कुल जरूरी है जैसे जावा कोड के लिए अभी तक अद्यतन नहीं किए गए पुराने कोड के साथ अंतरफलक, तो आप java.time से / से कन्वर्ट कर सकते हैं। पुराने वर्गों पर नए तरीकों को देखो। विरासत वर्ग java.util.Date समकक्ष Instant

java.util.Date d = java.util.Date.from( myInstant); // To legacy from modern.
Instant instant = myJavaUtilDate.toInstant();  // To modern from legacy.

JDBC

लीगेसी डेट-टाइम क्लासेस से बचें। इसके बजाय java.time वर्ग का प्रयोग करें।

आपका जेडीबीसी 4.2 आज्ञाकारी चालक तैयार हो सकता है java.time प्रकारों को सीधे PreparedStatement::setObject और ResultSet::getObject

myPreparedStatement.setObject(  , instant ) ;

… तथा …

Instant instant = myResultSet.getObject(  , Instant.class ) ;

यदि नहीं, तो java.sql प्रकारों का उपयोग करने के लिए वापस आ जाओ, लेकिन यथासंभव संक्षिप्त। पुरानी कक्षाओं में जोड़े गए नए रूपांतरण विधियों का उपयोग करें।

myPreparedStatement.setTimestamp(  , java.sql.Timestamp.from( instant ) ) ;

… तथा …

Instant instant = myResultSet.getTimestamp(  ).toInstant() ;

ZonedDateTime लिए कोई ज़रूरत नहीं है

ध्यान दें कि हमें आपके ZonedDateTime लिए कोई ज़रूरत नहीं है जैसा आपने कहा था कि आप केवल यूटीसी में दिलचस्पी रखते थे। Instant ऑब्जेक्ट हमेशा यूटीसी में होते हैं इसका अर्थ है कि मूल कोड आपने उद्धृत किया है:

Date.from(ZonedDateTime.now(ZoneOffset.UTC)).toInstant();

... हो सकता था बस को कम कर दिया गया है:

Date.from( Instant.now() ;

नोट करें कि java.util.Date हमेशा यूटीसी में रहता है। हालांकि, स्ट्रिंग को उत्पन्न करते समय toString इसके toString JVM का वर्तमान डिफ़ॉल्ट समय क्षेत्र लागू होता है। यह विरोधी विशेषता आपको भ्रम का कोई अंत नहीं बनाता है क्योंकि आप स्टैक ओवरफ्लो पर खोज कर देख सकते हैं।

अगर आप किसी क्षेत्र की दीवार-घड़ी के समय के लेंस के माध्यम से अपने Instant ऑब्जेक्ट के यूटीसी मूल्य को देखना चाहते हैं तो ZoneId को प्राप्त करने के लिए एक समय क्षेत्र ZoneId असाइन करें।

continent/region के प्रारूप में उचित समय क्षेत्र नाम निर्दिष्ट करें, जैसे America/Montreal , Africa/Casablanca , या Pacific/Auckland । कभी भी 3-4 पत्र संक्षिप्त रूप जैसे CDT या EST या IST उपयोग न करें क्योंकि वे सही समय क्षेत्र नहीं हैं, मानकीकृत नहीं हैं, और यहां तक ​​कि अनूठे (!) भी नहीं हैं।

ZoneId z = ZoneId.of( "America/Chicago" );
ZonedDateTime zdt = instant.atZone( z );

जावा के बारे में। समय

Java.time फ्रेमवर्क जावा 8 और बाद में बनाया गया है। ये कक्षाएं परेशानी पुरानी विरासत तिथि-समय कक्षाएं जैसे कि java.util.Date , Calendar , और SimpleDateFormat

जोडा-टाइम प्रोजेक्ट, अब रखरखाव मोड में , जावा के समय की कक्षाओं के लिए प्रवासन की सलाह देते हैं।

अधिक जानने के लिए, ओरेकल ट्यूटोरियल देखें। और कई उदाहरणों और स्पष्टीकरण के लिए स्टैक अतिप्रवाह खोजें। विशिष्टता JSR 310 है

जावा को कब प्राप्त करें कक्षाएं?

तीन टन अतिरिक्त परियोजना java.time को अतिरिक्त कक्षाओं के साथ प्रदान करता है। यह प्रोजेक्ट जावा के संभावित भावी परिवर्धन के लिए एक सिद्ध मैदान है। आपको यहां कुछ उपयोगी वर्ग यहां मिल सकते हैं जैसे Interval , YearWeek , YearQuarter , और अधिक


विधि पैरामीटर का जिक्र करने का सही तरीका इस तरह है:





java sql date timestamp