Java दिनांक और समय

⚡ स्मार्ट सारांश

Java दिनांक और समय प्रबंधन में पुरानी java.util.Date और SimpleDateFormat कक्षाओं को आधुनिक java.time API के साथ जोड़ा गया है, जिसे इसमें शामिल किया गया है। Java 8, डेवलपर्स को सटीक कैलेंडर कार्य के लिए अपरिवर्तनीय, थ्रेड-सुरक्षित प्रकार प्रदान करता है।

  • 🕒 विरासत तिथि: java.util.Date क्लास मिलीसेकंड में एक क्षण को स्टोर करती है और toString के माध्यम से एक डिफ़ॉल्ट स्ट्रिंग प्रिंट करती है।
  • 🔤 पैटर्न अक्षर: SimpleDateFormat कस्टम आउटपुट फॉर्मेट को परिभाषित करने के लिए yyyy, MM, dd, HH, mm, ss और zzz जैसे अक्षरों का उपयोग करता है।
  • तुलना: compareTo विधि दो Date इंस्टेंस को कालानुक्रमिक रूप से व्यवस्थित करने के लिए एक ऋणात्मक, शून्य या धनात्मक पूर्णांक लौटाती है।
  • 🆕 आधुनिक एपीआई: java.time में LocalDate, LocalDateTime, ZonedDateTime और Instant, Date और Calendar को अपरिवर्तनीय ऑब्जेक्ट से बदल देते हैं।
  • 🧵 धागे की सुरक्षा: DateTimeFormatter अपरिवर्तनीय है और इसे साझा करना सुरक्षित है, जबकि SimpleDateFormat को सिंक्रोनाइज़ेशन या थ्रेडलोकल रैपर की आवश्यकता होती है।
  • 🔁 अंतर: Date.toInstant, Date.from और Calendar.toInstant हेल्पर का उपयोग करके पुराने और नए API के बीच रूपांतरण करें।

Java दिनांक और समय

दिनांक और समय को संभालना Java यह शेड्यूलिंग लॉजिक, लॉग टाइमस्टैम्प, रिपोर्ट और ऑडिट ट्रेल बनाने का एक नियमित हिस्सा है। कोई भी कोड लिखने से पहले, यह जानना मददगार होता है कि तिथि किन मापदंडों से बनती है:

  • RSI वर्ष (दो या चार अंकों में)।
  • RSI माह (दो अंकों के रूप में, महीने के पहले तीन अक्षरों के रूप में, या पूरे महीने के नाम के रूप में)।
  • RSI डेटा (महीने की वास्तविक तिथि संख्या)।
  • RSI दिन (दी गई तिथि को दिन का नाम, जैसे रवि, सोम, मंगल)।

Java यह टाइमलाइन पर किसी क्षण का वर्णन करने वाले कई अन्य मापदंडों को उजागर करता है, जिनमें युग, वर्ष का सप्ताह, समय क्षेत्र और ऑफ़सेट शामिल हैं। नीचे दिए गए अनुभागों में इनमें से प्रत्येक को उदाहरणों सहित समझाया गया है।

दिनांक का उपयोग कैसे करें Java

दिनांक प्रदर्शित करें Java

Java प्रदान करता है एक Date कक्षा में java.util यह क्लास एक पैकेज का हिस्सा है। यह क्लास समय के एक विशिष्ट क्षण को मिलीसेकंड की सटीकता तक स्टोर करती है और उस क्षण को प्रिंट करने, तुलना करने और फॉर्मेट करने के लिए सहायक मेथड प्रदान करती है। वर्तमान तिथि और समय प्राप्त करने के लिए, इस क्लास को इसके डिफ़ॉल्ट कंस्ट्रक्टर के साथ इंस्टैंशिएट करें:

import java.util.Date;

class Date_Ex1 {
    public static void main(String args[]) {
        // Instantiate a Date object by invoking its constructor
        Date objDate = new Date();
        // Display the Date and Time using toString()
        System.out.println(objDate.toString());
    }
}

आउटपुट:

Wed Nov 29 06:36:22 UTC 2017

यह उदाहरण दिनांक को डिफ़ॉल्ट toString प्रारूप में प्रिंट करता है। उसी समय को किसी भिन्न प्रारूप में प्रदर्शित करने के लिए, आपको पहले प्रारूपण अक्षरों को समझना होगा। Java का उपयोग करता है।

SimpleDateFormat: तिथियों को पार्स और प्रारूपित करें

RSI SimpleDateFormat कक्षा में java.text एक परिवर्तित करता है Date ऑब्जेक्ट को एक स्वरूपित स्ट्रिंग में परिवर्तित करता है और उस स्वरूपित स्ट्रिंग को वापस पार्स करता है। Dateयह पैटर्न अक्षरों का उपयोग करता है जो दिनांक या समय घटक से मेल खाते हैं। नीचे दी गई तालिका में सभी समर्थित अक्षर सूचीबद्ध हैं:

पत्रदिनांक या समय घटकउदाहरण
Gयुग निर्दिष्टकAD
yसाल2026
Mवर्ष में महीनाजुलाई या जुलाई या 07
wवर्ष में सप्ताह27
Wसप्ताह दर सप्ताह महीना2
Dवर्ष में दिन189
dमहीने में दिन10
Fमहीने में सप्ताह का दिन2
Eसप्ताह में दिन का नाममंगलवार या मंगल
uसप्ताह का दिन संख्या (1 = Monday(7 = रविवार)1
aAM या PM मार्करPM
Hदिन में घंटा (0-23)0
kदिन में घंटा (1-24)24
Kसुबह या शाम का घंटा (0-11)0
hसुबह या शाम का घंटा (1-12)12
mमिनट प्रति घंटा30
sमिनट में सेकंड55
Sमिलीसेकंड978
zसमय क्षेत्र (नाम)प्रशांत मानक समय; PST; GMT-08:00
Zसमय क्षेत्र (आरएफसी 822 ऑफ़सेट)-0800
Xसमय क्षेत्र (आईएसओ 8601 ऑफसेट)-08 या -0800 या -08:00

आपको पूरी तालिका याद रखने की आवश्यकता नहीं है। जब भी आप कोई नया पैटर्न बनाएं, तो इसे देखें।

SimpleDateFormat का उपयोग कैसे करें

SimpleDateFormat का एक उपवर्ग है DateFormat यह आपको ऊपर दिए गए पैटर्न अक्षरों का उपयोग करके तिथियों को फॉर्मेट करने और पार्स करने की सुविधा देता है। आप जिस सटीक स्ट्रिंग को उत्पन्न या पढ़ना चाहते हैं, उसे बताने के लिए अक्षरों को संयोजित करें।

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

  1. दिनांक प्रारूप आवश्यक: 2012.10.23 20:20:45 पीएसटीउपयुक्त प्रारूप पैटर्न यह है: yyyy.MM.dd HH:mm:ss zzz.
  2. दिनांक प्रारूप आवश्यक: 09:30:00 AM 23-May-2012उपयुक्त प्रारूप पैटर्न यह है: hh:mm:ss a dd-MMM-yyyy.

सुझाव: अक्षर का केस देखें। अपरकेस M महीना है, छोटे अक्षरों में m मिनट है। अपरकेस H यह 24 घंटे की घड़ी है, छोटे अक्षरों में। h यह 12 घंटे की घड़ी है। इन्हें आपस में मिलाने से चुपचाप गलत परिणाम मिलता है।

नीचे दिया गया प्रोग्राम वर्तमान तिथि को दो बार प्रिंट करता है, एक बार डिफ़ॉल्ट प्रारूप में और एक बार SimpleDateFormat पैटर्न के माध्यम से:

import java.text.SimpleDateFormat;
import java.util.Date;

class TestDates_Format {
    public static void main(String args[]) {
        // Current system date and time is assigned to objDate
        Date objDate = new Date();
        System.out.println(objDate);

        // Build the target pattern and format the date
        String strDateFormat = "hh:mm:ss a dd-MMM-yyyy";
        SimpleDateFormat objSDF = new SimpleDateFormat(strDateFormat);
        System.out.println(objSDF.format(objDate));
    }
}

आउटपुट:

Wed Nov 29 06:31:41 UTC 2017
06:31:41 AM 29-Nov-2017

तिथियों की तुलना उदाहरण

तिथियों की तुलना उदाहरण

दो ऑर्डर करने का सबसे विश्वसनीय तरीका Date वस्तुएँ हैं compareTo() यह विधि तब ऋणात्मक पूर्णांक लौटाती है जब कॉल करने वाला पहले होता है, दोनों क्षणों के बराबर होने पर शून्य, और कॉल करने वाले बाद में होने पर धनात्मक पूर्णांक लौटाती है। नीचे दिया गया कोड स्निपेट दो दिनांक स्ट्रिंग को पार्स करता है और उनका सापेक्ष क्रम प्रिंट करता है:

import java.text.SimpleDateFormat;
import java.text.ParseException;
import java.util.Date;

class TestDates_Compare {
    public static void main(String args[]) throws ParseException {

        SimpleDateFormat objSDF = new SimpleDateFormat("dd-MM-yyyy");
        Date dt_1 = objSDF.parse("20-08-1981");
        Date dt_2 = objSDF.parse("12-10-2012");

        System.out.println("Date1 : " + objSDF.format(dt_1));
        System.out.println("Date2 : " + objSDF.format(dt_2));

        // compareTo returns > 0 when dt_1 is after dt_2
        if (dt_1.compareTo(dt_2) > 0) {
            System.out.println("Date 1 occurs after Date 2");
        }
        // compareTo returns < 0 when dt_1 is before dt_2
        else if (dt_1.compareTo(dt_2) < 0) {
            System.out.println("Date 1 occurs before Date 2");
        }
        // compareTo returns 0 when both dates are equal
        else {
            System.out.println("Both are the same date");
        }
    }
}

आउटपुट:

Date1 : 20-08-1981
Date2 : 12-10-2012
Date 1 occurs before Date 2

नोट: मूल कोड ने इस पैटर्न का उपयोग किया था। dd-mm-yyyy। लोअरकेस mm यह अक्षर मिनट है, महीना नहीं, इसलिए पार्सर ने अनजाने में महीने का गलत मान उत्पन्न कर दिया। ऊपर दिए गए समाधान में अपरकेस का उपयोग किया गया है। MM महीने के लिए, जो सही पैटर्न अक्षर है।

Java 8 आधुनिक दिनांक और समय एपीआई (java.time)

Java 8 ने परिचय दिया java.time यह पैकेज, Joda-Time लाइब्रेरी से प्रेरित एक नया API डिज़ाइन करता है। नई क्लासें अपरिवर्तनीय और थ्रेड-सेफ हैं, और मानव कैलेंडर को मशीन टाइमलाइन से अलग करती हैं। सबसे आम प्रकार हैं:

  • LocalDate किसी ऐसी तारीख के लिए जिसमें समय या क्षेत्र का उल्लेख न हो (उदाहरण के लिए, जन्मदिन)।
  • LocalTime बिना तारीख या क्षेत्र दिखाए दीवार घड़ी का समय देखने के लिए।
  • LocalDateTime बिना ज़ोन वाली तिथि और समय के लिए।
  • ZonedDateTime किसी विशिष्ट समय क्षेत्र वाली तिथि और समय के लिए।
  • OffsetDateTime किसी तिथि और समय के लिए जिसमें यूटीसी ऑफसेट हो लेकिन कोई नामित क्षेत्र न हो।
  • Instant मशीन टाइमस्टैम्प के लिए, जिसे यूनिक्स युग से मापा जाता है।
  • Duration और Period समय-आधारित और तिथि-आधारित राशियों के लिए।

नीचे दिया गया उदाहरण आधुनिक एपीआई का उपयोग करके वर्तमान तिथि, समय, टाइमस्टैम्प और समय क्षेत्र को प्रिंट करता है:

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

class ModernDateDemo {
    public static void main(String args[]) {
        LocalDate today = LocalDate.now();
        LocalDateTime now = LocalDateTime.now();
        ZonedDateTime zoned = ZonedDateTime.now(ZoneId.of("Asia/Kolkata"));
        Instant epoch = Instant.now();

        System.out.println("LocalDate     : " + today);
        System.out.println("LocalDateTime : " + now);
        System.out.println("ZonedDateTime : " + zoned);
        System.out.println("Instant       : " + epoch);
    }
}

प्रत्येक प्रकार में फैक्ट्री विधियाँ होती हैं (now, of, parse) और अपरिवर्तनीय संचालन (plusDays, minusHours, withYear) जो मूल ऑब्जेक्ट को परिवर्तित करने के बजाय एक नया मान लौटाते हैं।

डेटटाइमफॉर्मेटर: आधुनिक प्रारूपों में तिथियों को प्रारूपित करें Java

DateTimeFormatter in java.time.format बदल देता है SimpleDateFormatयह पैटर्न अक्षरों की समान शैली का उपयोग करता है, अपरिवर्तनीय है, और अतिरिक्त सिंक्रोनाइज़ेशन के बिना थ्रेड्स में साझा करने के लिए सुरक्षित है। यह क्लास तैयार स्थिरांक भी प्रदान करती है जैसे कि ISO_LOCAL_DATE और ISO_ZONED_DATE_TIME मानक प्रारूपों के लिए।

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

class FormatterDemo {
    public static void main(String args[]) {
        LocalDateTime now = LocalDateTime.now();

        DateTimeFormatter iso = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
        DateTimeFormatter human = DateTimeFormatter.ofPattern("hh:mm:ss a dd-MMM-yyyy");

        System.out.println(now.format(iso));
        System.out.println(now.format(human));

        LocalDateTime parsed = LocalDateTime.parse("2026-07-04T09:30:00", iso);
        System.out.println("Parsed back : " + parsed);
    }
}

आधुनिक API में दो तिथियों की तुलना करने के लिए, कॉल करें isBefore, isAfterया, isEqualये विधियाँ अधिक स्पष्ट रूप से समझ में आती हैं। compareTo और हर किसी के साथ काम करें java.time वर्ग.

धागे की सुरक्षा और सर्वोत्तम अभ्यास Java दिनांक और समय

दोनों java.util.Date और SimpleDateFormat आधुनिक समवर्ती से पहले Javaऔर इन सभी में कुछ ज्ञात कमियां हैं। प्रोडक्शन कोड में दिनांक प्रबंधन को सही रखने के लिए नीचे दिए गए तरीकों का पालन करें:

  • Date और Calendar की जगह java.time को प्राथमिकता दें। नए प्रकार अपरिवर्तनीय और थ्रेड-सुरक्षित हैं, और वे डोमेन को अधिक सटीक रूप से मॉडल करते हैं (समय के बिना तिथियां, क्षेत्रों के बिना समय, इत्यादि)।
  • SimpleDateFormat को अलग-अलग थ्रेड्स में साझा न करें। यह क्लास आंतरिक पार्स स्थिति को संग्रहीत करती है और थ्रेड-सुरक्षित नहीं है। इसे एक में लपेटें ThreadLocalइंस्टेंस पर सिंक्रनाइज़ करें, या स्विच करें DateTimeFormatter.
  • हमेशा लोकेल निर्दिष्ट करें। महीने और दिन के नाम JVM के डिफ़ॉल्ट लोकेल के साथ बदलते हैं, जिससे पैटर्न इस प्रकार हो जाते हैं। MMM और EEE पोर्टेबल नहीं। लोकेल को स्पष्ट रूप से पास करें (उदाहरण के लिए, Locale.ENGLISH).
  • समय क्षेत्रों के बारे में स्पष्ट रूप से बताएं। LocalDateTime इसमें कोई ज़ोन नहीं है, इसलिए इसे बदलें ZonedDateTime or Instant जब भी सटीक समय मायने रखता है, खासकर लॉग, डेटाबेस कॉलम और नेटवर्क पेलोड के लिए।
  • दोनों एपीआई के बीच सावधानीपूर्वक रूपांतरण करें। उपयोग date.toInstant(), Date.from(instant), तथा calendar.toInstant().atZone(zone) लेगेसी कोड और आधुनिक कोड की सीमा पर।
  • टाइमस्टैम्प को UTC में स्टोर करें। दृढ़ रहें और transmit तिथियां यूटीसी के रूप में (एक Instant या एक आईएसओ 8601 स्ट्रिंग) और केवल प्रदर्शित करते समय उपयोगकर्ता क्षेत्र में परिवर्तित करें।

अक्सर पूछे जाने वाले प्रश्न

सिस्टम ज़ोन में दिनांक और समय के लिए java.time पैकेज से LocalDateTime.now() को कॉल करें, या केवल दिनांक के लिए LocalDate.now() को कॉल करें। पुराने सिस्टम पर Javaवर्तमान समय प्राप्त करने के लिए new java.util.Date() का उपयोग करें।

java.util.Date किसी युग से मिलीसेकंड में एक क्षण को दर्शाता है और यह परिवर्तनीय है। LocalDate बिना समय या क्षेत्र के कैलेंडर तिथि को मॉडल करता है, यह अपरिवर्तनीय और थ्रेड-सुरक्षित है, और plusDays और isBefore जैसे स्पष्ट तरीके प्रदान करता है।

नहीं। SimpleDateFormat परिवर्तनीय पार्स स्थिति रखता है और थ्रेड्स के बीच साझा किए जाने पर गलत परिणाम देता है। इसे ThreadLocal में रैप करें, इंस्टेंस पर सिंक्रोनाइज़ करें, या DateTimeFormatter पर स्विच करें, जो अपरिवर्तनीय और सुरक्षित है।

सटीक स्ट्रिंग “yyyy-MM-dd” लिखें। अपरकेस MM महीने को और लोअरकेस mm मिनट को दर्शाता है। पूरी तारीख और समय के लिए “yyyy-MM-dd HH:mm:ss” का उपयोग करें। महीने के नाम को सही ढंग से दोहराने के लिए हमेशा लोकेल निर्दिष्ट करें।

पुराने Date टेम्प्लेट के साथ, compareTo फ़ंक्शन का उपयोग करें जो एक ऋणात्मक, शून्य या धनात्मक पूर्णांक लौटाता है। java.time टेम्प्लेट के साथ, LocalDate या Instant पर isBefore, isAfter या isEqual फ़ंक्शन को कॉल करें। दोनों तरीके कालानुक्रमिक क्रम का पालन करते हैं।

date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime() को कॉल करें। वापस जाने के लिए, Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant()) का उपयोग करें। जब भी सटीक समय महत्वपूर्ण हो, ज़ोन को स्पष्ट रूप से चुनें।

लॉग और दस्तावेज़ संग्रहों पर प्रशिक्षित एआई मॉडल नमूना स्ट्रिंग से संभावित पैटर्न का अनुमान लगाते हैं और मिलान करने वाला दिनांक-समय प्रारूप पैटर्न लौटाते हैं। मशीन लर्निंग क्लासिफायर महीने-दिन बनाम दिन-महीने के क्रम जैसे अस्पष्ट फ़ील्ड को भी चिह्नित करते हैं।

हाँ। GitHub Copilot DateTimeFormatter पैटर्न, ZonedDateTime रूपांतरण और अन्य सुझाव देता है। JUnit स्थान-संवेदनशील आउटपुट के लिए परीक्षण। Revसही पैटर्न अक्षरों, स्थान और समय क्षेत्र के लिए प्रत्येक सुझाव को ध्यानपूर्वक देखें और फिर ही आगे बढ़ें।

इस पोस्ट को संक्षेप में इस प्रकार लिखें: