जावा दिनांक ऑब्जेक्ट के लिए यूनिक्स युग का समय


84

मेरे पास UNIX ईपॉच समय वाला एक स्ट्रिंग है , और मुझे इसे जावा तिथि ऑब्जेक्ट में बदलने की आवश्यकता है।

String date = "1081157732";
DateFormat df = new SimpleDateFormat(""); // This line
try {
  Date expiry = df.parse(date);
 } catch (ParseException ex) {
  ex.getStackTrace();
}

चिह्नित लाइन वह जगह है जहां मुझे परेशानी हो रही है। मैं काम नहीं कर सकता क्या SimpleDateFormat () के लिए तर्क होना चाहिए, या यहां तक ​​कि अगर मैं SimpleDateFormat () का उपयोग करना चाहिए।


जोडा-टाइम लाइब्रेरी का उपयोग करके उदाहरण कोड के साथ मिलीसेकंड के बीच दिनांक-समय में परिवर्तित करने पर एक समान प्रश्न के लिए मेरा विस्तृत जवाब देखें ।
बेसिल बॉर्क

private String getDateString(long timeInMilliseconds) { SimpleDateFormat formatter = new SimpleDateFormat("EEE, d MMM yyyy 'at' HH:mm:ss z"); return formatter.format(timeInMilliseconds); }
जेवीजप्लस

जवाबों:


125

कैसे बस के बारे में:

Date expiry = new Date(Long.parseLong(date));

संपादित करें: rde6173 के उत्तर के अनुसार और प्रश्न में निर्दिष्ट इनपुट पर करीब से नज़र डालने पर, "1081157732" एक सेकंड-आधारित युग के रूप में प्रकट होता है, इसलिए आप पार्सलोंग () से 1000 को गुणा करने के लिए 1000 से गुणा करना चाहते हैं मिलीसेकंड, जो जावा की डेट कंस्ट्रक्टर का उपयोग करता है, इसलिए:

Date expiry = new Date(Long.parseLong(date) * 1000);

4
क्या यह तकनीकी रूप से गलत नहीं होगा क्योंकि यह लीप सेकंड में नहीं आता है?
मकीज पाइचोटका

1
Maciej, op का "सेकंड-आधारित" युग पहले से ही लीप सेकंड के लिए जिम्मेदार है, यह "सेकंड"-आधारित है। तो यह उत्तर सही है।
thecarpy

1
यह मुझे गलत मान देता है यदि 1000 से गुणा किया जाता है, तो क्या इसे करने का एक बेहतर तरीका नहीं है?
ईशान

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

सवाल तब से था, जब यूटीसी है, जबकि तिथि जीएमटी से लंबे होने की उम्मीद है, क्या वे एक ही हैं?
ल्यूक

37

1 जनवरी, 1970 से एपोच सेकंड की संख्या है ।

इसलिए:

String epochString = "1081157732";
long epoch = Long.parseLong( epochString );
Date expiry = new Date( epoch * 1000 );

अधिक जानकारी के लिए: http://www.epochconverter.com/


1
यह एक इलाज का काम करता है ... IDK Y यह उत्तर के रूप में जाँच नहीं किया गया है :)
Makky

इस उत्तर के लिए धन्यवाद। मैं यहाँ एक युग से एक तारीख को तुरंत बताने की कोशिश कर रहा था और परिणाम हमेशा 1970 में किसी दिन था, और ऐसा इसलिए था क्योंकि मैं अनजाने में जावा मिलीसेकंड दे रहा था, सेकंड नहीं :)
लो-टैन

24

java.time

java.timeजावा 8 और बाद में निर्मित ढांचे का उपयोग करना ।

import java.time.LocalDateTime;
import java.time.Instant;
import java.time.ZoneId;

long epoch = Long.parseLong("1081157732");
Instant instant = Instant.ofEpochSecond(epoch);
ZonedDateTime.ofInstant(instant, ZoneOffset.UTC); # ZonedDateTime = 2004-04-05T09:35:32Z[UTC]

इस स्थिति में आपको ZonedDateTimeइसे यूटीसी टाइम ज़ोन में तारीख के रूप में चिह्नित करने के लिए बेहतर उपयोग करना चाहिए क्योंकि जावा द्वारा उपयोग किए जाने वाले यूनिक्स समय में यूटीसी को यूकोच में परिभाषित किया गया है।

ZoneOffsetUTC समय क्षेत्र के लिए एक आसान स्थिरांक है, जैसा कि ऊपर अंतिम पंक्ति में देखा गया है। इसके सुपरक्लास का ZoneIdउपयोग अन्य समय क्षेत्रों में समायोजित करने के लिए किया जा सकता है।

ZoneId zoneId = ZoneId.of( "America/Montreal" );

अच्छा उत्तर। मैं सुझाव दूंगा कि ड्रापिंग है LocalDateTimeऔर सिर्फ एक शो है ZonedDateTime। अधिकांश व्यावसायिक ऐप्स में, जाने ZonedDateTimeका सबसे अच्छा तरीका है। लोग अपने आप को परेशानियों में डालते हैं / LocalXXXप्रकारों के साथ भ्रमित होते हैं।
बेसिल बोर्क


0

बेहतर अभी तक, JodaTime का उपयोग करें । स्ट्रिंग्स को और स्ट्रिंग्स में पार्स करना बहुत आसान है। क्या धागा सुरक्षित भी है। इसे लागू करने में समय लगेगा।


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

0

सेकंड टाइम स्टांप को मिलीसेकेंड टाइम स्टैम्प में बदलने के लिए। आप इस तरह TimeUnit API और नीट का उपयोग कर सकते हैं।

long milliSecondTimeStamp = MILLISECONDS.convert(secondsTimeStamp, SECONDS)


-1

हम .... अगर मैं गलत नहीं हूं, तो यूनिक्स एपोक समय वास्तव में वैसा ही है

System.currentTimeMillis()

इसलिए लिख रहा हूं

try {
    Date expiry = new Date(Long.parseLong(date));
}
catch(NumberFormatException e) {
    // ...
}

काम करना चाहिए (और उस तारीख को बहुत तेज़ होना चाहिए)


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