JavaRush /جاوا بلاگ /Random-UR /وقت میں گم نہ ہونے کا طریقہ - ڈیٹ ٹائم اور کیلنڈر

وقت میں گم نہ ہونے کا طریقہ - ڈیٹ ٹائم اور کیلنڈر

گروپ میں شائع ہوا۔
ہیلو! آج ہم ایک نئی ڈیٹا ٹائپ کے ساتھ کام شروع کریں گے جس کا ہمیں پہلے سامنا نہیں ہوا، یعنی تاریخیں۔ وقت میں گم نہ ہونے کا طریقہ - ڈیٹ ٹائم اور کیلنڈر - 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 جنوری 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 کی آدھی رات سے گزرنے والے ملی سیکنڈز کی تعداد واپس کر دے گا۔ آئیے اسے صرف دو Date آبجیکٹ پر کال کریں اور ان کا ایک دوسرے سے موازنہ کریں:
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()گے ۔ لیکن ایسی صورت حال میں طریقہ واپس آئے گا ! بہر حال، یہ ہر تاریخ کے لیے 1 جنوری 1970 کو 00:00 سے گزرنے والے ملی سیکنڈز کی تعداد کا بالکل موازنہ کرتا ہے۔ آبجیکٹ صرف اسی صورت میں برابر سمجھے جائیں گے جب وہ ملی سیکنڈ سے نیچے مماثل ہوں: 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));
}
یہاں کچھ اور ہے جس پر آپ کو توجہ دینے کی ضرورت ہے۔ Dateاگر آپ اوریکل ویب سائٹ پر کلاس کے لیے دستاویزات کھولتے ہیں ، تو آپ دیکھیں گے کہ اس کے بہت سے طریقوں اور کنسٹرکٹرز کو Deprecated("فرسودہ") کے طور پر نامزد کیا گیا ہے۔ یہاں دیکھیں: کلاس کی تاریخ یہ ہے کہ جاوا کے تخلیق کار خود کلاسوں کے ان حصوں کے بارے میں کیا کہتے ہیں جو فرسودہ ہو چکے ہیں: “@ Deprecated کے ساتھ تشریح کردہ پروگرام کا عنصر ایک ایسی چیز ہے جسے پروگرامرز استعمال کرنے کی حوصلہ شکنی کرتے ہیں، عام طور پر اس وجہ سے کہ یہ خطرناک ہے، یا اس وجہ سے ایک بہتر متبادل ہے۔" اس کا مطلب یہ نہیں ہے کہ ان طریقوں کو بالکل استعمال نہیں کیا جاسکتا۔ مزید یہ کہ، اگر آپ خود کوڈ کو IDEA میں استعمال کرتے ہوئے چلانے کی کوشش کرتے ہیں، تو یہ غالباً کام کرے گا۔ مثال کے طور پر فرسودہ طریقہ کو لیتے ہیں Date.getHours()، جو آبجیکٹ سے گھنٹوں کی تعداد لوٹاتا ہے Date۔
public static void main(String[] args) {

   Date date1 = new Date();

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

}
اگر آپ جس وقت کوڈ چلاتے ہیں، مثال کے طور پر، وقت 14:21 ہے، تو یہ نمبر 14 ظاہر کرے گا۔ جیسا کہ آپ دیکھ سکتے ہیں، فرسودہ طریقہ کو ختم کر دیا گیا ہے، لیکن یہ کافی اچھا کام کرتا ہے۔ ان طریقوں کو مکمل طور پر نہیں ہٹایا گیا تھا، تاکہ ان کا استعمال کرتے ہوئے پہلے سے لکھے گئے کوڈ کا ایک گروپ ٹوٹ نہ جائے۔ یعنی، یہ طریقے "ٹوٹے" یا "ہٹائے گئے" نہیں ہیں، زیادہ آسان متبادل کی دستیابی کی وجہ سے انہیں استعمال کرنے کی سفارش نہیں کی جاتی ہے۔ ویسے، دستاویزات میں اس کے بارے میں لکھا ہے: وقت میں گم نہ ہونے کا طریقہ - ڈیٹ ٹائم اور کیلنڈر - 2Date کلاس کے زیادہ تر طریقے اس کے بہتر، توسیع شدہ ورژن - کلاس میں منتقل کردیئے گئے ہیں Calendar۔ ہم اسے مزید جانیں گے :)

جاوا کیلنڈر

جاوا 1.1 نے ایک نئی کلاس متعارف کرائی ہے Calendar۔ اس نے جاوا میں تاریخوں کے ساتھ کام کرنا پہلے سے کہیں زیادہ آسان بنا دیا۔ Calendarجس کلاس کے ساتھ ہم کام کریں گے اس کا واحد نفاذ کلاس ہے GregorianCalendar(یہ گریگورین کیلنڈر نافذ کرتا ہے، جس کے مطابق دنیا کے بیشتر ممالک رہتے ہیں)۔ اس کی بنیادی سہولت یہ ہے کہ یہ تاریخوں کے ساتھ زیادہ آسان فارمیٹ میں کام کر سکتا ہے۔ مثال کے طور پر، وہ کر سکتا ہے:
  • موجودہ تاریخ میں ایک مہینہ یا دن شامل کریں۔
  • چیک کریں کہ آیا سال لیپ سال ہے؛
  • انفرادی تاریخ کے اجزاء حاصل کریں (مثال کے طور پر، پوری تاریخ سے مہینے کا نمبر حاصل کریں)
  • اور یہ بھی کہ اس کے اندر مستقل کا ایک بہت ہی آسان نظام تیار کیا گیا ہے (ہم ذیل میں ان میں سے بہت سے دیکھیں گے)۔
کلاس کا ایک اور اہم فرق Calendarیہ ہے کہ یہ ایک مستقل کو لاگو کرتا ہے Calendar.Era: آپ تاریخ کو BC کے زمانے ("مسیح سے پہلے" - مسیح کی پیدائش سے پہلے، یعنی "ہمارے دور سے پہلے") یا 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اور بھی بہت سے طریقے اور مستقل ہیں ، ان کے بارے میں دستاویزات میں پڑھیں:

تار کو تاریخ میں تبدیل کرنا

String کو Date میں تبدیل کرنے کے لیے، آپ جاوا مددگار کلاس - 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 ہندسے (MM)؛
  • دن کے لیے 2 ہندسے (dd)؛
  • 24 گھنٹے کی شکل میں گھنٹوں کے لیے 2 ہندسے (HH)؛
  • منٹ کے لیے 2 ہندسے (ملی میٹر)؛
  • سیکنڈز (ss) کے لیے 2 ہندسے۔
علیحدگی کے نشانات اور پیٹرن کی علامتوں کی ترتیب محفوظ ہے۔ کنسول آؤٹ پٹ:
2008-05-30 08:20:12
SimpleDateFormat کلاس کے لیے ٹیمپلیٹ کے بہت سارے خطوط ہیں ۔ تاکہ آپ الجھن میں نہ پڑیں، ہم نے انہیں ایک ٹیبل میں جمع کیا ہے:
علامت تفصیل مثال
جی دور (انگریزی لوکلائزیشن میں - AD اور BC) AD
y سال (4 ہندسوں کا نمبر) 2020
yy سال (آخری 2 ہندسے) 20
yyyy سال (4 ہندسوں کا نمبر) 2020
ایم مہینے کا نمبر (بغیر پہلے صفر کے) 8
ایم ایم مہینے کا نمبر (پہلے صفر کے ساتھ اگر ماہ نمبر <10) 04
ایم ایم ایم تین حرفی مہینے کا مخفف (لوکلائزیشن کے مطابق) جنوری
MMMM پورے مہینے کا نام جون
w سال کا ہفتہ (بغیر صفر کے) 4
ww سال کا ہفتہ (پہلے صفر کے ساتھ) 04
ڈبلیو مہینے میں ہفتہ (بغیر صفر کے) 3
ڈبلیو ڈبلیو مہینے میں ہفتہ (صفر کے ساتھ) 03
ڈی سال کا دن 67
d مہینے کا دن (بغیر صفر کے) 9
ڈی ڈی مہینے کا دن (پہلے صفر کے ساتھ) 09
ایف مہینے میں ہفتے کا دن (بغیر صفر کے) 9
ایف ایف مہینے میں ہفتے کا دن (پہلے صفر کے ساتھ) 09
ای ہفتے کا دن (مخفف) ڈبلیو
ای ای ای ای ہفتے کا دن (مکمل) جمعہ
u ہفتے کا دن نمبر (بغیر صفر کے) 5
uu ہفتے کے دن کی تعداد (پہلے صفر کے ساتھ) 05
a AM/PM مارکر اے ایم
ایچ بغیر کسی صفر کے 24 گھنٹے کی شکل میں گھنٹے 6
ایچ ایچ آگے صفر کے ساتھ 24 گھنٹے کی شکل میں گھڑی 06
ک 24 گھنٹے کی شکل میں گھنٹوں کی تعداد 18
کے 12 گھنٹے کی شکل میں گھنٹوں کی تعداد 6
h بغیر کسی صفر کے 12 گھنٹے کی شکل میں وقت 6
hh آگے صفر کے ساتھ 12 گھنٹے کی شکل میں وقت 06
m لیڈنگ صفر کے بغیر منٹ 32
ملی میٹر لیڈنگ صفر کے ساتھ منٹ 32
s لیڈنگ صفر کے بغیر سیکنڈ گیارہ
ss لیڈنگ صفر کے ساتھ سیکنڈ گیارہ
ایس ملی سیکنڈ 297
z ٹائم زون ای ای ٹی
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);

    جیسا کہ آپ دیکھ سکتے ہیں، ہمارے پاس یہاں ایک Locale دلیل ہے۔ اگر ہم اسے چھوڑ دیتے ہیں، تو یہ ڈیفالٹ لوکل استعمال کرے گا، جو ہمیشہ انگریزی نہیں ہوتا ہے۔

    اگر لوکیل ان پٹ سٹرنگ سے مماثل نہیں ہے، تو زبان سے منسلک سٹرنگ ڈیٹا، جیسا کہ ہمارا Mon یا April ، پہچانا نہیں جائے گا اور 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 آپ کو ان تمام تاریخ اور کیلنڈر اشیاء کو فارمیٹ کرنے کی اجازت دیتا ہے جو آپ بعد میں استعمال کے لیے بناتے ہیں۔ آئیے اس طرح کے ایک دلچسپ نکتے پر غور کریں جیسے ایرا کے ساتھ کام کرنا۔ "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