CodeGym /Java Blog /यादृच्छिक /वेळेत कसे हरवायचे नाही: तारीख वेळ आणि कॅलेंडर
John Squirrels
पातळी 41
San Francisco

वेळेत कसे हरवायचे नाही: तारीख वेळ आणि कॅलेंडर

यादृच्छिक या ग्रुपमध्ये प्रकाशित केले
हाय! आज आम्ही एका नवीन डेटा प्रकारासह काम सुरू करू ज्याचा आम्हाला यापूर्वी सामना झाला नाही, म्हणजे तारखा. वेळेत कसे हरवायचे नाही: तारीख वेळ आणि कॅलेंडर - 1तारीख म्हणजे काय हे मला समजावून सांगण्याची गरज वाटत नाही. :) तत्वतः, आम्ही वर्तमान तारीख आणि वेळ सामान्य Java String मध्ये संग्रहित करू शकतो.

public class Main {
   public static void main(String[] args) {

       String date = "June 11, 2018";
       System.out.println(date);
   }
}
परंतु या पद्धतीमध्ये अनेक तोटे आहेत. वर्ग Stringमजकुरासह कार्य करण्यासाठी डिझाइन केला आहे आणि या कार्यासाठी त्याच्या पद्धती योग्य आहेत. जर आम्हाला एखाद्या तारखेत काही प्रकारे फेरफार करायची असेल (उदाहरणार्थ 2 तास जोडा), Stringइतके चांगले कार्य करत नाही. किंवा प्रोग्राम संकलित केल्यावर वर्तमान तारीख आणि वेळ प्रदर्शित करू इच्छित असल्यास. Stringयेथे देखील मदत करत नाही: जोपर्यंत तुम्ही कोड लिहाल आणि चालवा, वेळ बदलला असेल आणि कन्सोल चुकीची माहिती प्रदर्शित करेल. म्हणूनच जावाच्या निर्मात्यांनी तारखा आणि वेळेसह कार्य करण्यासाठी अनेक वर्ग प्रदान केले. यापैकी पहिले आहेjava.util.Date

तारीख वर्ग

आम्ही त्याचे पूर्ण नाव नमूद केले आहे, कारण दुसर्‍या Java पॅकेजमध्ये java.sql.Dateवर्ग आहे. त्यांना मिसळू नका! तुम्हाला त्याबद्दल माहित असणे आवश्यक असलेली पहिली गोष्ट म्हणजे ती तारीख 1 जानेवारी 1970 पासून उत्तीर्ण झालेल्या मिलीसेकंदांची संख्या म्हणून संग्रहित करते. या टाइम सिस्टमचे स्वतःचे नाव देखील आहे: " युनिक्स-टाइम " एक ऐवजी मनोरंजक दृष्टीकोन, होईल' तुम्ही सहमत आहात ना? :) दुसरी गोष्ट लक्षात ठेवण्यासारखी आहे: जर तुम्ही Dateडिफॉल्ट कन्स्ट्रक्टर वापरून एखादी वस्तू तयार केली असेल, तर त्याचा परिणाम ऑब्जेक्ट तयार झाल्याच्या क्षणी वर्तमान तारीख आणि वेळ दर्शवेल . लक्षात ठेवा की आम्ही असे म्हटले आहे की एक तारखेला Stringअसे कार्य करण्यासाठी संघर्ष होईल? वर्ग Dateसहजतेने हाताळतो.

public class Main {
   public static void main(String[] args) {

       Date date = new Date();
       System.out.println(date);
   }
}
हा कोड अनेक वेळा चालवा आणि तुम्हाला वेळ वारंवार बदलताना दिसेल. :) हे शक्य आहे कारण वेळ मिलिसेकंद म्हणून संग्रहित केला जातो: ते वेळेचे अत्यंत लहान एकके आहेत, त्यामुळे परिणाम अत्यंत अचूक आहेत. क्लास Dateदुसरा कन्स्ट्रक्टर: तुम्ही 1 जानेवारी 1970 रोजी 00:00 पासून आवश्यक तारखेपर्यंत मिलिसेकंदांची अचूक संख्या पास करू शकता आणि संबंधित तारीख ऑब्जेक्ट तयार केला जाईल:

public class Main {
   public static void main(String[] args) {

       Date date = new Date(1212121212121L);
       System.out.println(date);
   }
}
कन्सोल आउटपुट: शुक्र मे 30 04:20:12 GMT 2008 आम्हाला 30 मे 2008 मिळेल. "शुक्र" आठवड्याचा दिवस (शुक्रवार, duh) दर्शवतो आणि GMT हा टाइम झोन (ग्रीनविच मीन टाइम) आहे. मिलिसेकंदांना s म्हणून पास केले जाते long, कारण मिलिसेकंदांची संख्या सहसा s मध्ये बसत नाही int. तर, आम्हाला तारखांसह कोणते ऑपरेशन करावे लागेल? बरं, सर्वात स्पष्ट, अर्थातच, तुलना आहे . एक तारीख दुसरी तारीख आधी की नंतर येते हे ठरवण्यासाठी. हे अनेक प्रकारे केले जाऊ शकते. उदाहरणार्थ, तुम्ही या Date.getTime()पद्धतीला कॉल करू शकता, जी 1 जानेवारी 1970 च्या मध्यरात्रीपासून निघून गेलेल्या मिलीसेकंदांची संख्या देते. फक्त दोन तारीख ऑब्जेक्ट्सवर कॉल करा आणि परिणामांची तुलना करा:

public class Main {
   public static void main(String[] args) {

       Date date1 = new Date();

       Date date2 = new Date();

       System.out.println((date1.getTime() > date2.getTime())?
               "date1 is later than date2" : "date1 is earlier than date2");
   }
}
आउटपुट: date1 date2 पेक्षा पूर्वीचा आहे परंतु एक अधिक सोयीस्कर मार्ग देखील आहे, म्हणजे दिनांक वर्गाद्वारे प्रदान केलेल्या विशेष पद्धतींचा वापर करून: before(), after()आणि equals(). ते सर्व बुलियन मूल्य परत करतात. before()आमची तारीख युक्तिवाद म्हणून पास केलेल्या तारखेपेक्षा पूर्वीची आहे की नाही हे पद्धत तपासते:

public class Main {
   public static void main(String[] args) throws InterruptedException {

       Date date1 = new Date();

       Thread.sleep(2000);// Suspend the program for 2 seconds
       Date date2 = new Date();

       System.out.println(date1.before(date2));
   }
}
कन्सोल आउटपुट: सत्य त्याचप्रमाणे, after()आमची तारीख वितर्क म्हणून पास केलेल्या तारखेपेक्षा नंतरची आहे की नाही हे पाहण्यासाठी पद्धत तपासते:

public class Main {
   public static void main(String[] args) throws InterruptedException {

       Date date1 = new Date();

       Thread.sleep(2000);// Suspend the program for 2 seconds
       Date date2 = new Date();

       System.out.println(date1.after(date2));
   }
}
कन्सोल आऊटपुट: असत्य आमच्या उदाहरणांमध्ये, आम्ही 2 सेकंदांसाठी "प्रोग्रामला झोपायला ठेवतो", जेणेकरून दोन तारखा वेगळ्या असण्याची हमी दिली जाते. जलद संगणकांवर, निर्मिती date1आणि दरम्यानचा वेळ date2एक मिलिसेकंदापेक्षा कमी असू शकतो, ज्यामुळे दोन्ही before()खोटे after()होतात. परंतु या प्रकरणात, equals()पद्धत खरी परत येईल! शेवटी, ते प्रत्येक तारखेसाठी 1 जानेवारी 1970 रोजी 00:00 पासून मिलिसेकंदांच्या संख्येची तुलना करते . मिलिसेकंदशी जुळल्यासच वस्तू समान मानल्या जातात :

public static void main(String[] args) {

   Date date1 = new Date();
   Date date2 = new Date();

   System.out.println(date1.getTime());
   System.out.println(date2.getTime());

   System.out.println(date1.equals(date2));
}
येथे आणखी एक गोष्ट आहे ज्याकडे आपण लक्ष देणे आवश्यक आहे. तुम्ही OracleDate वेबसाइटवर वर्गासाठी कागदपत्रे उघडल्यास , तुम्हाला दिसेल की त्याच्या अनेक पद्धती आणि कन्स्ट्रक्टर्स नापसंत (म्हणजे वापरण्यासाठी शिफारस केलेले नाहीत) म्हणून चिन्हांकित केले गेले आहेत. नापसंत केलेल्या वर्गांच्या भागांबद्दल Java च्या निर्मात्यांना काय म्हणायचे आहे ते येथे आहे:
"@Deprecated वर भाष्य केलेला प्रोग्राम घटक प्रोग्रामरना वापरण्याची शिफारस केली जात नाही, सामान्यतः कारण ते धोकादायक आहे किंवा एक चांगला पर्याय आहे म्हणून."
याचा अर्थ असा नाही की या पद्धती अजिबात वापरल्या जाऊ शकत नाहीत. जर तुम्ही IDE मध्ये बहिष्कृत पद्धती वापरून कोड चालवण्याचा प्रयत्न केला, तर ते बहुधा कार्य करेल उदाहरणार्थ, बहिष्कृत Date.getHours()पद्धतीचा विचार करा, जी ऑब्जेक्टशी संबंधित तासांची संख्या देते Date.

public static void main(String[] args) {

   Date date1 = new Date();

   System.out.println(date1.getHours());
}
तुम्ही कोड 14:21 (2:21 PM) वाजता सुरू केल्यास, तो 14 क्रमांक प्रदर्शित करेल. तुम्ही बघू शकता, नापसंत पद्धत ओलांडली गेली आहे, परंतु तरीही ती कार्य करते. या पद्धती वापरत असलेल्या विद्यमान कोडचा मोठा भाग खंडित होऊ नये म्हणून त्या काढल्या जात नाहीत. दुसऱ्या शब्दांत, या पद्धती "तुटलेल्या" किंवा "काढलेल्या" नाहीत. ते वापरण्यासाठी फक्त शिफारस केलेले नाहीत कारण अधिक सोयीस्कर पर्याय उपलब्ध आहे. प्रसंगोपात, दस्तऐवजीकरणात या पर्यायाचा विशेष उल्लेख आहे:
वेळेत कसे हरवायचे नाही: तारीख वेळ आणि कॅलेंडर - 2
वर्गाच्या बहुतेक Dateपद्धती सुधारित आणि विस्तारित Calendarवर्गात हलविल्या गेल्या आहेत. आपण पुढे त्या वर्गाशी परिचित होऊ. :)

कॅलेंडर वर्ग

JDK 1.1 ने एक नवीन वर्ग सादर केला: Calendar. जावामध्ये तारखांसह काम करणे पूर्वीपेक्षा काहीसे सोपे झाले. Calendarआम्ही ज्या वर्गासह कार्य करू त्या वर्गाची फक्त अंमलबजावणी म्हणजे GregorianCalendarवर्ग. हे ग्रेगोरियन कॅलेंडर लागू करते, जे जगातील बहुतेक देश पाळतात. त्याचा मुख्य फायदा असा आहे की ते अधिक सोयीस्कर स्वरूपात तारखांसह कार्य करू शकते. उदाहरणार्थ, हे करू शकते:
  • वर्तमान तारखेला एक महिना किंवा दिवस जोडा
  • वर्ष लीप वर्ष आहे की नाही ते तपासा;
  • तारखेचे वैयक्तिक घटक परत करा (उदाहरणार्थ, संपूर्ण तारखेपासून महिन्याची संख्या काढा)
  • यात स्थिरांकांची एक अतिशय सोयीस्कर प्रणाली देखील आहे (ज्यापैकी अनेक आपण खाली पाहू).
वर्गाची आणखी एक महत्त्वाची सुधारणा Calendarम्हणजे त्याचे Calendar.ERA स्थिरांक: तुम्ही सामान्य युगापूर्वीची तारीख (BC - ख्रिस्तापूर्वी) किंवा सामान्य युगात (AD - Anno Domini) दर्शवू शकता. हे सर्व उदाहरणांसह पाहू. calendar25 जानेवारी 2017 च्या तारखेसह एक ऑब्जेक्ट तयार करूया :

public static void main(String[] args) {

  Calendar calendar = new GregorianCalendar(2017, 0 , 25);
}
वर्गात Calendar(तसेच Dateत्या प्रकरणासाठी वर्ग), महिने शून्यापासून सुरू होतात , म्हणून आम्ही दुसरा युक्तिवाद म्हणून 0 क्रमांक पास करतो. वर्गासोबत काम करताना Calendar, हे समजून घेणे महत्त्वाचे आहे की हे फक्त एक कॅलेंडर आहे , वैयक्तिक तारीख नाही. वेळेत कसे हरवायचे नाही: तारीख वेळ आणि कॅलेंडर - 3 तारीख ही काही संख्या असते जी विशिष्ट वेळ मध्यांतर दर्शवते. कॅलेंडर ही एक संपूर्ण प्रणाली आहे जी तुम्हाला तारखांसह बर्‍याच गोष्टी करू देते. :) आपण ऑब्जेक्ट प्रदर्शित करण्याचा प्रयत्न केल्यास हे मोठ्या प्रमाणात उघड आहे Calendar: आउटपुट: java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Europe/London",offset=0,dstSavings=0,useDaylight= false,transitions=79,lastRule=null],FirstDayOfWeek=2,minimalDaysInFirstWeek=1,ERA=?,YEAR=2017,MONTH=0,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=?,DAY_OF_MONTH=2_OF_MONTH=? ,DAY_OF_WEEK_IN_MONTH=?,AM_PM=0,HOUR=0,HOUR_OF_DAY=0,MINUTE=0,SECOND=0,MILLISECOND=?,ZONE_OFFSET=?,DST_OFFSET=?] तुम्हाला किती माहिती मिळते ते पहा ! कॅलेंडरमध्ये अनेक गुणधर्म असतात जे सामान्य तारखेमध्ये नसतात आणि ते सर्व प्रदर्शित केले जातात (वर्गात हीtoString()पद्धत कशी कार्य करतेCalendar). जर तुम्हाला कॅलेंडरमधून साधी तारीख मिळवायची असेल, म्हणजे एखादीDateवस्तू, वापराCalendar.getTime()पद्धत (नाव सर्वात तर्कसंगत नाही, परंतु आपण काय करू शकता?):

public static void main(String[] args) {

   Calendar calendar = new GregorianCalendar(2017, 0 , 25);
   Date date = calendar.getTime();
   System.out.println(date);
}
आउटपुट: बुध जानेवारी 25 00:00:00 GMT 2017 आता आम्ही कॅलेंडर घेतले आहे आणि ते एका सामान्य तारखेपर्यंत "कमी" केले आहे. पुढे जाऊया. त्यांच्या संख्येनुसार महिने नियुक्त करण्याव्यतिरिक्त, तुम्ही Calendarवर्गाची स्थिर फील्ड मूल्ये वापरू शकता . Calendarहे स्थिरांक प्रीसेट व्हॅल्यूसह वर्गातील स्थिर फील्ड आहेत जे बदलले जाऊ शकत नाहीत. हा प्रत्यक्षात आणखी चांगला पर्याय आहे, कारण त्यांचा वापर केल्याने तुमच्या कोडची वाचनीयता सुधारते.

public static void main(String[] args) {
   GregorianCalendar calendar = new GregorianCalendar(2017, Calendar.JANUARY , 25);
}
Calendar.JANUARY हे वर्षातील महिन्यांचे प्रतिनिधित्व करणाऱ्या स्थिरांकांपैकी एक आहे. या नामांकित स्थिरांकांचा वापर करून, कोणीही विसरणार नाही, उदाहरणार्थ, क्रमांक 3 म्हणजे एप्रिल, आणि तिसरा महिना नाही, ज्याला आपण मार्च म्हणू इच्छितो. फक्त Calendar.APRIL लिहा आणि तुम्ही पूर्ण केले. :) सर्व कॅलेंडर फील्ड (संख्या, महिना, मिनिटे, सेकंद, इ.) पद्धत वापरून स्वतंत्रपणे निर्दिष्ट केले जाऊ शकतेset(). ही पद्धत अतिशय सोयीस्कर आहे, कारणCalendarवर्गात प्रत्येक फील्डसाठी स्थिरांक असतो आणि परिणामी कोड वाचणे खूप सोपे आहे. शेवटच्या उदाहरणात, आम्ही एक तारीख तयार केली, परंतु त्यासाठी वेळ सेट केली नाही. चला 19:42:12 वेळ सेट करूया

public static void main(String[] args) {
   Calendar calendar = new GregorianCalendar();
   calendar.set(Calendar.YEAR, 2017);
   calendar.set(Calendar.MONTH, 0);
   calendar.set(Calendar.DAY_OF_MONTH, 25);
   calendar.set(Calendar.HOUR_OF_DAY, 19);
   calendar.set(Calendar.MINUTE, 42);
   calendar.set(Calendar.SECOND, 12);

   System.out.println(calendar.getTime());
}
आउटपुट: बुध जानेवारी 25 19:42:12 GMT 2017 आम्ही पद्धत म्हणतो set(), एक स्थिरांक (आम्ही बदलू इच्छित असलेल्या फील्डवर अवलंबून) आणि फील्डसाठी नवीन मूल्य. असे दिसून आले की ही set()पद्धत एक प्रकारची "सुपर-सेटर" आहे जी केवळ एका फील्डसाठी नाही तर अनेक फील्डसाठी मूल्य कसे सेट करायचे हे जाणते. :) वर्ग मूल्ये जोडण्यासाठी आणि वजा करण्यासाठी पद्धत Calendarवापरतो . add()तुम्ही बदलू इच्छित असलेल्या फील्डमध्ये आणि एक संख्या (तुम्हाला सध्याच्या मूल्यामधून नेमके किती जोडायचे/वजा करायचे आहे) पास करा. उदाहरणार्थ, आम्ही तयार केलेल्या तारखेच्या 2 महिन्यांपूर्वीची तारीख मिळवूया:

public static void main(String[] args) {
   Calendar calendar = new GregorianCalendar(2017, Calendar.JANUARY , 25);
   calendar.set(Calendar.HOUR, 19);
   calendar.set(Calendar.MINUTE, 42);
   calendar.set(Calendar.SECOND, 12);

   calendar.add(Calendar.MONTH, -2); // To subtract, pass a negative number
   System.out.println(calendar.getTime());
}
आउटपुट: शुक्रवार 25 नोव्हेंबर 19:42:12 GMT 2016 खूप चांगले! आम्हाला 2 महिन्यांपूर्वीची तारीख मिळाली. यामुळे केवळ महिना बदलला नाही: वर्ष देखील 2017 ते 2016 पर्यंत बदलले. अर्थात, तारखांचे रूपांतर करताना, चालू वर्षाची गणना तुम्हाला मॅन्युअली ठेवण्याची गरज न पडता आपोआप मोजली जाते. परंतु काही कारणास्तव तुम्हाला हे वर्तन अक्षम करण्याची आवश्यकता असल्यास, तुम्ही तसे करू शकता. पद्धत उर्वरित मूल्यांवर परिणाम न करताroll() मूल्ये जोडू आणि वजा करू शकते . उदाहरणार्थ, यासारखे:

public static void main(String[] args) {
   Calendar calendar = new GregorianCalendar(2017, Calendar.JANUARY , 25);
   calendar.set(Calendar.HOUR, 10);
   calendar.set(Calendar.MINUTE, 42);
   calendar.set(Calendar.SECOND, 12);

   calendar.roll(Calendar.MONTH, -2);
   System.out.println(calendar.getTime());
}
आम्ही मागील उदाहरणाप्रमाणेच केले: आम्ही वर्तमान तारखेपासून 2 महिने घेतले. पण आता कोड काहीतरी वेगळे करतो: जानेवारी ते नोव्हेंबर महिना बदलला आहे, परंतु वर्ष अपरिवर्तित आहे—2017! आउटपुट: शनिवार 25 नोव्हेंबर 10:42:12 GMT 2017 पुढे जात आहे. आम्ही वर म्हटल्याप्रमाणे, आम्ही सर्व Calendarफील्ड स्वतंत्रपणे मिळवू शकतो. आम्ही हे या get()पद्धतीसह करतो:

public static void main(String[] args) {
   GregorianCalendar calendar = new GregorianCalendar(2017, Calendar.JANUARY , 25);
   calendar.set(Calendar.HOUR, 10);
   calendar.set(Calendar.MINUTE, 42);
   calendar.set(Calendar.SECOND, 12);

   System.out.println("Year: " + calendar.get(Calendar.YEAR));
   System.out.println("Month: " + calendar.get(Calendar.MONTH));
   System.out.println("Week in the month: " + calendar.get(Calendar.WEEK_OF_MONTH));// Week in this month?

   System.out.println("Day: " + calendar.get(Calendar.DAY_OF_MONTH));

   System.out.println("Hours: " + calendar.get(Calendar.HOUR));
   System.out.println("Minutes: " + calendar.get(Calendar.MINUTE));
   System.out.println("Seconds: " + calendar.get(Calendar.SECOND));
   System.out.println("Milliseconds: " + calendar.get(Calendar.MILLISECOND));

}
आउटपुट: वर्ष: 2017 महिना: महिन्यातील 0 आठवडा: 5 दिवस: 25 तास: 10 मिनिटे: 42 सेकंद: 12 मिलीसेकंद: 0 त्यामुळे, वर्गाच्या "सुपर-सेटर" व्यतिरिक्त Calendar, एक "सुपर-गेटर" देखील आहे " :) अर्थात, या वर्गाचा आणखी एक मनोरंजक पैलू म्हणजे युगांसह कार्य करणे. "BC" तारीख तयार करण्यासाठी, तुम्हाला Calendar.ERA फील्ड वापरण्याची आवश्यकता असेल, उदाहरणार्थ, कॅनेच्या लढाईसाठी एक तारीख तयार करूया, जिथे हॅनिबलने रोमन सैन्याचा पराभव केला. हे 2 ऑगस्ट 216 बीसी रोजी घडले:

public static void main(String[] args) {
   GregorianCalendar cannae = new GregorianCalendar(216, Calendar.AUGUST, 2);
   cannae.set(Calendar.ERA, GregorianCalendar.BC);

   DateFormat df = new SimpleDateFormat("MMM dd, yyy GG");
   System.out.println(df.format(cannae.getTime()));
}
येथे आम्ही SimpleDateFormatवर्गाचा वापर आम्हाला समजण्यास सोपा असलेल्या फॉरमॅटमध्ये तारीख मुद्रित करण्यासाठी केला आहे ("GG" अक्षरे दर्शवतात की आम्हाला युग प्रदर्शित करायचे आहे). आउटपुट: ऑगस्ट 02, 216 बीसी. वर्गात Calendarआणखी अनेक पद्धती आणि स्थिरांक आहेत. आपण त्यांच्याबद्दल दस्तऐवजीकरणात वाचू शकता . जर हे तारखेचे स्वरूप शनि नोव्हेंबर 25 10:42:12 GMT 2017 आवडत नसेल तर तुम्ही SimpleDateFormatते सहजतेने तुम्हाला हवे तसे बनवण्यासाठी वापरू शकता.

public static void main(String[] args) {

   SimpleDateFormat dateFormat = new SimpleDateFormat("EEEE, MMMM d, yyyy");
   Calendar calendar = new GregorianCalendar(2017, Calendar.JANUARY , 25);
   calendar.set(Calendar.HOUR, 10);
   calendar.set(Calendar.MINUTE, 42);
   calendar.set(Calendar.SECOND, 12);

   calendar.roll(Calendar.MONTH, -2);
   System.out.println(dateFormat.format(calendar.getTime()));
}
आउटपुट: शनिवार, नोव्हेंबर 25, 2017 ते खूप चांगले आहे, नाही का? :)
टिप्पण्या
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION