1970 में जावा में रिटर्न के लिए लंबी तिथि परिवर्तित


118

मेरे पास लंबे मूल्यों के साथ सूची है (उदाहरण के लिए: 1220227200, 1220832000, 1221436800 ...) जो मैंने वेब सेवा से डाउनलोड किया था। मुझे इसे तिथियों में बदलना होगा। दुर्भाग्य से इस तरह, उदाहरण के लिए:

Date d = new Date(1220227200);

1 जनवरी 1970 का रिटर्न। कोई भी इसे सही तरीके से बदलने का कोई और तरीका जानता है?


क्या आप बता सकते हैं कि आप किन मूल्यों की उम्मीद करते हैं? सेकंड / मिलीसेकंड का प्रश्न एक मान्य हो सकता है, लेकिन 1220227200 1/1/1970 नहीं है। ऐसा लग रहा है कि आप कंस्ट्रक्टर को 0 पास कर रहे हैं। कुछ और कोड मदद कर सकते हैं।
SJuan76

1
@mmmiki - आपको एक उत्तर स्वीकार करना चाहिए
स्टीवर्ट

यह 15 जून 1970 को लौटा, यहाँ, पहली जनवरी नहीं।
njzk2

FYI करें, बहुत त्रुटिपूर्ण तिथि-समय की कक्षाएं जैसे कि java.util.Date, java.util.Calendarऔर java.text.SimpleDateFormatअब विरासत है , जावा 8 और बाद में निर्मित java.time कक्षाओं द्वारा ली गई है ।
बेसिल बोर्ख

जवाबों:


161

Dateनिर्माता (लिंक पर क्लिक करें!) के रूप में समय को स्वीकार करता है longमें मिलीसेकेंड , नहीं सेकंड। आपको इसे 1000 से गुणा करना होगा और यह सुनिश्चित करना होगा कि आप इसकी आपूर्ति करते हैं long

Date d = new Date(1220227200L * 1000);

यह यहाँ दिखाता है

Sun Aug 31 20:00:00 GMT-04: 00 2008


22
या वैकल्पिक रूप से, Date d = new Date(TimeUnit.SECONDS.toMillis(1220227200L));एक क्लीनर और कम जादू-नंबरों के समाधान के लिए उपयोग करें।
प्रियादु नीमरे

56

tl; डॉ

java.time.Instant                    // Represent a moment as seen in UTC. Internally, a count of nanoseconds since 1970-01-01T00:00Z.
.ofEpochSecond( 1_220_227_200L )     // Pass a count of whole seconds since the same epoch reference of 1970-01-01T00:00Z.

आपका डेटा पता है

लोग एक युग के बाद से एक नंबर के रूप में ट्रैकिंग समय में कई प्राथमिकताओं का उपयोग करते हैं । इसलिए जब आप कुछ संख्याओं को एक युग के बाद से गिनती के रूप में व्याख्या करने के लिए प्राप्त करते हैं, तो आपको यह निर्धारित करना होगा:

  • क्या काल? विभिन्न प्रणालियों में
    कई युगों की तिथियों का उपयोग किया गया है। आमतौर पर इस्तेमाल किया जाने वाला पोसिक्स / यूनिक्स समय है , जहां यूटीसी में 1970 का पहला क्षण है। लेकिन आपको यह युग नहीं मानना चाहिए ।
  • क्या परिशुद्धता?
    क्या हम युग के बाद से सेकंड, मिलीसेकंड , माइक्रोसेकंड या नैनोसेकंड्स बात कर रहे हैं ?
  • क्या समय क्षेत्र?
    आमतौर पर यूकोच / जीएमटी टाइम ज़ोन में एक गिनती होती है , यानी किसी भी समय ज़ोन की भरपाई नहीं होती है। लेकिन कभी-कभी, जब अनुभवहीन या तिथि-समय अज्ञानी प्रोग्रामर को शामिल करते हैं, तो निहित समय क्षेत्र हो सकता है।

आपके मामले में, जैसा कि अन्य ने उल्लेख किया है, आपको यूनिक्स युग के बाद से कुछ सेकंड दिए गए हैं। लेकिन आप उन सेकंड्स को एक कंस्ट्रक्टर के पास भेज रहे हैं, जो मिलीसेकंड की अपेक्षा करता है। तो समाधान 1,000 से गुणा करना है।

सीख सीखी:

  • निर्धारित करें, ग्रहण न करें, प्राप्त डेटा का अर्थ।
  • डॉक्टर पढ़ें ।

पूरे सेकंड, मिलीसेकंड, माइक्रोसेकंड, और नैनोसेकंड सहित तिथि-समय प्रणालियों में रिज़ॉल्यूशन के विभिन्न ग्रैन्युलैरिटी दिखाते ग्राफ।

आपका डेटा

आपका डेटा पूरे सेकंड में लगता है। यदि हम 1970 की शुरुआत का एक युग मानते हैं, और यदि हम यूटीसी समय क्षेत्र मानते हैं, तो1,220,227,200 सितंबर 2008 के पहले दिन का पहला क्षण है।

Joda समय

जावा के साथ बंडल java.util.Date और। कैलेन्डर कक्षाएं बेहद कष्टकारी हैं। इनसे बचें। इसके बजाय जोडा-टाइम लाइब्रेरी या नए जावा.टाइम पैकेज का उपयोग करेंजावा 8 (और जोडा-टाइम से प्रेरित) में बंडल गए ।

ध्यान दें कि जूडा DateTime-टाइम के विपरीत, जोडा-टाइम एक सही मायने में अपने ही निर्धारित समय क्षेत्र को जानता है । इसलिए नीचे दिए गए Joda-Time 2.4 कोड के उदाहरण में, ध्यान दें कि हम पहले UTC की डिफ़ॉल्ट धारणा का उपयोग करके मिलीसेकंड को पार्स करते हैं। फिर, दूसरी बात, हम समायोजित करने के लिए पेरिस का समय क्षेत्र निर्दिष्ट करते हैं। ब्रह्मांड के समय में एक ही पल, लेकिन अलग - अलग दीवार-घड़ी का समय । प्रदर्शन के लिए, हम फिर से यूटीसी को समायोजित करते हैं। लगभग हमेशा बेहतर एक अनुमानित डिफ़ॉल्ट (अक्सर तारीख-समय के काम में परेशानी का कारण) पर भरोसा करने के बजाय अपने वांछित / अपेक्षित समय क्षेत्र को स्पष्ट करना बेहतर होता है।

DateTime का निर्माण करने के लिए हमें मिलीसेकंड की आवश्यकता होती है। इसलिए अपना सेकंड का इनपुट लें, और एक हजार से गुणा करें। ध्यान दें कि परिणाम 64-बिट होना चाहिए longक्योंकि हम 32-बिट को ओवरफ्लो करेंगे int

long input = 1_220_227_200L;  // Note the "L" appended to long integer literals.
long milliseconds = ( input * 1_000L ); // Use a "long", not the usual "int". Note the appended "L".

निर्माणकर्ता को मिलीसेकंड की वह संख्या फ़ीड करें। यह विशेष रूप से निर्माणकर्ता मानता है कि गिनती 1970 के यूनिक्स युग से है। इसलिए निर्माण के बाद वांछित समय क्षेत्र को समायोजित करें।

उचित समय क्षेत्र के नाम, महाद्वीप और शहर / क्षेत्र के संयोजन का उपयोग करें । कभी भी 3 या 4 अक्षर कोड का उपयोग न करें जैसे ESTकि वे न तो मानकीकृत हैं और न ही अद्वितीय हैं।

DateTime dateTimeParis = new DateTime( milliseconds ).withZone( DateTimeZone.forID( "Europe/Paris" ) );

प्रदर्शन के लिए, समय क्षेत्र को फिर से समायोजित करें।

DateTime dateTimeUtc = dateTimeParis.withZone( DateTimeZone.UTC );
DateTime dateTimeMontréal = dateTimeParis.withZone( DateTimeZone.forID( "America/Montreal" ) );

सांत्वना देना। ध्यान दें कि मॉन्ट्रियल में तिथि कैसे भिन्न होती है, क्योंकि नया दिन यूरोप में शुरू हुआ है लेकिन अभी तक अमेरिका में नहीं है।

System.out.println( "dateTimeParis: " + dateTimeParis );
System.out.println( "dateTimeUTC: " + dateTimeUtc );
System.out.println( "dateTimeMontréal: " + dateTimeMontréal );

जब चला।

dateTimeParis: 2008-09-01T02:00:00.000+02:00
dateTimeUTC: 2008-09-01T00:00:00.000Z
dateTimeMontréal: 2008-08-31T20:00:00.000-04:00

java.time

Joda-Time के निर्माताओं ने हमें इसके प्रतिस्थापन, java.time में प्रवास करने के लिए कहा है जैसे ही सुविधाजनक हो फ्रेमवर्क। जबकि Joda-Time का सक्रिय रूप से समर्थन जारी है, भविष्य के सभी विकास java.time कक्षाओं और थ्रीटेन-एक्स्ट्रा प्रोजेक्ट में उनके एक्सटेंशन पर किए जाएंगे।

जावा-टाइम फ्रेमवर्क जेएसआर 310 द्वारा परिभाषित किया गया है और इसे जावा 8 और बाद में बनाया गया है। जावा.टाइम क्लासेस को थ्री टेन-बैकपोर्ट प्रोजेक्ट पर जावा 6 और 7 में और थ्री टेनबैप प्रोजेक्ट में एंड्रॉइड पर वापस पोर्ट किया गया है ।

एक Instantमें समय रेखा पर एक पल है यूटीसी नैनोसेकंड के एक संकल्प के साथ। यूटीसी में इसकी अवधि 1970 का पहला क्षण है।

Instant instant = Instant.ofEpochSecond( 1_220_227_200L );

प्राप्त करने के लिए एक ऑफसेट-यूटीसी से आवेदन करेंZoneOffsetOffsetDateTime

बेहतर, अभी तक, यदि ज्ञात हो, तो ए ZoneIdप्राप्त करने के लिए समय क्षेत्र लागू करें ZonedDateTime

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );

जावा में सभी तिथि-समय प्रकारों की तालिका, दोनों आधुनिक और विरासत


1
चीयर्स दोस्त। महान व्याख्या। मुझे 1970 से नया डेटटाइम (<लॉन्ग नंबर>) मिल रहा था जब मुझे महसूस हुआ कि मैं इसे सेकंड में दे रहा हूं और मिलीसेकंड में आवश्यक है
सुयश दीक्षित

40

ऐसा लगता है कि आपके लंबे सेकंड सेकंड हैं, और मिलीसेकंड नहीं। दिनांक निर्माणकर्ता को मिलिस के रूप में समय लगता है, इसलिए

Date d = new Date(timeInSeconds * 1000);

4
@ f1sh: मैं नीच नहीं था, लेकिन मूल जवाब अलग था। उन्होंने इसे 5 मिनट की अनुग्रह अवधि के भीतर संपादित किया।
बालुसक

स्पष्टीकरण के लिए धन्यवाद। यही कारण है कि नीचे की ओर SO है ...: - /
f1sh

11

केवल कैलेंडर ऑब्जेक्ट पर मिलों में समय सेट करें

Calendar c = Calendar.getInstance();
c.setTimeInMillis(1385355600000l);
System.out.println(c.get(Calendar.YEAR));
System.out.println(c.get(Calendar.MONTH));
System.out.println(c.get(Calendar.DAY_OF_MONTH));
// get Date
System.out.println(c.getTime());

9

वे शायद सेकंड में टाइमस्टैम्प हैं और मिलीसेकंड में नहीं जो जावा नई तिथि (लंबे) निर्माण के लिए आवश्यक है। बस उन्हें 1000 से गुणा करें और आपको सर्वव्यापी होना चाहिए।


23
अधिक ठीक से 30000 मिलीसेकंड भी धीमा
SJuan76

5

लंबे समय तक, सबसे अधिक संभावना, एपोक टाइमस्टैम्प के अनुरूप हैं , और मूल्य हैं:

1220227200 = सोम, 01 सितंबर 2008 00:00:00 GMT

1220832000 = सोम, 08 सितंबर 2008 00:00:00 GMT

1221436800 = सोम, 15 सितंबर 2008 00:00:00 GMT

एक इन लंबे मानों को java.util में परिवर्तित कर सकते हैं । ध्यान दें, तथ्य को ध्यान में रखते हुए java.util.Date मिलिसेक का उपयोग करता है - जैसा कि पहले संकेत दिया गया था, लेकिन कुछ दोष के साथ - जैसे:

// note: enforcing long literals (L), without it the values would just be wrong.
Date date = new Date(1220227200L * 1000L); 

अब, तिथि को सही ढंग से प्रदर्शित करने के लिए, java.text.DateFormat का उपयोग सचित्र रूप में किया जा सकता है:

DateFormat df = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL);
df.setTimeZone(TimeZone.getTimeZone("UTC"));
System.out.println("Wrong date time value: " + date);
System.out.println("Correct date time value: " + df.format(date));

नीचे DateFormat का उपयोग और उपयोग किए बिना java.util.ate में परिवर्तित लंबे मान को प्रदर्शित करने के परिणाम हैं:

Date wrong (off by 2 hours): Mon Sep 01 02:00:00 CEST 2008
Correct date : Monday, 1 September 2008 00:00:00 o'clock UTC


2

1220227200 15 जनवरी 1980 (और वास्तव में नई तिथि (1220227200) .toString () "थू जन 15 03:57:07 सीईटी 1970") से मेल खाती है। यदि आप किसी दिनांक को एक लंबा मान देते हैं, जो कि 01/01/1970 से पहले है, तो यह वास्तव में 01/01/1970 की तारीख को लौटाएगा। सुनिश्चित करें कि आपके मूल्य इस स्थिति में नहीं हैं (82800000 से कम)।


2

दिनांक प्रारूप को समायोजित करने के साथ इसे आज़माएं।

long longtime = 1212580300;
SimpleDateFormat dateFormat = new SimpleDateFormat("MMddyyHHmm");
Date date = (Date) dateFormat.parseObject(longtime + "");
System.out.println(date);

नोट: 24 घंटे या 12 घंटे के चक्र के लिए जाँच करें।


0

नई तारीख (संख्या) एक तारीख है कि लौटती है number 1 जनवरी 1970 के बाद मिलीसेकंड है। ऑड्स आप तारीख प्रारूप घंटे, मिनट और सेकंड नहीं दिखा रहे हैं, यह देखने के लिए कि यह 1 जनवरी 1970 के बाद का है।

आपको सही पार्सिंग रूटिंग के अनुसार तारीख को पार्स करने की आवश्यकता है। मुझे नहीं पता कि एक 1220227200 क्या है, लेकिन अगर यह 1 JAN 1970 के बाद सेकंड है, तो इसे मिलीसेकंड प्राप्त करने के लिए गुणा करें। यदि यह नहीं है, तो इसे किसी तरह से 1970 के बाद मिलीसेकंड में बदल दें (यदि आप java.util.Date का उपयोग जारी रखना चाहते हैं)।


0

मेरे लिये कार्य करता है। आप शायद इसे 1000 के साथ गुणा करना चाहते हैं, क्योंकि आपको जो कुछ भी मिलता है वह 1970 से सेकंड के लिए है और आपको 1 जून 1970 से मिलीसेकंड पास करना होगा

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.