JavaRush /جاوا بلاگ /Random-SD /وقت ۾ ڪيئن نه وڃائجي - DateTime ۽ ڪئلينڊر

وقت ۾ ڪيئن نه وڃائجي - DateTime ۽ ڪئلينڊر

گروپ ۾ شايع ٿيل
سلام! اڄ اسان هڪ نئين ڊيٽا جي قسم سان ڪم ڪرڻ شروع ڪنداسين جيڪو اسان اڳ ۾ نه ڏٺو آهي، يعني تاريخون. وقت ۾ ڪيئن نه وڃائجي - تاريخ جو وقت ۽ ڪئلينڊر - 1مان سمجهان ٿو ته تاريخ ڇا آهي اها وضاحت ڪرڻ جي ڪا ضرورت ناهي :) اصولي طور تي، جاوا ۾ موجوده تاريخ ۽ وقت کي باقاعده اسٽرنگ ۾ لکڻ بلڪل ممڪن آهي.
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.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: توهان مليس سيڪنڊن جو صحيح تعداد بيان ڪري سگهو ٿا جيڪي 00:00 جنوري 1، 1970 کان گهربل تاريخ تائين گذري ويا آهن، ۽ اهو ٺاهيو ويندو:
public class Main {
   public static void main(String[] args) {

       Date date = new Date(1212121212121L);
       System.out.println(date);
   }
}
ڪنسول آئوٽ:

Fri May 30 08:20:12 MSD 2008
اسان اهو 30 مئي 2008 تي حاصل ڪيو. "جمعو" جو مطلب آهي هفتي جو ڏينهن - "جمعو" (جمعو)، ۽ MSD - "ماسڪو ڊي لائيٽ سيونگ" (ماسڪو اونهاري جو وقت). مليس سيڪنڊ فارميٽ ۾ منتقل ڪيا ويا آهن long، ڇاڪاڻ ته انهن جو تعداد گهڻو ڪري ان ۾ نه ٿو اچي 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
پر اتي ھڪڙو وڌيڪ آسان طريقو آھي، يعني، ڪلاس جا خاص طريقا استعمال ڪرڻ لاءِ Date: before(), after()and equals(). اهي سڀئي نتيجا واپس آڻيندا آهن boolean. طريقو before()چيڪ ڪري ٿو ته ڇا اسان جي تاريخ ان کان اڳ واري آهي جيڪا اسان دليل طور منظور ڪريون ٿا:
public class Main {
   public static void main(String[] args) throws InterruptedException {

       Date date1 = new Date();

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

       System.out.println(date1.before(date2));
   }
}
ڪنسول آئوٽ:

true
اهو طريقو ساڳئي طريقي سان ڪم ڪري ٿو after()؛ اهو چيڪ ڪري ٿو ته ڇا اسان جي تاريخ ان کان پوء هئي جيڪا اسان هڪ دليل طور منظور ڪريون ٿا:
public class Main {
   public static void main(String[] args) throws InterruptedException {

       Date date1 = new Date();

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

       System.out.println(date1.after(date2));
   }
}
ڪنسول آئوٽ:

false
اسان جي مثالن ۾، اسان پروگرام کي 2 سيڪنڊن لاء ننڊ ۾ رکون ٿا ته جيئن ٻه تاريخون مختلف هجڻ جي ضمانت ڏين ٿيون. تيز ڪمپيوٽرن تي، ٺاهڻ جي وچ ۾ وقت date1۽ date2هڪ مليسيڪنڊ کان گهٽ ٿي سگهي ٿو، ان صورت ۾ ٻئي طريقا واپس before()ايندا . پر اهڙي صورتحال ۾ طريقو واپس ايندو ! سڀ کان پوء، اهو هر تاريخ لاء 00:00 جنوري 1، 1970 تي گذري چڪو آهي جيڪو مليس سيڪنڊن جي بلڪل برابر آهي. شيون صرف برابر سمجھي وينديون جيڪڏھن اھي ملائي سيڪنڊن سان ملن: after()falseequals()true
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));
}
هتي ڪجهه ٻيو آهي جيڪو توهان کي ڌيان ڏيڻ جي ضرورت آهي. جيڪڏهن توهان Oracle ويب سائيٽ تي ڪلاس لاءِ دستاويز کوليو ٿا Date، توهان ڏسندا ته ان جا ڪيترائي طريقا ۽ تعمير ڪندڙ نامزد ڪيا ويا آهن Deprecated(“منحرف ٿيل”). ھتي، ڏسو: ڪلاس جي تاريخ ھتي آھي جاوا جا ٺاھيندڙ پاڻ انھن طبقن جي انھن حصن جي باري ۾ چوندا آھن جيڪي ختم ٿي ويا آھن: “@ Deprecated سان تشريح ڪيل پروگرام جو عنصر اھو آھي جيڪو پروگرامرز کي استعمال ڪرڻ کان روڪيو وڃي ٿو، عام طور تي ڇاڪاڻ ته اھو خطرناڪ آھي، يا ان ڪري. اتي هڪ بهتر متبادل آهي." هن جو مطلب اهو ناهي ته اهي طريقا استعمال نٿا ڪري سگهن. ان کان علاوه، جيڪڏھن توھان پاڻ ڪوڊ کي استعمال ڪرڻ جي ڪوشش ڪريو IDEA ۾ استعمال ڪندي، اھو گھڻو ڪري ڪم ڪندو. اچو ته مثال طور وٺو deprecated طريقو Date.getHours()، جيڪو اعتراض کان ڪلاڪن جو تعداد واپس ڪري ٿو Date.
public static void main(String[] args) {

   Date date1 = new Date();

   System.out.println(date1.getHours());

}
جيڪڏهن ان وقت توهان ڪوڊ هلائيندا، مثال طور، وقت 14:21 آهي، اهو 14 نمبر ڏيکاريندو. جيئن توهان ڏسي سگهو ٿا، ختم ٿيل طريقو ختم ٿي ويو آهي، پر اهو تمام سٺو ڪم ڪري ٿو. اهي طريقا مڪمل طور تي ختم نه ڪيا ويا، جيئن ته انهن کي استعمال ڪندي اڳ ۾ ئي لکيل ڪوڊ جو هڪ گروپ ٽوڙڻ نه گهرجي. اهو آهي، اهي طريقا نه آهن "ٽڙيل" يا "هٽايو"، اهي صرف هڪ وڌيڪ آسان متبادل جي دستيابي جي ڪري استعمال لاء سفارش نه ڪيا ويا آهن. رستي ۾، ان جي باري ۾ صحيح دستاويز ۾ لکيو ويو آهي: وقت ۾ ڪيئن نه وڃائجي - تاريخ وقت ۽ ڪئلينڊر - 2تاريخ طبقي جا گهڻا طريقا ان جي بهتر، وڌايل ورزن ڏانهن منتقل ڪيا ويا آهن - ڪلاس Calendar. اسان هن کي وڌيڪ ڄاڻون ٿا :)

جاوا ڪئلينڊر

جاوا 1.1 متعارف ڪرايو نئون ڪلاس - Calendar. هن جاوا ۾ تاريخن سان ڪم ڪرڻ کي ٿورو آسان بڻائي ڇڏيو ان کان اڳ نظر اچي رهيو هو. ڪلاس جو واحد نفاذ Calendarجنهن سان اسان ڪم ڪنداسين اهو طبقو آهي GregorianCalendar(اهو گريگورين ڪئلينڊر کي لاڳو ڪري ٿو، جنهن مطابق دنيا جا اڪثر ملڪ رهن ٿا). ان جي بنيادي سهولت اها آهي ته اهو تاريخن سان ڪم ڪري سگهي ٿو وڌيڪ آسان فارميٽ ۾. مثال طور، هو ڪري سگهي ٿو:
  • موجوده تاريخ ۾ هڪ مهينو يا ڏينهن شامل ڪريو
  • چيڪ ڪريو ته سال هڪ ليپ سال آهي؛
  • انفرادي تاريخ جا حصا حاصل ڪريو (مثال طور، سڄي تاريخ مان مهيني نمبر حاصل ڪريو)
  • ۽ پڻ، هڪ تمام آسان سسٽم ان جي اندر ترقي ڪئي وئي آهي (اسان انهن مان ڪيترن ئي کي هيٺ ڏسنداسين).
