Instant — java.time पैकेज से एक अपरिवर्तनीय क्लास, जो UTC में नैनोसेकंड सटीकता के साथ समय रेखा पर एक बिंदु दर्शाता है। LocalDateTime के विपरीत, Instant में मानव-पठनीय प्रारूप में दिनांक और समय नहीं होता — यह एक पल का मशीनी प्रतिनिधित्व है। Oracle Java 17 (2024) विनिर्देश के अनुसार, Instant टाइमस्टैम्प के मशीनी आदान-प्रदान के लिए डिज़ाइन किया गया है और System.currentTimeMillis() का एनालॉग है, लेकिन नैनोसेकंड सटीकता के साथ।
मुख्य बातें
Instant एक क्लास है जो समय रेखा पर एक एकल बिंदु को मॉडल करता है। इसका आंतरिक प्रतिनिधित्व दो फ़ील्ड से बना है: long seconds (1970-01-01T00:00:00Z से सेकंड की संख्या) और int nanos (वर्तमान सेकंड के भीतर नैनोसेकंड, 0 से 999999999 तक)।
Instant मानों की सीमा युग से -31557014167219200 से 31556889864403199 सेकंड तक है, जो दोनों दिशाओं में लगभग 292 मिलियन वर्ष कवर करती है। यह खगोलीय गणनाओं सहित किसी भी व्यावहारिक कार्य के लिए पर्याप्त है।
Baeldung (2024) के अनुसार, Instant मानव-पठनीय प्रकारों (LocalDateTime, ZonedDateTime) और मशीन प्रारूपों (मिलीसेकंड में टाइमस्टैम्प) के बीच एक पुल है। Instant का उपयोग लॉगिंग, कैशिंग, सिंक्रनाइज़ेशन और उन सभी कार्यों के लिए किया जाता है जहाँ समय में एक निरपेक्ष क्षण महत्वपूर्ण होता है।
क्लास Comparable (क्षणों की तुलना के लिए) और Temporal (सामान्य java.time API में उपयोग के लिए) इंटरफ़ेस को लागू करता है। Instant अपरिवर्तनीय है — सभी विधियाँ एक नया ऑब्जेक्ट लौटाती हैं।
Java 8 से पहले, समय में क्षणों के साथ काम करने के लिए java.util.Date और System.currentTimeMillis() का उपयोग किया जाता था। दोनों दृष्टिकोणों में कमियाँ हैं। Date परिवर्तनशील है, थ्रेड-सेफ नहीं है, युग से मिलीसेकंड में समय संग्रहीत करता है, लेकिन इसके विधि नाम पुराने हैं (getYear() 2016 के लिए 116 लौटाता है)।
Long (एक सरल टाइमस्टैम्प) तेज़ और कॉम्पैक्ट है, लेकिन इसमें नैनोसेकंड के लिए अंतर्निहित समर्थन नहीं है, पठनीय प्रारूप में प्रदर्शित नहीं होता है, और डिबगिंग के दौरान मैन्युअल पार्सिंग की आवश्यकता होती है। Long दृष्टिकोण डेटा प्रकारों में भी अंतर नहीं करता — एक डेवलपर गलत मान पास कर सकता है।
Instant इन सभी समस्याओं को हल करता है। यह अपरिवर्तनीय है, इसमें स्पष्ट सटीकता जानकारी (सेकंड + नैनोसेकंड) है, ISO-8601 प्रारूप “2026-07-21T15:00:00Z” में सीरियलाइज़ होता है, और रूपांतरणों के लिए एक समृद्ध API है। SonarSource (2024) के अनुसार, Instant सभी नए प्रोजेक्ट्स में Date का अनुशंसित प्रतिस्थापन है।
वर्तमान क्षण Instant.now() के माध्यम से प्राप्त होता है। LocalDateTime.now() के विपरीत, Instant.now() हमेशा UTC में समय लौटाता है, डिवाइस के समय क्षेत्र को अनदेखा करता है। यह इसे सर्वर टाइमस्टैम्प के लिए आदर्श बनाता है।
मौजूदा मानों से: Instant.ofEpochSecond(long epochSecond) — युग से सेकंड से, Instant.ofEpochMilli(long epochMilli) — मिलीसेकंड से, Instant.parse(CharSequence) — ISO-8601 स्ट्रिंग (“2026-07-21T15:00:00Z”) से।
पढ़ने के लिए: getEpochSecond() — युग से सेकंड की संख्या, toEpochMilli() — मिलीसेकंड की संख्या, getNano() — नैनोसेकंड। toString() विधि ISO-8601 प्रारूप में एक स्ट्रिंग लौटाती है।
val now = Instant.now()
val fromSeconds = Instant.ofEpochSecond(1784700000)
val fromMillis = Instant.ofEpochMilli(1784700000000)
val parsed = Instant.parse("2026-07-21T15:00:00Z")
val epochSecond = now.getEpochSecond()
val epochMilli = now.toEpochMilli()
val nanos = now.getNano()
Instant ZonedDateTime में atZone(ZoneId) के माध्यम से परिवर्तित होता है। उदाहरण के लिए, Instant.now().atZone(ZoneId.of(“Europe/Moscow”)) मास्को के लिए ZonedDateTime लौटाता है। बिना क्षेत्र के, रूपांतरण असंभव है — Instant में कैलेंडर जानकारी नहीं होती।
Instant को LocalDateTime में बदलने के लिए: atZone(ZoneId).toLocalDateTime()। यह दृष्टिकोण स्पष्ट है और जानकारी नहीं खोता। उल्टा रूपांतरण: LocalDateTime.atZone(ZoneId).toInstant()।
java.util.Date के साथ संगतता के लिए: Date.from(instant) और date.toInstant()। यह एक द्विदिश रूपांतरण है जो मिलीसेकंड तक सटीकता बनाए रखता है (Date नैनोसेकंड का समर्थन नहीं करता)। java.sql.Timestamp के लिए, नैनोसेकंड समर्थन के साथ Timestamp.from(instant) का उपयोग करें।
val instant = Instant.now()
val zoned = instant.atZone(ZoneId.of("Europe/Moscow"))
val localDateTime = instant
.atZone(ZoneId.systemDefault())
.toLocalDateTime()
val oldDate = Date.from(instant)
val backToInstant = oldDate.toInstant()
Instant की मुख्य विशेषता यह है कि यह पूरी तरह से समय क्षेत्रों से स्वतंत्र है। Instant.now() दुनिया में कहीं भी किसी भी डिवाइस पर एक ही परिणाम लौटाता है। यह UTC में समय को स्थिर करके प्राप्त किया जाता है।
Instant को मानव को दिखाने के लिए ही समय क्षेत्र की आवश्यकता होती है। इसके लिए atZone(ZoneId) का उपयोग किया जाता है। ZoneId.systemDefault() ऑपरेटिंग सिस्टम में सेट डिवाइस का समय क्षेत्र लौटाता है। ZoneOffset.UTC UTC के लिए स्थिरांक है।
वितरित सिस्टम में, सभी टाइमस्टैम्प को Instant (या ZoneOffset.UTC के साथ OffsetDateTime) में संग्रहीत और प्रेषित करने की अनुशंसा की जाती है। स्थानीय समय में रूपांतरण केवल उपयोगकर्ता को दिखाने से पहले क्लाइंट पर किया जाता है। यह समय क्षेत्रों के भ्रम को रोकता है।
वितरित Android अनुप्रयोगों में, सही कैशिंग, सूचनाओं और सहयोगी संपादन के लिए समय सिंक्रनाइज़ेशन महत्वपूर्ण है। Instant UTC से इसके जुड़ाव के कारण इस कार्य के लिए स्वाभाविक विकल्प है।
विभिन्न उपकरणों से टाइमस्टैम्प की तुलना करते समय, यह ध्यान में रखना चाहिए कि सिस्टम घड़ियाँ भिन्न हो सकती हैं। संदर्भ के रूप में सर्वर समय का उपयोग करने की अनुशंसा की जाती है। सर्वर UTC में Instant लौटाता है, और क्लाइंट केवल सापेक्ष गणनाओं के लिए स्थानीय Instant से तुलना करता है।
दो क्षणों के बीच अंतर की गणना करने के लिए, Duration.between(Instant start, Instant end) का उपयोग करें। यह विधि एक Duration लौटाती है जिसे घंटों, मिनटों, सेकंडों में परिवर्तित किया जा सकता है। isAfter() और isBefore() विधियाँ क्षणों की तुलना करने की अनुमति देती हैं।
fun isCacheExpired(
cachedAt: Instant,
ttlMinutes: Long
): Boolean {
val elapsed = Duration.between(cachedAt, Instant.now())
return elapsed.toMinutes() >= ttlMinutes
}
पहला उदाहरण टाइमस्टैम्प के साथ घटनाओं की लॉगिंग है। Instant Room डेटाबेस में सहेजा जाता है और सर्वर पर भेजा जाता है। टाइमस्टैम्प स्पष्ट व्याख्या के लिए UTC में लॉग किया जाता है।
data class EventLog(
val id: Long = 0,
val eventName: String,
val timestamp: Instant
)
class Converters {
@TypeConverter
fun fromInstant(value: Instant?): Long? {
return value?.toEpochMilli()
}
@TypeConverter
fun toInstant(value: Long?): Instant? {
return value?.let { Instant.ofEpochMilli(it) }
}
}
दूसरा उदाहरण किसी घटना के बाद बीता समय निर्धारित करना है। हम Duration.between का उपयोग “5 मिनट पहले”, “2 घंटे पहले” दिखाने के लिए करते हैं — यह प्रारूप मैसेंजर और सोशल नेटवर्क में आम है।
fun timeAgo(instant: Instant): String {
val duration = Duration.between(instant, Instant.now())
return when {
duration.toMinutes() < 1 -> "just now"
duration.toHours() < 1 -> "${duration.toMinutes()} min ago"
duration.toDays() < 1 -> "${duration.toHours()} h ago"
else -> "${duration.toDays()} d ago"
}
}
तीसरा उदाहरण सर्वर और क्लाइंट के बीच डेटा सिंक्रनाइज़ेशन है। हम अंतिम अपडेट समय को ट्रैक करने के लिए Instant का उपयोग करते हैं।
class SyncManager {
private var lastSyncAt: Instant? = null
fun sync() {
val syncStart = Instant.now()
// server request with lastSyncAt
lastSyncAt = syncStart
}
fun shouldSync(intervalMinutes: Long): Boolean {
val last = lastSyncAt ?: return true
return Duration.between(last, Instant.now())
.toMinutes() >= intervalMinutes
}
}
पहली गलती उपयोगकर्ता को दिखाने के लिए Instant.now().toString() का उपयोग करना है। Instant UTC प्रारूप “2026-07-21T15:00:00Z” में आउटपुट देता है, जो मनुष्यों के लिए अपठनीय है। दिखाने से पहले Instant को हमेशा atZone() के माध्यम से स्थानीय समय क्षेत्र में बदलें।
दूसरी गलती java.util.Date में बदलते समय नैनोसेकंड खोना है। Date केवल मिलीसेकंड का समर्थन करता है। यदि Instant में नैनोसेकंड हैं, तो वे Date.from(instant) में छोड़ दिए जाएँगे। सटीकता स्पष्ट रूप से निर्दिष्ट करने के लिए Instant.truncatedTo(ChronoUnit.MILLIS) का उपयोग करें।
तीसरी गलती toEpochMilli() और getEpochSecond() के बीच भ्रम है। toEpochMilli() युग से मिलीसेकंड की संख्या (long) लौटाता है, जबकि getEpochSecond() सेकंड की संख्या (long) लौटाता है। इन विधियों को मिलाने से 1000x त्रुटि हो सकती है।
चौथी गलती यह मानना है कि Instant.now() सभी उपकरणों पर सिंक्रनाइज़ है। सिस्टम घड़ियाँ मिनटों या घंटों तक भिन्न हो सकती हैं। समय-महत्वपूर्ण संचालन (प्रमाणीकरण, भुगतान) के लिए, सत्य के स्रोत के रूप में सर्वर Instant का उपयोग करें।
अक्सर पूछे जाने वाले प्रश्न
System.currentTimeMillis() एक long लौटाता है — समय क्षेत्र बंधन के बिना युग से मिलीसेकंड की संख्या। Instant समान कार्यक्षमता प्रदान करता है लेकिन नैनोसेकंड सटीकता और रूपांतरणों, तुलनाओं और java.time के साथ संगतता के लिए समृद्ध API के साथ।
Room सीधे Instant का समर्थन नहीं करता। TypeConverter का उपयोग करें जो Instant को Long (toEpochMilli) और वापस (Instant.ofEpochMilli) में बदलता है। नैनोसेकंड सटीकता के लिए, दो फ़ील्ड सहेजें: युग-सेकंड और नैनोसेकंड।
हाँ, Instant अपरिवर्तनीय है और equals() और hashCode() को सही ढंग से लागू करता है। समान मान वाले दो Instant बराबर होंगे। यह इसे परिवर्तनशील java.util.Date के विपरीत HashMap और अन्य संग्रहों के लिए एक विश्वसनीय कुंजी बनाता है।
Duration प्राप्त करने के लिए Duration.between(start, end) या सेकंड (long) में अंतर के लिए ChronoUnit.SECONDS.between(start, end) का उपयोग करें। Duration toMinutes(), toHours(), toDays() और toNanos() विधियाँ प्रदान करता है।
Instant को समय रेखा पर एक निरपेक्ष बिंदु के रूप में डिज़ाइन किया गया है। समय क्षेत्र या UTC निर्दिष्ट किए बिना, पार्सिंग असंभव है क्योंकि Instant में कैलेंडर जानकारी नहीं होती। “Z” प्रत्यय शून्य ऑफ़सेट (UTC) दर्शाता है और ISO-8601 प्रारूप के लिए अनिवार्य है।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें