मैं Milliseconds में एक लंबे युग से जावा 8 LocalDate कैसे बना सकता हूं?


218

मेरे पास एक बाहरी एपीआई है जो मुझे तारीखों के रूप में देता है long एस के में दर्शाता है, जो कि युग की शुरुआत से मिलीसेकंड के रूप में दर्शाया गया है।

पुरानी शैली जावा एपीआई के साथ, मैं बस Dateइसके साथ से निर्माण करूंगा

Date myDate = new Date(startDateLong)

Java 8 LocalDate/ LocalDateTimeकक्षाओं में क्या समान है ?

मैं के प्रतिनिधित्व वाले समय में बिंदु परिवर्तित करने में दिलचस्पी है longएक करने के लिए LocalDateमेरे वर्तमान स्थानीय समय क्षेत्र में।


6
वैसे आपको इस बात की शुरुआत करनी होगी कि आप किस समय क्षेत्र की परवाह करते हैं। एक "मिलीसेकंड जब से युग" मूल्य आपको समय में एक पल देता है ... जो विभिन्न समय क्षेत्रों में विभिन्न तिथियों को संदर्भित कर सकता है। ध्यान रखें कि java.util.Dateवास्तव में कभी भी इस तरह से तारीख नहीं थी LocalDate- यह समय के साथ-साथ एक पल था।
जॉन स्कीट

2
: इस सवाल की जाँच करें stackoverflow.com/questions/21242110/... , जिनमें से रूपांतरण को शामिल किया गया java.util.DateमेंLocalDate
hotzst

3
नोट: यह Q & A उन लोगों के लिए भी मूल्यवान है, जो File.lastModified()(युगांतर मिलिस) को बदलने की कोशिश कर रहे हैं LocalDate(Time)
केविनरपे

जवाबों:


403

यदि आपके पास युग के बाद से मिलीसेकंड है और वर्तमान स्थानीय समयक्षेत्र का उपयोग करके उन्हें स्थानीय तिथि में परिवर्तित करना चाहते हैं, तो आप उपयोग कर सकते हैं

LocalDate date =
    Instant.ofEpochMilli(longValue).atZone(ZoneId.systemDefault()).toLocalDate();

लेकिन ध्यान रखें कि सिस्टम का डिफ़ॉल्ट समय क्षेत्र भी बदल सकता है, इस प्रकार समान है long मूल्य बाद के रनों में भी भिन्न परिणाम उत्पन्न कर सकता है, यहाँ तक कि एक ही मशीन पर भी।

इसके अलावा, ध्यान रखें कि LocalDate, इसके विपरीतjava.util.Date , वास्तव में एक तारीख का प्रतिनिधित्व करता है, न कि किसी तिथि और समय का।

अन्यथा, आप एक का उपयोग कर सकते हैं LocalDateTime:

LocalDateTime date =
    LocalDateTime.ofInstant(Instant.ofEpochMilli(longValue), ZoneId.systemDefault());

2
अधिक विस्तृत विवरण के लिए मेरी ओर से +1। वैसे, यहां तक ​​कि एक गैर-प्रणाली क्षेत्र भी बदल सकता है (tzupdater-tool द्वारा या jdk-change) और इसलिए पहले और बाद में अलग-अलग परिणाम उत्पन्न करें।
मेनो होच्स्चिल्ड

2
@ मेनो होशचाइल्ड: मैं हार्डकोडेड टाइमज़ोन पर ध्यान केंद्रित नहीं कर रहा था, बल्कि उपयोगकर्ता द्वारा निर्दिष्ट टाइमज़ोन के साथ तुलना कर रहा था, एक कॉन्फ़िगरेशन फ़ाइल या पर्यावरण चर से पढ़ा जाता है, जहां प्रोग्रामर स्वाभाविक रूप से मानता है कि बदल सकता है। हार्डकोडेड टाइमज़ोन वास्तव में सिस्टम डिफॉल्ट की तरह होते हैं; प्रोग्रामर को यह सोचकर लुभाया जाता है कि वे कभी नहीं बदल रहे थे ...
Holger

2
@ डैडीमॉड LocalDateTime.ofEpochSecond(…)को एक वास्तविक की आवश्यकता होती है ZoneOffset, लेकिन ZoneId.systemDefault()एक रिटर्न देता है ZoneId। एक ZoneIdबार जब आप की बात कर रहे हैं की बात पर निर्भर करता है, विभिन्न ऑफसेट करने के लिए मैप कर सकते हैं। यही कारण है कि क्या LocalDateTime.ofInstantनिर्दिष्ट परिवर्तित करने के लिए, आप के लिए करता है ZoneIdप्रदान की के अनुसार Instant
होल्गर

2
युग को यूटीसी के रूप में परिभाषित किया गया है और इसलिए इसे टाइमजोन स्वतंत्र होना चाहिए, इसलिए जोनआईडी हमेशा यूटीसी होना चाहिए।
22

2
@PlexQ एपोच के लिए निर्दिष्ट टाइमज़ोन प्रासंगिक नहीं है, जो वास्तव में टाइमज़ोन स्वतंत्र है, लेकिन परिणामी के शब्दार्थ के लिए LocalDateया LocalDateTime। आप अपनी इच्छानुसार किसी भी समयक्षेत्र को निर्दिष्ट कर सकते हैं, जब तक कि वह इन परिणाम वस्तुओं के बाद के उपयोग के अनुरूप हो। जब आप विभिन्न तरीकों से बनाई गई कई वस्तुओं से निपटते हैं, तो सोचें। स्थानीय दिनांक या डेटासेट के लिए विशिष्ट उपयोग के मामलों में सिस्टम डिफ़ॉल्ट टाइमज़ोन शामिल है, जैसे LocalDateTime.now()cases LocalDateTime.ofInstant(Instant.ofEpochMilli(System.currentTimeMillis()), ZoneId.systemDefault())
होलेंजर

37

आप Instant.ofEpochMilli (लंबे) से शुरू कर सकते हैं :

LocalDate date =
  Instant.ofEpochMilli(startDateLong)
  .atZone(ZoneId.systemDefault())
  .toLocalDate();

5
समय क्षेत्र के बारे में स्पष्ट होने के लिए +1। यदि छोड़ दिया जाता है, तो JVM के वर्तमान डिफ़ॉल्ट समय क्षेत्र को निश्चित रूप से तिथि निर्धारित करने में लागू किया जाता है। किसी भी क्षण के लिए तारीख समय क्षेत्र के अनुसार दुनिया भर में बदलती है क्योंकि पूर्व में एक नया दिन होता है।
तुलसी बॉर्क

12

मुझे लगता है कि मेरे पास एक बेहतर जवाब है।

new Timestamp(longEpochTime).toLocalDateTime();

नई समय-चिह्न (टीएस) .toLocalDateTime () toLocalDate ()।
Stepan याकोवेंको

5
मेरा मतलब है - अगर आपको javal.sql.Timestamp का आयात करने में कोई आपत्ति नहीं है, जो कि जावा के अखंड प्रकृति को देखते हुए मुझे लगता है कि यह ठीक है क्योंकि यह JVM का सिर्फ एक हिस्सा है ... लेकिन थोड़ा बदबूदार लगता है, लेकिन मैं अभी भी इसे बेहतर मानता हूं यह मान्यता प्राप्त है कि यह यूटीसी में मौलिक रूप से है।
22

1
Timestampवर्ग खराब तरीके से तैयार है और लंबे समय पुराना है। आपका कोड JVM के समय क्षेत्र सेटिंग का उपयोग करेगा, लेकिन चूंकि यह सेटिंग आपके प्रोग्राम के किसी अन्य भाग या उसी JVM में चल रहे किसी अन्य प्रोग्राम द्वारा परिवर्तित की जा सकती है, इसलिए हम यह सुनिश्चित नहीं कर सकते कि यह क्या है।
ओले वीवी

1
यह स्पष्ट करना हमेशा बेहतर होता है कि किस समय का उपयोग किया जाता है। पुराने java.sql.Timestamp का उपयोग करने से सिस्टम टाइमज़ोन के निहित रूप से लागू होने का दोष है जो आमतौर पर डेवलपर्स के बीच भ्रम का कारण बनता है।
रुस्लान

3

Timezones और एक तरफ सामान, एक बहुत ही सरल विकल्प हो new Date(startDateLong)सकता हैLocalDate.ofEpochDay(startDateLong / 86400000L)


6
मुझे लगता है कि आपको कम से कम यह बताना चाहिए कि 86400000L का क्या मतलब है।
BAERUS

3
मैंने सोचा कि यह बहुत आसान है कि यह एक दिन में मिलीसेकंड की संख्या है।
माइकल पिफेल

7
कुछ के लिए यह है, और मुझे लगा कि केवल यह समझ में आता है, लेकिन पुनर्गणना के बिना कितने एमएस एक दिन वास्तव में है, मुझे यकीन नहीं होगा। सिर्फ अपने लिए बोल रहा हूं, मैं इस संख्या को इतनी अच्छी तरह से नहीं जानता कि मैं अपने आप जानता हूं कि यह क्या है।
BAERUS

यह भी ध्यान दें कि स्वीकृत उत्तर वास्तव में सबसे अच्छा उत्तर है, यह सिर्फ भारी लगता है। मेरा सिंपल हैक मेरे लिए बहुत मायने रखता है। यह अफ़सोस की बात java.timeहै कि इसमें शामिल नहीं है DateTimeConstantsजैसा कि जोडा ने किया था।
माइकल पिफेल

2
java.util.concurrent.TimeUnit.MILLISECONDS.toDays(startDateLong)
वडज़िम

1

अपने लंबे मूल्य के साथ अब .getTime () बदलें।

//GET UTC time for current date
        Date now= new Date();
        //LocalDateTime utcDateTimeForCurrentDateTime = Instant.ofEpochMilli(now.getTime()).atZone(ZoneId.of("UTC")).toLocalDateTime();
        LocalDate localDate = Instant.ofEpochMilli(now.getTime()).atZone(ZoneId.of("UTC")).toLocalDate();
        DateTimeFormatter dTF2 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
        System.out.println(" formats as " + dTF2.format(utcDateTimeForCurrentDateTime));

-6

एक विशिष्ट मामले में जहां आपके एपेक सेकंड्स टाइमस्टैम्प एसक्यूएल से आता है या किसी तरह एसक्यूएल से संबंधित है, आप इसे इस तरह से प्राप्त कर सकते हैं:

long startDateLong = <...>

LocalDate theDate = new java.sql.Date(startDateLong).toLocalDate();

2
यह वास्तव में पूछे गए प्रश्न से बहुत संबंधित नहीं है
केतन आर

@ केतन, मैं असहमत हूं। सवाल "कैसे एक LocalDateसे प्राप्त करने के लिए epoch-millis" है, और मैं दिखाती हूं कि, java.sql.Dateशॉर्टहैंड के लिए कैसे उपयोग किया जाता है। यह दृष्टिकोण उस कोड में समझ में आता है जो पहले से ही कुछ क्षमता में JDBC के साथ काम कर रहा है, और यह ठीक काम करता है। यदि आप अभी भी आश्वस्त नहीं हैं, तो बताएं कि यह प्रारंभिक प्रश्न से कैसे संबंधित नहीं है।
एम। प्रोखोरोव

2
यदि आप प्रश्न को पढ़ते हैं, तो यह कहता है "बाहरी एपीआई जो मुझे तारीखों के रूप में लौटाता है" और आप बता रहे हैं कि यदि आप SQL से लंबी तारीख प्राप्त कर रहे हैं तो यह रूपांतरण कैसे किया जा सकता है। आपका उत्तर दिनांक रूपांतरण के एक बहुत ही विशिष्ट मामले की व्याख्या करता है, लेकिन यह वास्तव में उस प्रश्न के लिए प्रासंगिक नहीं है जो ed.Your स्पष्टीकरण से पूछा गया है, हालांकि कुछ अन्य संबंधित quesiton का एक वैध उत्तर हो सकता है।
केतन आर

@KetanR, अगर किसी को SQL से लंबी तारीख मिलती है, तो मैं उसका स्कीमा बदलने की सलाह दूंगा, ताकि उसे अब इस तरह के फॉर्म में तारीखें न मिलें। हालाँकि, अगर किसी को मिलिस-टाइमस्टैम्प के रूप में कहीं और (बाहरी एपीआई) से तारीखें मिलती हैं, और तुरंत JDBC क्वेरी बनाने के लिए इन तारीखों का उपयोग करता है, तो java.sql.Dateदृष्टिकोण सबसे कम उपलब्ध, कोड-वार में से है, और मैं कहूंगा कि यह सब उपयोगी नहीं है Instantअंत परिणाम समान होने पर सभी मध्यवर्ती लौकिक वस्तुओं के साथ यद्यपि जाना ।
एम। प्रोखोरोव

2
जैसा कि मैंने पहले ही कहा है और आपकी नवीनतम व्याख्या से स्पष्ट है, आपका उत्तर सही है, लेकिन प्रश्न पर हाथ के लिए नहीं। प्रश्न कहता है: "मैं अपने वर्तमान स्थानीय समयक्षेत्र में लंबे समय तक लोकलडेट द्वारा दर्शाए गए समय में बिंदु को परिवर्तित करने में रुचि रखता हूं। "आपका उत्तर बताता है:" मिलिस-टाइमस्टैम्प के रूप में तारीखें प्राप्त करें, और तुरंत JDBC प्रश्न बनाने के लिए इन तिथियों का उपयोग करें "। मुझे समझ नहीं आया कि यहाँ क्या स्पष्ट नहीं है?
केतन आर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.