Java.sql.timestamp को LocalDate (java8) java.time में कैसे बदलें?


127

Java 8 में, मैं Timestamp( a java.sql) को a LocalDate( to) में कैसे बदल सकता हूँ java.time?


1
मेरा यहाँ कुछ ऐसा ही मुद्दा था: stackoverflow.com/a/23197731/1856960 । लघु उत्तर, वास्तव में नहीं। लेकिन यह जरूरी नहीं कि बुरी चीज हो।
जेकोहिफेनेटेड

जवाबों:


196

तुम कर सकते हो:

timeStamp.toLocalDateTime().toLocalDate();

ध्यान दें कि रूपांतरण करने के लिए समय क्षेत्र का timestamp.toLocalDateTime() उपयोग किया जाएगा Clock.systemDefaultZone()यह वही हो सकता है या नहीं हो सकता है जो आप चाहते हैं।


1
इसे जावा 8. में जोड़ा गया है
एसिलियास

54
बस एक नोट, timestamp.toLocalDateTime()विधि रूपांतरण बनाने के लिए systemDefault टाइम ज़ोन का उपयोग करेगी। यह वही हो सकता है या नहीं हो सकता है जो आप चाहते हैं।
जेकोहिफ़ेनटेड

1
@jacobhyphenated कृपया स्पष्ट समय क्षेत्र का उपयोग करके उत्तर पोस्ट करें। धन्यवाद!
user482745

@ याकूबहिनेटेड टिप्पणी यहाँ अत्यंत महत्वपूर्ण है, इसलिए इसके लिए उत्थान की संख्या है। विवरण के लिए मेरा जवाब देखें stackoverflow.com/a/57101544/2032701
रुस्लान

@jacobhyphenated, LocalDateTimeहमेशा सिस्टम-डिफ़ॉल्ट टाइमज़ोन का उपयोग करता है। यही इसके नाम में "स्थानीय" का मतलब है।
एम। प्रोखोरोव

21

स्वीकृत उत्तर आदर्श नहीं है, इसलिए मैंने अपने 2 सेंट जोड़ने का फैसला किया

timeStamp.toLocalDateTime().toLocalDate();

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

अच्छा उपाय है

timestamp.toInstant().atZone(zoneId).toLocalDate()

जहां ZoneId वह समयक्षेत्र है जिसका आप उपयोग करना चाहते हैं, जो आमतौर पर या तो ZoneId.systemDefault () है, यदि आप अपने सिस्टम समयक्षेत्र का उपयोग करना चाहते हैं या कुछ हार्डकोड समयक्षेत्र जैसे कि OOffset.UTC

सामान्य दृष्टिकोण होना चाहिए

  1. हमारे वर्ग java.time.Instant सीधे java.sql.Timestamp से संबंधित है, इस तरह से सीधे संबंधित वर्ग का उपयोग करते हुए नए java8 तिथि वर्गों के लिए नि: शुल्क तोड़ दें।
  2. सही काम करने के लिए इस java8 वर्ग में अच्छी तरह से डिज़ाइन किए गए तरीकों का उपयोग करें। हमारे मामले में एटजोन (ज़ोनआईडी) ने यह स्पष्ट किया कि हम रूपांतरण कर रहे हैं और इसके लिए एक विशेष समय क्षेत्र का उपयोग कर रहे हैं।

1
मैं असहमत हूं। टाइमस्टैम्प (और दिनांक भी) में ज़ोन की कोई जानकारी नहीं है। LocalDate के पास कोई ज़ोन जानकारी नहीं है, इसलिए दोनों समान हैं। उनके बीच रूपांतरण किसी विशेष क्षेत्र के स्वतंत्र रूप से किया जा सकता है। LocalDate में कनवर्ट करने से पहले एक ZonedDateTime में कनवर्ट करने से एक टाइमज़ोन में जुड़ जाता है और फिर इसे फिर से बंद कर देता है - आपको इस तरह से करने में त्रुटि खोजने के लिए एक नॉर्थ-हार्ड मिलने की अधिक संभावना है।
स्वचालित23

5
@AutomatedMike टाइमस्टैम्प (और दिनांक भी) UTC में समय में एक बिंदु का प्रतिनिधित्व करता है। लोकलडेट समय में एक बिंदु का प्रतिनिधित्व नहीं करता है, बल्कि एक समय जैसा कि दीवार घड़ी पर देखा जाता है। कृपया उनके javadocs पढ़ें। "उनके बीच रूपांतरण किसी विशेष क्षेत्र के स्वतंत्र रूप से किया जा सकता है" - सच नहीं , नया टाइमस्टैम्प (0L)। मेरे मॉस्को टाइमज़ोन के लिए "1970-01-01T03: 00" रिटर्न "1970-01-01T03: 00"। परिणाम आपके लिए समयक्षेत्र अलग हो सकता है।
रुस्लान

1
@AutomatedMike भले ही आप toLocalDate () करके समय निकाल दें, तो यह साबित करना आसान है कि दिन गलत हो सकता है यदि टिमस्टैम्प में आधी रात के आसपास का समय हो, उदाहरण के लिए नया टाइमस्टैम्प (1000 * 60 * 60/23) .toLocalDateTime ()) toLocalDate (UTC में "1970-01-02" के लिए "1970-01-02" लौटाता है जब यह UTC में "1970-01-01" होता है।
रुस्लान

1
@AutomatedMike "एक टाइमज़ोन में जोड़ता है और फिर इसे फिर से बंद कर देता है" - बिंदु एक टाइमज़ोन को जोड़ और हटा नहीं रहा है, बल्कि एक स्पष्ट टाइमज़ोन का उपयोग करके विभिन्न धारणाओं के बीच परिवर्तित कर रहा है । यह मेरी पिछली दो टिप्पणियों के उदाहरणों के विपरीत है जहां एक टाइमज़ोन को अंतर्निहित रूप से लागू किया जाता है
रुसलान

7

मैं समय क्षेत्र को ध्यान में रखते हुए @assylias उत्तर का थोड़ा विस्तार करूँगा। विशिष्ट समय क्षेत्र के लिए LocalDateTime प्राप्त करने के लिए कम से कम दो तरीके हैं।

आप पूरे आवेदन के लिए सेटडिफॉल्ट टाइम ज़ोन का उपयोग कर सकते हैं। इसे किसी टाइमस्टैम्प से पहले बुलाया जाना चाहिए -> java.time रूपांतरण:

public static void main(String... args) {
    TimeZone utcTimeZone = TimeZone.getTimeZone("UTC");
    TimeZone.setDefault(utcTimeZone);
    ...
    timestamp.toLocalDateTime().toLocalDate();
}

या आप InInstant.atZone श्रृंखला का उपयोग कर सकते हैं:

timestamp.toInstant()
        .atZone(ZoneId.of("UTC"))
        .toLocalDate();
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.