Java 8 में LocalDateTime से मिलीसेकंड कैसे प्राप्त करें


285

मुझे आश्चर्य हो रहा है कि क्या 1-1-1970 (युग) के बाद से वर्तमान मिलीसेकंड प्राप्त करने का कोई तरीका है LocalDate , जावाLocalTime या LocalDateTimeवर्गों का ।

ज्ञात तरीका नीचे है:

long currentMilliseconds = new Date().getTime();

या

long currentMilliseconds = System.currentTimeMillis();

6
इसमें गलत क्या है System.currentTimeMillis()?
दाऊद इब्न करीम

16
@DavidWallace वह वर्तमान समय का नहीं, बल्कि डेट का समय प्राप्त करने की कोशिश कर रहा है?
अबियान नोब

2
"... वर्तमान मिलीसेकंड प्राप्त करने का एक तरीका ..."
दाऊद इब्न करीम

1-1-1970 से मिलीसेकंड की गिनती। मैं भटक रहा था अगर जावा 8 की नई कक्षाओं का उपयोग करने के लिए उन्हें प्राप्त करने के लिए एक विधि है, लोकलटाइम और लोकलडेटेट, क्योंकि मुझे एक नहीं मिला।
जॉर्ज सिगुरोग्लोगो

1
उन वर्गों के लिए मेरी समझ यह है कि यह समय की "मानव-केंद्रित" समझ है, और currentTimeMillisउस संदर्भ में अप्रासंगिक होगी। कैलेंडर को वास्तव में अच्छी परिशुद्धता के साथ दीवार-घड़ी और समय क्षेत्र और इलाके के बारे में कोई चिंता नहीं है। इसलिए लोकल टाइम से "UTC टाइम" पर वापस जाने का कोई तरीका नहीं है
Gus

जवाबों:


325

मुझे पूरी तरह से यकीन नहीं है कि आप "वर्तमान मिलीसेकंड" से क्या मतलब है, लेकिन मुझे लगता है कि यह "युग," अर्थात् 1 जनवरी, 1970 यूटीसी के बाद से मिलीसेकंड की संख्या होगी।

आप अवधि के बाद मिलीसेकेंड की संख्या जानना चाहते हैं तो अभी, तो का उपयोग System.currentTimeMillis()के रूप में Anubian Noob बताया गया है । यदि ऐसा है, तो ऐसा करने के लिए नए java.time API में से किसी का उपयोग करने का कोई कारण नहीं है।

हालाँकि, हो सकता है कि आपके पास पहले से ही LocalDateTimeया कहीं से एक समान वस्तु है और आप इसे युग के बाद से मिलीसेकंड में बदलना चाहते हैं। ऐसा सीधे तौर पर करना संभव नहीं है, क्योंकि LocalDateTimeवस्तुओं के परिवार के पास इस बात की कोई धारणा नहीं है कि वे किस समय क्षेत्र में हैं। इस प्रकार समय क्षेत्र की जानकारी को युग के सापेक्ष समय की आपूर्ति करने की आवश्यकता होती है, जो यूटीसी में है।

मान लीजिए कि आपके पास LocalDateTimeऐसा है:

LocalDateTime ldt = LocalDateTime.of(2014, 5, 29, 18, 41, 16);

आपको समय क्षेत्र की जानकारी देने की आवश्यकता है, ए ZonedDateTime । मैं लॉस एंजिल्स के समान समय क्षेत्र में हूं, इसलिए मैं ऐसा कुछ करूंगा:

ZonedDateTime zdt = ldt.atZone(ZoneId.of("America/Los_Angeles"));

बेशक, यह समय क्षेत्र के बारे में धारणा बनाता है। और ऐसे किनारे मामले हैं जो हो सकते हैं, उदाहरण के लिए, यदि स्थानीय समय डेलाइट सेविंग टाइम (समर टाइम) संक्रमण के पास एक समय का नाम देता है। आइए इन सब को अलग करें, लेकिन आपको यह जानना चाहिए कि ये मामले मौजूद हैं।

वैसे भी, यदि आप एक वैध प्राप्त कर सकते हैं, तो आप इसे ZonedDateTimeयुग के बाद से मिलीसेकंड की संख्या में बदल सकते हैं, जैसे:

long millis = zdt.toInstant().toEpochMilli();

5
ध्यान दें कि ZonedDateTime पहले से ही हैgetEpochSecond विधि (के माध्यम से ChronoZonedDateTime डिफ़ॉल्ट )। की कोई आवश्यकता नहीं है Instant
मबी

14
यकीन है, अगर आप की जरूरत है सेकंड है, नहीं मिलीसेकंड।
स्टुअर्ट मार्क्स

1
आह ठीक है, मुझे अनिश्चित था: ZonedDateTimeभी है Instantरों getNanoविधि है, तो आप सिर्फ बदलने के लिए सक्षम नहीं होगा instके साथ zdtअपने उदाहरण में?
मबी

18
Zdt.get (ChronoField.MILLI_OF_SECOND) का उपयोग करके नैनो पर गणित से बचें। Zdt.toInstant () .EpochMilli ()
JodaStephen

1
वैसे भी, जब से आप और @ दोनों ने टिप्पणी की है, मैंने लोगों को गुमराह करने से बचने के लिए अपने मूल संदेशों को हटाने का फैसला किया है।
प्रति लुंडबर्ग

81

मैं ऐसा करता हूं तो मैं निर्दिष्ट नहीं करता हूं कि समय क्षेत्र क्या है,

System.out.println("ldt " + LocalDateTime.now().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli());
System.out.println("ctm " + System.currentTimeMillis());

देता है

ldt 1424812121078 
ctm 1424812121281

जैसा कि आप देख सकते हैं कि छोटे निष्पादन समय को छोड़कर संख्या समान है।

बस अगर आपको System.currentTimeMillis पसंद नहीं है, तो उपयोग करें Instant.now().toEpochMilli()


3
नहीं, युग यूटीसी के सापेक्ष है लेकिन आपको अपने स्थानीय क्षेत्र से वर्तमान समय मिलता है।
राफेल मेम्बर्स

2
@ क्रिस्टोफफरहमारस्ट्रॉसम युग के बाद से मिली मिलीसेकंड की मात्रा एक समय के लिए स्वतंत्र तथ्य है। यह मिलीसेकंड की समान मात्रा है, चाहे आप दिन के किसी भी समय इसे कॉल करें। दो परिणाम अलग-अलग हैं क्योंकि ब्रायन की मशीन ने दूसरी कमान को निष्पादित करने के लिए 203 मिलीसेकंड लिया।
फ्लेच

क्या यूटीसी का उपयोग करना ठीक है जब उपयोगकर्ता शायद एक अलग समयक्षेत्र में हो
गिल्बर्ट्स

2
@ गिल्बर्ट आपको शायद इस सटीक कोड का उपयोग कभी नहीं करना चाहिए, जैसा कि इरादा था एपीआई का उपयोग करें। कंप्यूटर पर संग्रहीत या किसी अन्य उपयोगकर्ता को प्रेषित होने पर दिनांक-समय हमेशा यूटीसी होना चाहिए। यह आमतौर पर उपयोगकर्ता को स्थानीय समय के रूप में अपनी समय क्षेत्र सेटिंग्स का उपयोग करके प्रस्तुत किया जाना चाहिए।
ब्रायन

20

जोनआईडी से बचने के लिए आप यह कर सकते हैं:

LocalDateTime date = LocalDateTime.of(1970, 1, 1, 0, 0);

System.out.println("Initial Epoch (TimeInMillis): " + date.toInstant(ZoneOffset.ofTotalSeconds(0)).toEpochMilli());

मान के रूप में 0 प्राप्त करना, यह सही है!


8
ZoneOffset.ofTotalSeconds(0)यह उसी तरह हैZoneOffset.UTC
एंटोन नोवापाशिन

1
हाँ, यह मुझे @ एंटोनोवोपाशिन की टिप्पणी पर नाराजगी जता रहा था। चूंकि आपको UTC की आवश्यकता है, आप ठीक हैं (आप उत्तर में इसका उल्लेख करना चाहते हैं)। BTW ZoneOffsetएक उपवर्ग है ZoneId, इसलिए मैं बिल्कुल नहीं कहूंगा कि आपने इसे टाला है, लेकिन जब तक आप खुश हैं ...
Ole VV

मेरी पहली टिप्पणी थोड़ी कठोर थी, लेकिन आपत्तिजनक नहीं थी। आपने अपराध किया। मुझे क्षमा करें। मैंने इसे डिलीट कर दिया है। मुझे दूसरे तरीके से पूछने की अनुमति दें: बचने के लिए क्या कारण हो सकता है ZoneId?
ओले वीवी

@ OleV.V यूटीसी का उपयोग करना ठीक है। केवल यूटीसी समयक्षेत्र में रहने वाले लोगों के लिए नहीं है।
गिल्बर्टस

1
@ गिलबर्ट मुझे नहीं लगता कि कोई भी यूटीसी समय क्षेत्र में रहता है। UTC का उपयोग समय के लिए किया जाता है जो समय क्षेत्र में उपयोग किया जाता है एक अच्छे अभ्यास के रूप में अनुशंसित है। उदाहरण के लिए देखें भौगोलिक रूप से विविध उपयोगकर्ताओं के लिए तिथि हेरफेर / भंडारण के लिए जावा सर्वोत्तम अभ्यास । या शायद मैं आपके सवाल को समझ नहीं पाया?
ओले वीवी

15

Java 8 के बाद से आप कॉल कर सकते हैं java.time.Instant.toEpochMilli()

उदाहरण के लिए कॉल

final long currentTimeJava8 = Instant.now().toEpochMilli();

आप के रूप में एक ही परिणाम देता है

final long currentTimeJava1 = System.currentTimeMillis();

1
"आप के रूप में एक ही परिणाम देता है" ... लेकिन अधिक CPU शक्ति लेता है और कचरा संग्रहकर्ता को बहुत अधिक तनाव देता है।
VasiliNovikov

1
मैं उपरोक्त मात्रा को देखना चाहता हूं (विशेष रूप से सामान्य उपयोग के लिए - जैसे कि कुछ प्रदर्शन महत्वपूर्ण वास्तविक समय के लिए आवेदन नहीं ...)
ब्रायन एग्न्यू

11

आप java.sql.Timestampमिलीसेकंड प्राप्त करने के लिए भी उपयोग कर सकते हैं ।

LocalDateTime now = LocalDateTime.now();
long milliSeconds = Timestamp.valueOf(now).getTime();
System.out.println("MilliSeconds: "+milliSeconds);

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

@ OleV.V। के डिजाइन की समस्याओं के बारे में उत्सुक Timestamp, क्या आप उस पर कुछ लेख साझा कर सकते हैं? यह मुझे Timestampअपने कोड से भी उपयोग करने से बचने में मदद करता है । धन्यवाद!
नालम

1
बस संक्षेप में, यह एक उपवर्ग के रूप में लागू किया जाता है, Dateलेकिन अक्सर इसे एक के रूप में नहीं संभाला जा सकता है Date। अधिकांश तरीके विरासत में मिले हैं Dateऔर एक निर्माणकर्ता को पदावनत किया गया है। इसका toStringतरीका JVM के टाइम ज़ोन का उपयोग करता है, जो कई को भ्रमित करता है क्योंकि एक ही तरह Timestampसे अलग-अलग कंप्यूटर ( उदाहरण ) पर अलग-अलग प्रिंट किया जाता है ।
ओले वीवी

यह इकाई परीक्षण के लिए एकदम सही है। बस अब साथ बदलेंLocalDate.of(year, month, day)
G_V

यह "हमेशा UTC" मानों को हल करने के लिए स्वीकृत उत्तर होना चाहिए।
लेययूएबल

9

मिलीसेकंड (वर्तमान काल से) में वर्तमान समय प्राप्त करने के लिए, का उपयोग करें System.currentTimeMillis()


3

यदि आपके पास जावा 8 क्लॉक है, तो आप उपयोग कर सकते हैं clock.millis()(हालांकि यह clock.instant()जावा 8 इंस्टेंट प्राप्त करने के लिए आपको उपयोग करने की सलाह देता है , क्योंकि यह अधिक सटीक है)।

आप जावा 8 घड़ी का उपयोग क्यों करेंगे? तो अपने DI ढांचे में आप एक क्लॉक बीन बना सकते हैं:

@Bean
public Clock getClock() {
    return Clock.systemUTC();
}

और फिर अपने परीक्षणों में आप इसे आसानी से नकली कर सकते हैं:

@MockBean private Clock clock;

या आप एक अलग सेम हो सकता है:

@Bean
public Clock getClock() {
    return Clock.fixed(instant, zone);
}

जो परीक्षणों के साथ मदद करता है कि तारीखों और समय का जोर दें।


1
  default LocalDateTime getDateFromLong(long timestamp) {
    try {
        return LocalDateTime.ofInstant(Instant.ofEpochMilli(timestamp), ZoneOffset.UTC);
    } catch (DateTimeException tdException) {
      //  throw new 
    }
}

default Long getLongFromDateTime(LocalDateTime dateTime) {
    return dateTime.atOffset(ZoneOffset.UTC).toInstant().toEpochMilli();
}

0

किसी ने विधि का उल्लेख क्यों नहीं किया LocalDateTime.toEpochSecond():

LocalDateTime localDateTime = ... // whatever e.g. LocalDateTime.now()
long time2epoch = localDateTime.toEpochSecond(ZoneOffset.UTC);

यह छोटा लगता है कि ऊपर दिए गए कई उत्तर दिए गए हैं ...


यह वही है जिसे मैं देख रहा था। वह स्वीकृत उत्तर मुझे वसीयत दे रहा था।
ब्रिल पप्पिन

एपीआई 26 में इसके एकमात्र उपलब्ध को स्वीकार करें: {
ब्रिल पपिन

1
क्योंकि यह केवल कुछ सेकंड देता है। यह अजीब है कि कोई toEpochMilliविधि नहीं है, इस तथ्य को ध्यान में रखा जाता है कि आप स्थानीय डेटाइम में भी नैनोसेकंड निर्दिष्ट कर सकते हैं: एक विधि है LocalDateTime.of(int year, int month, int dayOfMonth, int hour, int minute, int second, int nanoOfSecond)
izogfif
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.