Java में "unixtime" प्राप्त करना


258

Date.getTime () 1 जनवरी, 1970 से मिलीसेकंड लौटाता है। 1 जनवरी, 1970 से यूनिक्सटाइम सेकंड है। मैं आमतौर पर जावा में कोड नहीं करता, लेकिन मैं कुछ बग फिक्स पर काम कर रहा हूं। मेरे पास है:

Date now = new Date();      
Long longTime = new Long(now.getTime()/1000);
return longTime.intValue();

क्या java में unixtime प्राप्त करने का एक बेहतर तरीका है?


27
चूंकि आप इसे इंट में डाल रहे हैं, इसलिए आपने वर्ष 2038 की समस्या (यूनिक्स के लिए Y2K के बराबर) पेश की है। यही कारण है कि जब यूनिक्स युग 2 अरब हिट और नकारात्मक पर रोल करता है। फिक्स को 64-बिट यूनिक्स में ले जाना है। जावा समतुल्य इसे लंबे समय तक छोड़ने के लिए है।
जॉन एम।

1
हां, मुझे इसकी जानकारी है। यह जिस कोड में हस्तक्षेप कर रहा है, वह अक्षत के लिए 32 बिट इंट की अपेक्षा कर रहा है।
गैरी रिचर्डसन

157
2038 जल्द आ रहा है।
पचेरियर

क्या CurrentTimeMillis के लिए एक उचित नाम या मानक है? मैं इसे अपने दस्तावेज़ में UNIX समय के मिलीसेकंड संस्करण के रूप में संदर्भित करना चाहता हूं।
टॉम

1
यदि आप चाहते हैं कि आपका सॉफ़्टवेयर अतिप्रवाह से बच जाए, तो उपयोग करें long, नहीं int। वास्तव में intटाइमस्टैम्प के लिए उपयोग करने का कोई कारण नहीं है , जब तक कि आप एक अलग ग्रैन्युलैरिटी जैसे 1 सेकंड = 4 सेकंड आदि का उपयोग नहीं कर रहे हैं, या तो अपने कोड को छिपाएं, ताकि भविष्य की पीढ़ियां यह न देख सकें कि आप कितने अक्षम थे।
18'18

जवाबों:


475

दिनांक ऑब्जेक्ट निर्माण w / System.currentTimeMillis () से बचें । 1000 से भाग देने पर आपको यूनिक्स युग मिल जाता है।

जैसा कि एक टिप्पणी में उल्लेख किया गया है, आप आम तौर पर एक आदिम लंबी (लोअर-केस-एल लॉन्ग) चाहते हैं न कि एक बॉक्सिंग ऑब्जेक्ट लॉन्ग (कैपिटल-एल लॉन्ग) जो कि यूनिक्सटाइम वेरिएबल के प्रकार के लिए है।

long unixTime = System.currentTimeMillis() / 1000L;

3
जब तक आप संख्या को ऑब्जेक्ट के रूप में संभालना नहीं चाहते (तब तक इसे किसी संग्रह में डाल दिया जाता है) के बजाय आदिम लॉन्ग का उपयोग करने पर विचार करें, फिर अनावश्यक वस्तु निर्माण से बचा जाता है
brabster

9
जावा 32-बिट इंट 32-बिट प्लेटफॉर्म (और वर्ष 2038 समस्या) से मेल खाता है। 64-बिट प्लेटफॉर्म एक बड़े time_t डेटा प्रकार का उपयोग करते हैं। Java ने System.currentTimeMillis () के लिए वापसी के रूप में लंबे समय तक उपयोग करके उस बुलेट को चकमा दिया। यदि आप इंट में कनवर्ट करते हैं, तो आप वर्ष 2038 की समस्या को फिर से पेश कर रहे हैं। En.wikipedia.org/wiki/Year_2038_problem#Solutions
जॉन एम।

1
मुझे लगता है कि आप एक बिंदु पर गलत हैं: एक कम मामले "एल" और एक ऊपरी मामले के बीच कोई अंतर नहीं है जब उन्हें इस तरह संख्यात्मक शाब्दिक रूप में उपयोग किया जाता है। docs.oracle.com/javase/specs/jls/se7/html/jls-3.html#jls-3.10.1
मैट फोर्स्सिथ जुले

5
पूंजीकरण चर्चा (ऊपर स्पष्ट) डेटा प्रकार के बारे में थी। आदिम "लंबी" बनाम "java.lang.Long" वर्ग उदाहरण। आप लंबे शाब्दिक पर प्रत्यय पत्र के बारे में बात कर रहे हैं, जो मैं मानता हूं कि ऊपरी या निचला मामला हो सकता है। हालांकि कम मामला "एल" अंक की तरह एक बहुत कुछ "1" की तरह दिखता है, इसलिए यह राजधानी "एल" का उपयोग करने के लिए बहुत अधिक पठनीय है।
जॉन एम।

1
दस्तावेज़ के लिंक पर क्लिक करें। वापसी को यूटीसी समयक्षेत्र में 1/1/1970 से मिलीसेकंड की संख्या के रूप में परिभाषित किया गया है। आप टाइमज़ोन चाहते हैं? Java.util.Calendar को देखें।
जॉन एम

273

Java 8 ने दिनांक और समय के साथ काम करने के लिए एक नया API जोड़ा। जावा 8 के साथ आप उपयोग कर सकते हैं

import java.time.Instant
...
long unixTimestamp = Instant.now().getEpochSecond();

Instant.now()एक इंस्टेंट लौटाता है जो वर्तमान सिस्टम समय का प्रतिनिधित्व करता है। getEpochSecond()आप के साथ युग (यूनिक्स समय) सेकंड से मिलता है Instant


4
क्या अंतर है Instant.now().getEpochSecond(), new Date().getTime()औरSystem.currentTimeMillis()
SohamC

2
एक अंतर यह है कि पूर्व सेकंड में है जबकि बाद के दो मिलीसेकंड में हैं। दूसरों को हो सकता है या नहीं भी।
सुपर_आर्डवार्क

3
import java.time.Instantयदि आप स्काला में हैं
akauppi

4
इस साइट को विस्तृत विवरण के लिए देखें ... पसंद आया है .. currentTimeMillis
सुब्रतो

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