ڪلاس جو هڪ ٻيو اهم فرق Calendarاهو آهي ته اهو هڪ مستقل لاڳو ڪري ٿو Calendar.Era: توهان تاريخ مقرر ڪري سگهو ٿا دور BC (“Before Christ” - مسيح جي پيدائش کان اڳ، يعني “اسان جي دور کان اڳ”) يا AC (“مسيح کان پوءِ” - “ اسان جو دور"). اچو ته اهو سڀ ڪجهه مثالن سان ڏسو. اچو ته 25 جنوري 2017 جي تاريخ سان ڪئلينڊر ٺاهيون:
public static void main(String[] args) {

  Calendar calendar = new GregorianCalendar(2017, 0 , 25);
}
ڪلاس ۾ مهينا Calendar(جيئن ته Date، رستي ۾) صفر کان شروع ٿين ٿا، تنهنڪري اسان نمبر 0 کي ٻئي دليل طور منظور ڪيو. بنيادي شيء جڏهن هڪ طبقي سان ڪم ڪري رهيو آهي Calendarاهو سمجهڻ آهي ته هي هڪ ڪئلينڊر آهي ، ۽ هڪ الڳ تاريخ ناهي. وقت ۾ ڪيئن نه وڃائجي - تاريخ جو وقت ۽ ڪئلينڊر - 3هڪ تاريخ صرف انگن جو هڪ سلسلو آهي جيڪو وقت جي مخصوص مدت جي نمائندگي ڪري ٿو. ۽ هڪ ڪئلينڊر هڪ مڪمل ڊوائيس آهي جنهن سان توهان تاريخن سان تمام گهڻيون شيون ڪري سگهو ٿا :) اهو بلڪل واضح طور تي ڏسي سگهجي ٿو جيڪڏهن توهان ڪيلينڊر اعتراض کي ڪنسول ڏانهن ڪڍڻ جي ڪوشش ڪريو: Output:

java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Europe/Moscow",offset=10800000,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=25,DAY_OF_YEAR=?,DAY_OF_WEEK=?,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);
}
نتيجو:

Wed Jan 25 00:00:00 MSK 2017
ھاڻي اسان ڪيلينڊر کي باقاعده تاريخ تائين ”آسان“ ڪيو آھي. اچو ته اڳتي وڌون. مھينن جي عددي نمائندگي کان علاوه، Calendarڪلاس روم ۾ مستقل استعمال ڪري سگھجن ٿا. Constants هڪ طبقي جا جامد شعبا آهن 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());
}
نتيجو:

Wed Jan 25 19:42:12 MSK 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 a value - a negative number must be passed to the method
   System.out.println(calendar.getTime());
}
نتيجو:

Fri Nov 25 19:42:12 MSK 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 وانگر ساڳيو رهيو! نتيجو:

Sat Nov 25 10:42:12 MSK 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("Number of the week in the month: " + calendar.get(Calendar.WEEK_OF_MONTH));// serial number of the week in the month

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

   System.out.println("Watch: " + 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 
Порядковый номер недели в месяце: 4 
Число: 25 
Часы: 10 
Минуты: 42 
Секунды: 12 
Миллисекунды: 0
اهو آهي، ڪلاس ۾ "سپر-سيٽر" کان علاوه Calendarهڪ "سپر-گيٽر" پڻ آهي :) هڪ ٻيو دلچسپ نقطو آهي، يقينا، ايرا سان ڪم ڪرڻ. تاريخ “BC” ٺاهڻ لاءِ توهان کي فيلڊ استعمال ڪرڻ جي ضرورت آهي Calendar.Era مثال طور، اچو ته هڪ تاريخ ٺاهيون جنهن ۾ ڪيني جي جنگ جو اشارو آهي، جنهن ۾ هنيبل روم جي فوج کي شڪست ڏني هئي. اهو واقعو 2 آگسٽ 216 ق. e.:
public static void main(String[] args) {
   GregorianCalendar cannes = new GregorianCalendar(216, Calendar.AUGUST, 2);
   cannes.set(Calendar.ERA, GregorianCalendar.BC);

   DateFormat df = new SimpleDateFormat("dd MMM yyy GG");
   System.out.println(df.format(cannes.getTime()));
}
ھتي اسان ڪلاس استعمال ڪيو SimpleDateFormatتاريخ کي ھڪڙي شڪل ۾ ڏيکارڻ لاءِ جيڪا اسان لاءِ وڌيڪ سمجھ ۾ اچي ٿي (اکر ”GG“ دور کي ڏيکارڻ جا ذميوار آھن). نتيجو:

02 авг 216 до н.э.
ڪلاس ۾ Calendarٻيا به ڪيترائي طريقا ۽ مستقل آھن ، انھن بابت پڙھو دستاويزن ۾:

تار کي تاريخ ۾ تبديل ڪرڻ

اسٽرنگ کي تاريخ ۾ تبديل ڪرڻ لاءِ، توھان استعمال ڪري سگھوٿا جاوا مددگار ڪلاس SimpleDateFormat . هي اهو طبقو آهي جيڪو توهان کي تاريخ کي تبديل ڪرڻ جي ضرورت آهي هڪ فارميٽ ۾ جيڪو توهان بيان ڪيو آهي. وقت ۾ ڪيئن نه وڃائجي - تاريخ جو وقت ۽ ڪئلينڊر - 5موڙ ۾، اهو بلڪل ساڳيو آهي DateFormat . ٻنهي جي وچ ۾ صرف قابل ذڪر فرق اهو آهي ته SimpleDateFormat فارميٽنگ لاءِ استعمال ٿي سگهي ٿي (تاريخ کي اسٽرنگ ۾ تبديل ڪرڻ) ۽ اسٽرنگ کي مقامي ڄاڻ واري تاريخ ۾ پارس ڪرڻ، جڏهن ته DateFormat مقامي کي سپورٽ نٿو ڪري. اضافي طور تي، DateFormat ھڪڙو خلاصو طبقو آھي جيڪو تاريخن کي فارميٽ ڪرڻ ۽ پارس ڪرڻ لاءِ بنيادي مدد فراهم ڪري ٿو، جڏھن ته SimpleDateFormat ھڪڙو ڪنڪريٽ ڪلاس آھي جيڪو DateFormat ڪلاس کي وڌائيندو آھي. هي اهو آهي جيڪو هڪ SimpleDateFormat اعتراض ٺاهڻ ۽ تاريخ کي فارميٽ ڪرڻ جو هڪ مثال هن طرح آهي:
SimpleDateFormat formater = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date(1212121212121L);

System.out.println(formatter.format(date));
مٿين مثال ۾ اسان استعمال ڪيو نمونو "yyyy-MM-dd HH:mm:ss" جنهن جو مطلب آهي:
  • سال لاءِ 4 انگ (yyyy)؛
  • مهيني لاءِ 2 عدد (ايم ايم)؛
  • ڏينهن لاءِ 2 عدد (dd)؛
  • 2 انگن اکرن لاءِ 24-ڪلاڪ فارميٽ ۾ (HH)؛
  • منٽ لاء 2 انگ (mm)؛
  • سيڪنڊن لاءِ 2 عدد (ss).
علحدگيءَ جا نشان ۽ نمونن جي نشانين جي ترتيب محفوظ ٿيل آهي. ڪنسول آئوٽ:
2008-05-30 08:20:12
SimpleDateFormat ڪلاس لاءِ ڪافي ٽيمپليٽ اکر آھن . انهي ڪري ته توهان پريشان نه ٿيو، اسان انهن کي ٽيبل ۾ گڏ ڪيو آهي:
علامت وصف مثال
جي دور (انگريزي لوڪلائيزيشن ۾ - AD ۽ BC) ع
y سال (4 عددي نمبر) 2020
yy سال (آخري 2 عدد) 20
yyyy سال (4 عددي نمبر) 2020
ايم مهيني نمبر (اڳوڻي صفر کان سواء) 8
ايم مهيني نمبر (اڳوڻي صفر سان جيڪڏهن مهيني جو نمبر <10 آهي) 04
ايم ڪيو ايم ٽي-اکر مهيني مخفف (مقاميات جي مطابق) جان
ايم ڪيو ايم مڪمل مهيني جو نالو جون
w سال جو هفتو (اڳوڻي صفر کان سواءِ) 4
ww سال جو هفتو (اڳوڻي صفر سان) 04
ڊبليو مهيني ۾ هفتي (اڳوڻي صفر کان سواء) 3
WW هفتي ۾ مهيني (اڳوڻي صفر سان) 03
ڊي سال جو ڏينهن 67
ڊي مهيني جو ڏينهن (اڳوڻي صفر کان سواءِ) 9
ڊي مهيني جو ڏينهن (اڳوڻي صفر سان) 09
ايف مهيني ۾ هفتي جو ڏينهن (اڳوڻي صفر کان سواء) 9
ايف ايف مهيني ۾ هفتي جو ڏينهن (اڳوڻي صفر سان) 09
اي هفتي جو ڏينهن (مخفف) ڊبليو
EEEE هفتي جو ڏينهن (مڪمل) جمع
u هفتي جو ڏينهن نمبر (اڳوڻي صفر کان سواءِ) 5
uu هفتي جي ڏينهن جو تعداد (اڳوڻي صفر سان) 05
هڪ AM/PM مارڪر اي ايم
ايڇ ڪلاڪ 24-ڪلاڪ فارميٽ ۾ بغير اڳوڻو صفر 6
ايڇ گھڙي 24-ڪلاڪ فارميٽ ۾ اڳئين صفر سان 06
ڪ 24-ڪلاڪ فارميٽ ۾ ڪلاڪن جو تعداد 18
ڪي 12 ڪلاڪ فارميٽ ۾ ڪلاڪن جو تعداد 6
ايڇ وقت 12-ڪلاڪ فارميٽ ۾ بغير اڳوڻو صفر 6
hh وقت 12-ڪلاڪ فارميٽ ۾ اڳئين صفر سان 06
م اڳواٽ صفر کان سواءِ منٽ 32
ايم ايم اڳئين صفر سان منٽ 32
ايس اڳواٽ صفر کان سواءِ سيڪنڊ يارنهن
ايس ايس اڳواٽ صفر سان سيڪنڊ يارنهن
ايس ملي سيڪنڊ 297
ز ٽائيم زون اي اي ٽي
Z RFC 822 فارميٽ ۾ ٽائم زون 300
نمونن جي ڪردار جي مجموعن جا مثال:
نمونو مثال
dd-MM-yyyy 01-11-2020
yyyy-MM-dd 2019-10-01
HH:mm:ss.SSS 23: 59.59.999
yyyy-MM-dd HH:mm:ss 2018-11-30 03:09:02
yyyy-MM-dd HH:mm:ss.SSS 01-03-2016 01:20:47.999
yyyy-MM-dd HH:mm:ss.SSS Z 13-13-2013 23:59:59.999 +0100
جيڪڏهن توهان فارميٽ ۾ ڪا معمولي غلطي ڪريو ٿا ته توهان java.text.ParseException جا مالڪ بڻجي سگهو ٿا، ۽ اها ڪا خاص خوشگوار ڪاميابي ناهي. خير، SimpleDateFormat ۾ مختصر گهمڻ ختم ٿي ويو آهي - اچو ته واپس وڃون java string to date جي ترجمي تي . SimpleDateFormat اسان کي اهڙيون صلاحيتون ڏئي ٿو، ۽ اسان هن پروسيس ذريعي قدم قدم تي هلنداسين.
  1. ھڪڙي لائن ٺاھيو جنھن مان توھان کي تاريخ مقرر ڪرڻ جي ضرورت آھي:

    String strDate = "Sat, April 4, 2020";
  2. اسان ھڪڙي ٽيمپليٽ سان ھڪڙو نئون SimpleDateFormat اعتراض ٺاھيو آھي جيڪو اسان جي اسٽرنگ ۾ موجود آھي سان ملندو آھي (ٻي صورت ۾ اسين ان کي پارس ڪرڻ جي قابل نه ھونداسين):

    SimpleDateFormat formatter = new SimpleDateFormat("EEE, MMMM d, yyyy", Locale.ENGLISH);

    جئين توهان ڏسي سگهو ٿا، اسان وٽ هتي هڪ مقامي دليل آهي. جيڪڏهن اسان ان کي ڇڏي ڏيو، اهو ڊفالٽ لوڪل استعمال ڪندو، جيڪو هميشه انگريزي ناهي.

    جيڪڏهن لوڪل ان پٽ اسٽرنگ سان نه ٿو ملي، ته پوءِ ٻولي سان جڙيل اسٽرنگ ڊيٽا، جهڙوڪ اسان جي Mon يا اپريل ، جي سڃاڻپ نه ڪئي ويندي ۽ java.text.ParseException اڇلائي ويندي، جيتوڻيڪ نموني سان ملندو.

    تنهن هوندي، اسان کي فارميٽ جي وضاحت ڪرڻ جي ضرورت ناهي جيڪڏهن اسان هڪ ٽيمپليٽ استعمال ڪري رهيا آهيون جيڪا ٻولي مخصوص ناهي. مثال طور - yyyy-MM-dd HH:mm:ss

  3. اسان هڪ فارميٽ استعمال ڪندي تاريخ ٺاهيندا آهيون، جنهن جي نتيجي ۾ ان کي ان پٽ اسٽرنگ مان پارس ڪيو ويندو آهي:

    try {
      Date date = formatter.parse(strDate);
      System.out.println(date);
    }
    catch (ParseException e) {
      e.printStackTrace();
    }

    ڪنسول آئوٽ:

    
    Sat Apr 04 00:00:00 EEST 2020

    ها... پر فارميٽ هاڻي ساڳيو ناهي رهيو!

    ساڳي فارميٽ ڪرڻ لاء، اسان فارميٽ ٻيهر استعمال ڪندا آهيون:

    System.out.println(formatter.format(date));

    ڪنسول آئوٽ:

    
    Sat, April 4, 2020

SimpleDateFormat ۽ ڪئلينڊر

SimpleDateFormat توهان کي اجازت ڏئي ٿي ته توهان سڀني تاريخن ۽ ڪئلينڊر شين کي فارميٽ ڪريو جيڪي توهان ٺاهيندا آهيو بعد ۾ استعمال لاءِ. اچو ته اهڙي دلچسپ نقطي تي غور ڪريو جيئن ايرا سان ڪم ڪرڻ. ”BC“ جي تاريخ ٺاهڻ لاءِ، توهان کي استعمال ڪرڻ جي ضرورت آهي Calendar.Era فيلڊ. مثال طور، اچو ته هڪ تاريخ ٺاهيون جنهن ۾ ڪيني جي جنگ جو اشارو ڏنو وڃي، جنهن ۾ هنيبل روم جي فوج کي شڪست ڏني هئي. اهو واقعو 2 آگسٽ 216 ق. e.:
public static void main(String[] args) {
   GregorianCalendar cannes = new GregorianCalendar(216, Calendar.AUGUST, 2);
   cannes.set(Calendar.ERA, GregorianCalendar.BC);

   DateFormat df = new SimpleDateFormat("dd MMM yyy GG");
   System.out.println(df.format(cannes.getTime()));
}
ھتي اسان استعمال ڪيو SimpleDateFormat ڪلاس تاريخ کي ھڪڙي فارميٽ ۾ ڏيکارڻ لاءِ جيڪا اسان لاءِ وڌيڪ سمجھ ۾ اچي ٿي (جيئن مٿي ڄاڻايل آھي، اکر ”GG“ دور کي ڏيکارڻ جا ذميوار آھن). نتيجو:

02 авг 216 до н.э.

جاوا تاريخ فارميٽ

هتي هڪ ٻيو ڪيس آهي. اچو ته فرض ڪريو ته هي تاريخ فارميٽ اسان کي مناسب ناهي:

Sat Nov 25 10:42:12 MSK 2017
سو هتي آهي. اسان جون صلاحيتون جاوا جي تاريخ جي شڪل ۾ استعمال ڪندي، توهان ان کي تبديل ڪري سگهو ٿا بغير ڪنهن ڏکيائي جي:
public static void main(String[] args) {

   SimpleDateFormat dateFormat = new SimpleDateFormat("EEEE, d MMMM 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