2011-09-20 4 views
83

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

Date d = new Date(1220227200); 

रिटर्न 1 जनवरी 1970 को कोई भी एक और तरीका है इसे सही ढंग से परिवर्तित करने के लिए पता है?

+0

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

+1

@mmmiki - आपको एक उत्तर – Stewart

+0

स्वीकार करना चाहिए, यह जनवरी 15, 1 9 70 को लौटाता है, यहां 1 जनवरी नहीं। – njzk2

उत्तर

111

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

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

यह यहाँ से पता चलता

सूर्य अगस्त 31 20:00:00 GMT-04: 00 2008

+10

या वैकल्पिक रूप से, 'दिनांक डी = नई तिथि (TimeUnit.SECONDS.toMillis (1220227200L)) का उपयोग करें;' क्लीनर और कम * जादू-numberesque * समाधान के लिए। –

35

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

Date d = new Date(timeInSeconds * 1000); 
+4

इसे डाउनवोट क्यों मिला? यहां, काउंटर-वोट का आनंद लें। – f1sh

+4

@ f1sh: मैंने डाउनवोट नहीं किया, लेकिन मूल जवाब अलग था। उन्होंने इसे 5 मिनट की छूट अवधि के भीतर संपादित किया। स्पष्टीकरण के लिए – BalusC

+0

धन्यवाद। यह स्वामित्व में डाउनसाइड एसओ है ...: -/ – f1sh

8

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

+0

बह .. 30 सेकंड बहुत धीमी: पी –

+19

अधिक उचित 30000 मिलीसेकंड बहुत धीमी – SJuan76

0

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

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

0

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

1

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

3

इस प्रयास करें:

Calendar cal = Calendar.getInstance(); 
cal.setTimeInMillis(1220227200 * 1000); 
System.out.println(cal.getTime()); 
3

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

१२२०२२७२०० = सोम, 01 सितं, 2008 00:00:00 GMT

१२२०८३२००० = सोम, 08 सितं, 2008 00:00:00 GMT

१२२१४३६८०० = सोम, 15 सितं, 2008 00:00:00 GMT

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

// 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)); 

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 
7

केवल कैलेंडर पर मिलों में समय निर्धारित: नीचे का उपयोग करने और DateFormat का उपयोग कर बिना java.util.Date परिवर्तित लंबे मूल्य प्रदर्शित करने के परिणाम हैं आपत्ति

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()); 
36

tl; डॉ

Instant.ofEpochSecond(1_220_227_200L) 

नो योर डाटा

लोग एक epoch के बाद से एक नंबर के रूप में समय पर नज़र रखने में विभिन्न precisions का उपयोग करें। तो जब आप एक अवधि के बाद कुछ संख्या गिनती के रूप में व्याख्या की जा करने के लिए प्राप्त करने के लिए, आप यह निर्धारित करना चाहिए:

  • क्या युग?
    Many epochs dates विभिन्न प्रणालियों में उपयोग किया गया है। आम तौर पर POSIX/Unix time होता है, जहां युग 1 9 70 में यूटीसी में पहला पल है। लेकिन आपको इस युग को मानना ​​नहीं चाहिए।
  • क्या सटीकता है?
    क्या हम युग के बाद सेकंड, milliseconds, microseconds, या nanoseconds बात कर रहे हैं?
  • किस समय क्षेत्र?
    आमतौर पर युग के बाद से एक गिनती UTC/जीएमटी समय क्षेत्र में है, यानी, इसमें कोई समय क्षेत्र ऑफसेट नहीं है। लेकिन कभी-कभी, अनुभवहीन या डेट-टाइम अज्ञानी प्रोग्रामर शामिल होने पर, एक अंतर्निहित समय क्षेत्र हो सकता है।

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

सबक सीखा:

  • निर्धारित करें, यह न मानें, प्राप्त डेटा के अर्थ।
  • the doc पढ़ें।

Graph showing various granularities of resolution in date-time systems including whole seconds, milliseconds, microseconds, and nanoseconds.

अपने डेटा

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

Joda समय

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

ध्यान दें कि j.u.Date के विपरीत, जोडा-टाइम में DateTime वास्तव में अपना स्वयं का सौंपा time zone जानता है। तो उदाहरण में जोडा-टाइम 2.4 कोड नीचे देखा गया है, ध्यान दें कि हम पहले यूटीसी की डिफ़ॉल्ट धारणा का उपयोग करके मिलीसेकंड का विश्लेषण करते हैं। फिर, दूसरी बात, हम समायोजित करने के लिए पेरिस का समय क्षेत्र असाइन करते हैं। ब्रह्मांड की समयरेखा में एक ही पल, लेकिन अलग wall-clock time। प्रदर्शन के लिए, हम यूटीसी को फिर से समायोजित करते हैं। निहित डिफ़ॉल्ट (अक्सर डेट-टाइम काम में परेशानी का कारण) पर भरोसा करने के बजाए अपने वांछित/अपेक्षित समय क्षेत्र को स्पष्ट रूप से निर्दिष्ट करने के लिए लगभग हमेशा बेहतर होता है।

हमें डेटटाइम बनाने के लिए मिलीसेकंड की आवश्यकता है। तो सेकंड का अपना इनपुट लें, और एक हजार से गुणा करें। ध्यान दें कि परिणाम 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". 

फ़ीड जो कि कन्स्ट्रक्टर को मिलीसेकंड की गिनती है। उस विशेष निर्माता का मानना ​​है कि गिनती 1 9 70 के यूनिक्स युग से है। इसलिए निर्माण के बाद वांछित समय क्षेत्र समायोजित करें।

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

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 समय के निर्माताओं ने हमसे कहा है अब उसके स्थान पर करने के लिए स्थानांतरित करने के लिए, java.time ढांचा जैसे ही सुविधाजनक है। जबकि जोडा-टाइम सक्रिय रूप से समर्थित है, सभी भावी विकास जावाटाइम कक्षाओं और उनके एक्सटेंशन को थ्रीटेन-अतिरिक्त परियोजना में किया जाएगा।

जावा-टाइम फ्रेमवर्क JSR 310 द्वारा परिभाषित किया गया है और जावा 8 और बाद में बनाया गया है। Java.time कक्षाओं को ThreeTen-Backport प्रोजेक्ट पर और ThreeTenABP प्रोजेक्ट में एंड्रॉइड के लिए जावा 6 & 7 पर वापस पोर्ट किया गया है।

एक InstantUTC में टाइमलाइन पर नैनोसेकंड के संकल्प के साथ एक पल है। इसका युग यूटीसी में 1 9 70 का पहला पल है।

Instant instant = Instant.ofEpochSecond(1_220_227_200L); 

एक offset-from-UTCZoneOffset एक OffsetDateTime प्राप्त करने के लिए लागू करें।

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

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

चीयर्स दोस्त। महान स्पष्टीकरण। मुझे 1 9 70 से नया डेटटाइम () मिल रहा था जब मुझे एहसास हुआ कि मैं इसे सेकंड में दे रहा था और मिलीसेकंड में आवश्यक था –

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^