जावा: यूनिक्स टाइमस्टैम्प से तारीख


237

मुझे एक यूनिक्स टाइमस्टैम्प को डेट ऑब्जेक्ट में बदलने की आवश्यकता है।
मैंने यह कोशिश की:

java.util.Date time = new java.util.Date(timeStamp);

टाइमस्टैम्प मूल्य है: 1280512800

दिनांक "2010/07/30 - 22:30:00" होना चाहिए (जैसा कि मैं इसे PHP द्वारा प्राप्त करता हूं) लेकिन इसके बजाय मुझे मिलता है Thu Jan 15 23:11:56 IRST 1970

यह कैसे किया जाना चाहिए?


3
यदि आप जावा 8 या नए का उपयोग करते हैं: इस उत्तर पर एक नज़र डालें: stackoverflow.com/a/24703644/1115554
17:11

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

जवाबों:


429

के लिए 1280512800, गुणा 1000 से, जावा के बाद से मिलीसेकेंड उम्मीद कर रही है:

java.util.Date time=new java.util.Date((long)timeStamp*1000);

यदि आपके पास पहले से ही मिलीसेकंड था, तो बस new java.util.Date((long)timeStamp);

से प्रलेखन :

दिनांक ऑब्जेक्ट आवंटित करता है और मानक आधार समय "युग" के रूप में जाना जाता है, अर्थात् 1 जनवरी, 1970, 00:00:00 GMT के बाद से निर्दिष्ट संख्या का प्रतिनिधित्व करने के लिए इसे आरंभ करता है।


40
कास्ट (long)बहुत महत्वपूर्ण है: इसके बिना पूर्णांक ओवरफ्लो होता है।
मनिरी

2
@ टॉमास्क java.util.Dateवर्ग का पूरी तरह से योग्य नाम है। Dateसंभवतया ठीक वही बात है बशर्ते आप java.utilअपनी कक्षा में पैकेज आयात करें ।
पाब्लो सांता क्रूज़

5
लंबे समय के लिए कलाकारों की जरूरत नहीं है। समय = नया java.util.Date (टाइमस्टैम्प * 1000L) ठीक वैसे ही काम करता है (क्योंकि 1000L एक लंबा है, टाइमस्टैम्प गुणा होने से पहले एक लंबे समय तक बना
रहेगा

2
मैं व्यक्तिगत रूप से ऐसा करूंगा:Date time = new Date(TimeUnit.MILLISECONDS.convert(unixTimestamp, TimeUnit.SECONDS));
रयान अमरल

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

59

java.time

जावा 8 ने तारीखों और समय के साथ काम करने के लिए एक नया एपीआई पेश किया: java.time पैकेज

Java.time के साथ आप UTC, 1970-01-01T00: 00Z में 1970 के पहले क्षण के युग संदर्भ के बाद से पूरे सेकंड की अपनी गिनती को पार्स कर सकते हैं। परिणाम एक हैInstant

Instant instant = Instant.ofEpochSecond( timeStamp );

अगर आपको java.time केjava.util.Date लिए अभी तक अपडेट नहीं किए गए पुराने कोड के साथ हस्तक्षेप करने की आवश्यकता है , तो कनवर्ट करें। पुरानी कक्षाओं में जोड़े गए नए रूपांतरण विधियों को कॉल करें।

Date date = Date.from( instant );

3
हालांकि यह उत्तर तकनीकी रूप से सही है, ध्यान दें कि java.time कक्षाएं परेशानी पुराने समय-समय की कक्षाओं जैसे कि दबा देती हैं java.util.Date। पुरानी कक्षाएं विरासत हैं और इससे बचना चाहिए। जबकि आप वास्तव में / विरासत और java.time कक्षाओं से / में परिवर्तित कर सकते हैं, जब भी संभव हो java.time के साथ रहना सबसे अच्छा है।
बेसिल बॉर्क


27

लगता है कि कैलेंडर जाने का नया तरीका है:

Calendar mydate = Calendar.getInstance();
mydate.setTimeInMillis(timestamp*1000);
out.println(mydate.get(Calendar.DAY_OF_MONTH)+"."+mydate.get(Calendar.MONTH)+"."+mydate.get(Calendar.YEAR));

अंतिम पंक्ति केवल एक उदाहरण है कि इसका उपयोग कैसे किया जाए, यह एक "14.06.2012" जैसे प्रिंट करेगा।

यदि आपने टाइमस्टैम्प को बचाने के लिए System.currentTimeMillis () का उपयोग किया है तो आपको "* 1000" भाग की आवश्यकता नहीं है।

यदि आपके पास एक स्ट्रिंग में टाइमस्टैम्प है, तो आपको इसे लंबे समय तक पार्स करने की आवश्यकता है: Long.parseLong (टाइमस्टैम्प)।

https://docs.oracle.com/javase/7/docs/api/java/util/Calendar.html


8
चेतावनी: यदि timestampपूर्णांक है, तो आपको इसे (long)पहले डालना होगा , अन्यथा आप गलत तिथियों के साथ समाप्त हो जाएंगे। mydate.setTimeInMillis((long) timestamp*1000);
स्वेनकुडीजा

मैंने लिंक तय कर दिया है।
रिकेट

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

26

tl; डॉ

Instant.ofEpochSecond( 1_280_512_800L )

2010-07-30T18: 00: 00Z

java.time

जावा में बनाया गया नया जावा.टाइम फ्रेमवर्क और बाद में जोडा-टाइम का उत्तराधिकारी है।

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

Instant instant = Instant.ofEpochSecond( 1_280_512_800L );

तत्काल .toString (): 2010-07-30T18: 00: 00Z

उस कोड को IdeOne.com पर लाइव देखें ।

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

Asia/Kabulया Asia/Tehranसमय क्षेत्र?

आपने यहां देखे गए 18:00 के बजाय 22:30 का समय मान प्राप्त करने की सूचना दी। मुझे संदेह है कि आपकी PHP उपयोगिता संक्षेप में UTC से समायोजित करने के लिए डिफ़ॉल्ट समय क्षेत्र लागू कर रही है। यहाँ मेरा मूल्य UTC है, Z(संक्षेप में Zulu, UTC का अर्थ है) द्वारा हस्ताक्षरित है । किसी भी मौका आपके मशीन ओएस या PHP के लिए Asia/Kabulया Asia/Tehranसमय क्षेत्र निर्धारित है ? मुझे लगता है कि जैसा कि आप IRSTअपने आउटपुट में रिपोर्ट करते हैं जिसका स्पष्ट रूप से ईरान समय है। वर्तमान में 2017 में गर्मियों के समय के साथ संचालित होने वाले एकमात्र क्षेत्र हैं जो UTC से साढ़े चार घंटे आगे हैं।

के रूप में , या , के प्रारूप में एक उचित समय क्षेत्र नाम निर्दिष्ट करें । 3-4 पत्र संक्षिप्त नाम का उपयोग कभी नहीं इस तरह के रूप या या वे कर रहे हैं के रूप में नहीं सच समय क्षेत्र, नहीं मानकीकृत, और यहां तक कि अद्वितीय नहीं (!)।continent/regionAmerica/MontrealAfrica/CasablancaPacific/AucklandESTISTIRST

यदि आप किसी विशेष क्षेत्र के समय क्षेत्र के लेंस के माध्यम से अपना क्षण देखना चाहते हैं, तो ए ZoneIdपाने के लिए आवेदन करें ZonedDateTime। अभी भी एक साथ एक ही पल, लेकिन एक अलग दीवार-घड़ी के समय के रूप में देखा जाता है ।

ZoneId z = ZoneId.of( "Asia/Tehran" ) ;
ZonedDateTime zdt = instant.atZone( z );  // Same moment, same point on timeline, but seen as different wall-clock time.

2010-07-30T22: 30 + 04: 30 [एशिया / तेहरान]

Java.time से विरासत कक्षाओं में परिवर्तित

आपको नए जावा.टाइम कक्षाओं के साथ रहना चाहिए। लेकिन आवश्यकता पड़ने पर आप पुराने में बदल सकते हैं।

java.util.Date date = java.util.Date.from( instant );

Joda समय

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

FYI करें, एक Joda-Time DateTime के लिए निर्माणकर्ता समान है: एक long(नहीं int!) का उत्पादन करने के लिए एक हजार से गुणा करें ।

DateTime dateTime = new DateTime( ( 1_280_512_800L * 1000_L ), DateTimeZone.forID( "Europe/Paris" ) );

कुख्यात परेशान java.util.Date और। कैलेन्डर कक्षाओं से बचने के लिए सर्वश्रेष्ठ। लेकिन अगर आपको एक तारीख का उपयोग करना चाहिए, तो आप Joda-Time से परिवर्तित कर सकते हैं।

java.util.Date date = dateTime.toDate();

जावा के बारे में

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

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

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

आप अपने डेटाबेस से सीधे java.time वस्तुओं का आदान-प्रदान कर सकते हैं । JDBC 4.2 या उसके बाद के JDBC ड्राइवर का अनुपालन करें । तार की कोई जरूरत नहीं, कक्षाओं की कोई जरूरत नहीं ।java.sql.*

Java.time कक्षाएं कहाँ से प्राप्त करें?

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


11

दिनांक का निर्माण समय मान को मिलीसेकंड में होने की उम्मीद करता है। 1000 के साथ अपने टाइमस्टैम्प के मूल्य को गुणा करें, फिर कंस्ट्रक्टर को पास करें।


7

यदि आप किसी अलग मशीन पर टाइमस्टैम्प मान परिवर्तित कर रहे हैं, तो आपको उस मशीन के समय क्षेत्र की भी जांच करनी चाहिए। उदाहरण के लिए;

यदि आप EST या UTC टाइमज़ोन के साथ चलते हैं, तो उपरोक्त उल्लंघनों में अलग-अलग दिनांक मान होंगे।

समयक्षेत्र सेट करने के लिए; यूटीसी के लिए उर्फ, आप बस फिर से लिख सकते हैं;

    TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
    java.util.Date time= new java.util.Date((Long.parseLong(timestamp)*1000));

6
मैं इसे दोबारा नहीं लिखूंगा क्योंकि यह पूरे jvm के लिए टाइमज़ोन सेट करता है न कि केवल पार्सिंग प्रक्रिया के लिए!


0

कभी-कभी आपको समायोजन के साथ काम करने की आवश्यकता होती है।

कास्ट का उपयोग लंबे समय तक न करें! Nanoadjustment का उपयोग करें।

उदाहरण के लिए, ट्रेडिंग के लिए Oanda Java API का उपयोग करके आप UNIX प्रारूप के रूप में डेटाटाइम प्राप्त कर सकते हैं।

उदाहरण के लिए: 1592523410.590566943

    System.out.println("instant with nano = " + Instant.ofEpochSecond(1592523410, 590566943));
    System.out.println("instant = " + Instant.ofEpochSecond(1592523410));

आपको मिला:

instant with nano = 2020-06-18T23:36:50.590566943Z
instant = 2020-06-18T23:36:50Z

इसका भी प्रयोग करें:

 Date date = Date.from( Instant.ofEpochSecond(1592523410, 590566943) );

-4
Date d = new Date(i * 1000 + TimeZone.getDefault().getRawOffset());

3
कुछ और पाठों के बिना, यह स्पष्ट नहीं है कि इस प्रश्न में कई अन्य लोगों की तुलना में यह उत्तर बेहतर क्यों है। क्या आप स्पष्ट कर सकते हैं?
डंकन जोन्स

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