JavaRush /Java blogi /Random-UZ /Qanday qilib vaqtni yo'qotmaslik kerak - DateTime va Cale...

Qanday qilib vaqtni yo'qotmaslik kerak - DateTime va Calendar

Guruhda nashr etilgan
Salom! Bugun biz ilgari uchramagan yangi ma'lumotlar turi, ya'ni sanalar bilan ishlashni boshlaymiz. Qanday qilib vaqtni yo'qotmaslik kerak - DateTime va Calendar - 1Sana nima ekanligini tushuntirishga hojat yo'q deb o'ylayman :) Asosan Java tilida joriy sana va vaqtni oddiy qatorda yozish juda mumkin.
public class Main {
   public static void main(String[] args) {

       String date = "June 11, 2018";
       System.out.println(date);
   }
}
Ammo bu yondashuv juda ko'p kamchiliklarga ega. Sinf Stringmatn bilan ishlash uchun yaratilgan va unda tegishli usullar mavjud. Agar sanani qandaydir tarzda boshqarishimiz kerak bo'lsa (masalan, unga 2 soat qo'shing), u Stringbu erda ishlamaydi. Yoki, masalan, dastur konsolga tuzilgan paytdagi joriy sana va vaqtni ko'rsating. Bu erda Stringham yordam bermaydi: kodni yozish va uni ishga tushirish vaqtida vaqt o'zgaradi va konsolda ahamiyatsiz narsa ko'rsatiladi. Shuning uchun Java-da uning yaratuvchilari sana va vaqt bilan ishlash uchun bir nechta sinflarni taqdim etdilar. Birinchisi - sinfjava.util.Date

Java sana sinfi

Biz uning to'liq nomini berdik, chunki Java'da boshqa paketda sinf ham mavjud java.sql.Date. Adashib qolmang! Bu haqda bilishingiz kerak bo'lgan birinchi narsa shundaki, u 1970 yil 1 yanvardan beri o'tgan sanani millisekundlarda saqlaydi . Bu sananing hatto alohida nomi ham bor - “Unix time”. Juda qiziq usul, rozi emasmisiz? :) Eslash kerak bo'lgan ikkinchi narsa: agar siz bo'sh konstruktor bilan ob'ekt yaratsangiz , natija ob'ekt yaratilgan paytdagi joriy sana va vaqtDate bo'ladi . Sana formati uchun bunday vazifa muammoli bo'lishini qanday yozganimizni eslaysizmi? Sinf buni osonlikcha hal qiladi. StringDate
public class Main {
   public static void main(String[] args) {

       Date date = new Date();
       System.out.println(date);
   }
}
Ushbu kodni bir necha marta ishga tushiring va har safar vaqt qanday o'zgarishini ko'rasiz :) Bu aniq, chunki u millisekundlarda saqlanadi: ular vaqtning eng kichik birligi, shuning uchun natijalar juda aniq. Buning uchun yana bir konstruktor mavjud Date: 1970-yil 1-yanvar soat 00:00 dan kerakli sanagacha oʻtgan millisekundlarning aniq sonini belgilashingiz mumkin va u yaratiladi:
public class Main {
   public static void main(String[] args) {

       Date date = new Date(1212121212121L);
       System.out.println(date);
   }
}
Konsol chiqishi:

Fri May 30 08:20:12 MSD 2008
Biz uni 2008 yil 30 mayda oldik. "Jum" haftaning kunini anglatadi - "Juma" (juma) va MSD - "Moskvada yozgi vaqt" (Moskva yoz vaqti). Millisoniyalar formatda uzatiladi long, chunki ularning soni ko'pincha mos kelmaydi int. Xo'sh, ishimizda qanday sana operatsiyalari kerak bo'lishi mumkin? Xo'sh, eng aniq narsa, albatta, taqqoslashdir . Bir sana boshqasidan kechmi yoki ertami, aniqlang. Bu turli yo'llar bilan amalga oshirilishi mumkin. Masalan, Date.getTime()1970-yil 1-yanvar yarim tundan beri oʻtgan millisekundlar sonini qaytaradigan usulni chaqirishingiz mumkin. Keling, uni ikkita Date obyektiga chaqiramiz va ularni bir-biri bilan solishtiramiz:
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");
   }
}
Xulosa:

date1 раньше date2
Lekin qulayroq yo'l bor, ya'ni sinfning maxsus usullaridan foydalanish Date: before(), after()va equals(). Ularning barchasi natijani qaytaradi boolean. Usul before()bizning sanamiz argument sifatida berilgan sanadan oldinroq ekanligini tekshiradi:
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));
   }
}
Konsol chiqishi:

true
Usul shunga o'xshash tarzda ishlaydi after(); u bizning sanamiz argument sifatida berilgan sanadan kechroq bo'lganligini tekshiradi:
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));
   }
}
Konsol chiqishi:

false
Bizning misollarimizda biz dasturni 2 soniya davomida uyqu rejimiga qo'yamiz, shunda ikkita sana har xil bo'lishi kafolatlanadi. Tezkor kompyuterlarda yaratish date1va orasidagi vaqt date2bir millisekunddan kam bo'lishi mumkin, bu holda ikkala usul ham qaytib before()keladi . Ammo bunday vaziyatda usul qaytib keladi ! Axir u har bir sana uchun 1970-yil 1-yanvar soat 00:00 dan beri o‘tgan millisekundlar sonini aniq taqqoslaydi. Ob'ektlar faqat millisekundgacha mos kelsa, teng deb hisoblanadi: 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));
}
Bu erda yana bir narsaga e'tibor berishingiz kerak. Agar siz Oracle veb-saytida sinf uchun hujjatlarni ochsangiz Date, uning ko'plab usullari va konstruktorlari (“eskirgan”) sifatida belgilanganligini ko'rasiz Deprecated. Mana, qarang: Sinf sanasi Java yaratuvchilari sinflarning eskirgan qismlari haqida mana shunday deyishadi: “ @Deprecated bilan izohlangan dastur elementi, odatda, xavfli yoki shu sababli dasturchilardan foydalanishdan bosh tortadigan narsadir. yaxshiroq alternativa bor." Bu bu usullardan umuman foydalanish mumkin emas degani emas. Date.getHours()Bundan tashqari, agar siz IDEA da ulardan foydalanib kodni ishga tushirishga harakat qilsangiz, u katta ehtimol bilan ishlaydi.Masalan , ob'ektdan soatlar sonini qaytaradigan eskirgan usulni olaylik Date.
public static void main(String[] args) {

   Date date1 = new Date();

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

}
Agar siz kodni ishga tushirayotgan vaqtda, masalan, vaqt 14:21 bo'lsa, u 14 raqamini ko'rsatadi. Ko'rib turganingizdek, eskirgan usul chizilgan, lekin u juda yaxshi ishlaydi. Ushbu usullar ular yordamida allaqachon yozilgan kodlar to'plamini buzmaslik uchun butunlay olib tashlanmadi. Ya'ni, bu usullar "buzilgan" yoki "olib tashlanmagan" emas, ulardan qulayroq alternativa mavjudligi sababli ulardan foydalanish tavsiya etilmaydi. Aytgancha, bu haqda to'g'ridan-to'g'ri hujjatlarda yozilgan: Qanday qilib vaqtni yo'qotmaslik kerak - DateTime va Calendar - 2Date sinfining ko'pgina usullari uning takomillashtirilgan, kengaytirilgan versiyasiga ko'chirildi - class Calendar. Biz u bilan yaqinroq tanishamiz :)

Java kalendar

Java 1.1 yangi sinfni taqdim etdi - Calendar. U Java-da sanalar bilan ishlashni avvalgidan ko'ra biroz osonlashtirdi. CalendarBiz ishlaydigan sinfning yagona amalga oshirilishi bu sinfdir GregorianCalendar(u dunyoning aksariyat mamlakatlari yashaydigan Grigorian kalendarini amalga oshiradi). Uning asosiy qulayligi shundaki, u sanalar bilan qulayroq formatda ishlay oladi. Masalan, u:
  • Joriy sanaga bir oy yoki kun qo'shing
  • Yil kabisa yili ekanligini tekshiring;
  • Ayrim sana komponentlarini oling (masalan, butun sanadan oy raqamini oling)
  • Va shuningdek, uning ichida juda qulay konstantalar tizimi ishlab chiqilgan (biz ularning ko'pchiligini quyida ko'rib chiqamiz).
Sinfning yana bir muhim farqi Calendarshundaki, u doimiylikni amalga oshiradi Calendar.Era: siz sanani miloddan avvalgi ("Masihdan oldin" - Masih tug'ilishidan oldin, ya'ni "bizning eramizdan oldin") yoki AC ("Masihdan keyin" - " bizning davrimiz"). Bularning barchasini misollar bilan ko'rib chiqaylik. Keling, 2017 yil 25 yanvar sanasi bilan taqvim yarataylik:
public static void main(String[] args) {

  Calendar calendar = new GregorianCalendar(2017, 0 , 25);
}
Sinfdagi oylar Calendar(aytmoqchi Date, kabi) noldan boshlanadi, shuning uchun biz ikkinchi argument sifatida 0 raqamini o'tkazdik. Sinf bilan ishlashda asosiy narsa bu alohida sana emas, balki kalendarCalendar ekanligini tushunishdir . Sana shunchaki ma'lum bir vaqt davrini ifodalovchi raqamlar qatoridir. Taqvim esa sanalar bilan ko'p ishlarni bajarishingiz mumkin bo'lgan butun qurilma :) Agar siz Taqvim ob'ektini konsolga chiqarishga harakat qilsangiz, buni aniq ko'rish mumkin: Chiqish: Qanday qilib vaqtni yo'qotmaslik kerak - DateTime va Calendar - 3

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=?]
Qarang, qancha ma'lumot bor! Kalendarda oddiy sanada mavjud bo'lmagan bir qancha xususiyatlar mavjud va ularning barchasi konsolga chiqariladi ( toString()sinfdagi usul shunday ishlaydi Calendar). Agar ishlayotganda, siz taqvimdan oddiy sanani olishingiz kerak bo'lsa, ya'ni. ob'ekt Date- bu usul yordamida amalga oshiriladi Calendar.getTime()(nom eng mantiqiy emas, lekin hech narsa qilish mumkin emas):
public static void main(String[] args) {

   Calendar calendar = new GregorianCalendar(2017, 0 , 25);
   Date date = calendar.getTime();
   System.out.println(date);
}
Xulosa:

Wed Jan 25 00:00:00 MSK 2017
Endi biz taqvimni oddiy sanaga "soddalashtirdik". Keling, davom etaylik. Oylar uchun raqamli belgilardan tashqari, Calendarsinfda doimiylardan foydalanish mumkin. CalendarDoimiylar - bu o'zgartirib bo'lmaydigan qiymatga ega bo'lgan sinfning statik maydonlari . Ushbu parametr aslida yaxshiroq, chunki u kodning o'qilishini yaxshilaydi.
public static void main(String[] args) {
   GregorianCalendar calendar = new GregorianCalendar(2017, Calendar.JANUARY , 25);
}
Calendar.JANUARY— oyni ko'rsatish uchun konstantalardan biri. Ushbu nomlash opsiyasi bilan, masalan, "3" raqami biz o'rgangan uchinchi oy - martni emas, balki aprelni bildirishini hech kim unutmaydi. Siz shunchaki yozasiz Calendar.APRIL- va shunday :) Barcha taqvim maydonlari (kun, oy, daqiqalar, soniyalar va boshqalar) usuli yordamida individual ravishda o'rnatilishi mumkin set(). Bu juda qulay, chunki Calendarhar bir maydon sinfda o'z doimiysiga ega va yakuniy kod imkon qadar sodda ko'rinadi. Misol uchun, oldingi misolda biz sana yaratdik, lekin uning uchun joriy vaqtni belgilamadik. Keling, vaqtni 19:42:12 ga belgilaymiz
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());
}
Xulosa:

Wed Jan 25 19:42:12 MSK 2017
Biz usulni chaqiramiz set(), unga doimiy (biz o'zgartirmoqchi bo'lgan maydonga qarab) va ushbu maydon uchun yangi qiymatni o'tkazamiz. Ma'lum bo'lishicha, usul set()bir maydon uchun emas, balki ko'p maydonlar uchun qiymat o'rnatishi mumkin bo'lgan o'ziga xos "super o'rnatuvchi" dir :) Sinfdagi qiymatlarni qo'shish va Calendarayirish add(). Unga siz o'zgartirmoqchi bo'lgan maydonni va raqamni kiritishingiz kerak - joriy qiymatdan qancha qo'shish/ayirish kerakligi. Masalan, biz yaratgan sanani 2 oy oldin belgilaymiz:
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());
}
Xulosa:

Fri Nov 25 19:42:12 MSK 2016
Ajoyib! Biz sanani 2 oy oldinga qaytardik. Natijada, nafaqat oy, balki yil ham o'zgardi, 2017 yildan 2016 yilgacha sanalarni ko'chirishda joriy yilni hisoblash, albatta, avtomatik ravishda amalga oshiriladi va qo'lda nazorat qilish kerak emas. Ammo agar biron bir maqsadda siz ushbu xatti-harakatni o'chirib qo'yishingiz kerak bo'lsa, buni qilishingiz mumkin. Maxsus usul roll()boshqa qiymatlarga ta'sir qilmasdan qiymatlarni qo'shishi va olib tashlashi mumkin. Masalan, bu kabi:
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());
}
Biz oldingi misolda bo'lgani kabi xuddi shunday qildik - joriy sanadan 2 oyni olib tashladik. Ammo endi kod boshqacha ishladi: oy yanvardan noyabrgacha o'zgardi, lekin yil 2017 yilgidek qoldi! Xulosa:

Sat Nov 25 10:42:12 MSK 2017
Keyinchalik. Yuqorida aytganimizdek, ob'ektning barcha maydonlarini Calendaralohida olish mumkin. Buning uchun usul javobgar 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));

}
Xulosa:

Год: 2017 
Месяц: 0 
Порядковый номер недели в месяце: 4 
Число: 25 
Часы: 10 
Минуты: 42 
Секунды: 12 
Миллисекунды: 0
Ya'ni, sinfda "super-setter" dan tashqari, Calendar"super-getter" ham mavjud :) Yana bir qiziqarli nuqta, albatta, davrlar bilan ishlash. "BC" sanasini yaratish uchun siz maydonni ishlatishingiz kerak Calendar.Era Masalan, Gannibal Rim armiyasini mag'lub etgan Kanna jangini ko'rsatadigan sanani yarataylik. Bu miloddan avvalgi 216 yil 2 avgustda sodir bo'lgan. 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()));
}
Bu erda biz sinfni SimpleDateFormatsanani bizga tushunarliroq formatda ko'rsatish uchun ishlatdik ("GG" harflari davrni ko'rsatish uchun javobgardir). Xulosa:

02 авг 216 до н.э.
Sinfda Calendaryana ko'plab usullar va konstantalar mavjud , ular haqida hujjatlarda o'qing:

Satrni sanaga aylantirish

Stringni sanaga aylantirish uchun siz Java yordamchi sinfidan foydalanishingiz mumkin - SimpleDateFormat . Bu sanani siz belgilagan formatga aylantirishingiz kerak bo'lgan sinf. Qanday qilib vaqtni yo'qotmaslik kerak - DateTime va Calendar - 5O'z navbatida, u juda o'xshash DateFormat . Ikkalasi o'rtasidagi yagona sezilarli farq shundaki, SimpleDateFormat formatlash (sanani satrga aylantirish) va satrni mahalliy sanaga ajratish uchun ishlatilishi mumkin, DateFormat esa mahalliy tilni qo'llab-quvvatlamaydi. Bundan tashqari, DateFormat sanalarni formatlash va tahlil qilish uchun asosiy yordamni ta'minlovchi mavhum sinfdir, SimpleDateFormat esa DateFormat sinfini kengaytiruvchi aniq sinfdir. SimpleDateFormat obyektini yaratish va sanani formatlash misoli shunday ko'rinadi:
SimpleDateFormat formater = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date(1212121212121L);

System.out.println(formatter.format(date));
Yuqoridagi misolda biz "yyyy-AA-dd HH:dd:ss" naqshidan foydalanganmiz, bu:
  • Yil uchun 4 ta raqam (yyyy);
  • Oy uchun 2 ta raqam (MM);
  • kun uchun 2 ta raqam (dd);
  • 24 soatlik formatda soatlar uchun 2 ta raqam (HH);
  • daqiqalar uchun 2 ta raqam (mm);
  • soniya uchun 2 ta raqam (ss).
Ajratish belgilari va naqsh belgilarining tartibi saqlanadi. Konsol chiqishi:
2008-05-30 08:20:12
SimpleDateFormat sinfi uchun juda ko'p shablon harflari mavjud . Siz chalkashmaslik uchun biz ularni jadvalda to'pladik:
Belgi Tavsif Misol
G davr (ingliz tilida - miloddan avvalgi va miloddan avvalgi) AD
y yil (4 xonali raqam) 2020
yy yil (oxirgi 2 ta raqam) 20
yyyy yil (4 xonali raqam) 2020
M oy raqami (boshlovchi nolsiz) 8
MM oy raqami (agar oy soni < 10 bo'lsa, bosh nol bilan) 04
MMM uch harfli oy qisqartmasi (mahalliylashtirish bo'yicha) Yanvar
MMMM to'liq oy nomi iyun
w yilning haftasi (boshlovchi nolsiz) 4
ww yil haftasi (bosh nol bilan) 04
V oyda hafta (bosh nolsiz) 3
WW oyda hafta (bosh nol bilan) 03
D yil kuni 67
d oyning kuni (boshlovchi nolsiz) 9
dd oy kuni (bosh nol bilan) 09
F oyda haftaning kuni (bosh nolsiz) 9
FF oyda haftaning kuni (bosh nol bilan) 09
E haftaning kuni (qisqartma) V
EEEE haftaning kuni (to'liq) Juma
u hafta raqami (boshlovchi nolsiz) 5
uu hafta kunining raqami (bosh nol bilan) 05
a AM/PM belgisi A.M.
H soatlar 24 soatlik formatda bosh nolsiz 6
H.H soat bosh nol bilan 24 soatlik formatda 06
k 24 soatlik formatdagi soatlar soni 18
K 12 soatlik formatdagi soatlar soni 6
h vaqt 12 soatlik formatda bosh nolsiz 6
hh vaqt 12 soatlik formatda bosh nol bilan 06
m bosh nolsiz daqiqalar 32
mm daqiqalar bosh nol bilan 32
s bosh nolsiz soniyalar o'n bir
ss soniya bosh nol bilan o'n bir
S millisekundlar 297
z Vaqt zonasi Sharqiy Yevropa vaqti
Z RFC 822 formatidagi vaqt mintaqasi 300
Naqshli belgilar kombinatsiyasiga misollar:
Namuna Misol
dd-MM-yyyy 01.11.2020
yyyy-AA-dd 2019-10-01
HH:dd:ss.SSS 23:59.59.999
yyyy-AA-dd SS:dd:ss 2018-11-30 03:09:02
yyyy-AA-dd SS:dd:ss.SSS 2016-03-01 01:20:47.999
yyyy-AA-dd SS:dd:ss.SSS Z 2013-13-13 23:59:59.999 +0100
Agar siz formatda biroz xatoga yo'l qo'ysangiz, java.text.ParseException egasi bo'lishingiz mumkin va bu unchalik yoqimli yutuq emas. SimpleDateFormat- ga qisqa ekskursiya tugadi - keling, bugungi kungacha java string tarjimasiga qaytaylik . SimpleDateFormat bizga shunday imkoniyatlarni beradi va biz bu jarayonni bosqichma-bosqich bosib o'tamiz.
  1. Sanani belgilashingiz kerak bo'lgan qatorni yarating:

    String strDate = "Sat, April 4, 2020";
  2. Biz satrda mavjud bo'lgan narsalarga mos keladigan shablon bilan yangi SimpleDateFormat ob'ektini yaratamiz (aks holda biz uni tahlil qila olmaymiz):

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

    Ko'rib turganingizdek, bu erda bizda Locale argumenti bor. Agar biz uni o'tkazib yuborsak, u har doim ham ingliz tilida bo'lmagan standart Locale-dan foydalanadi.

    Agar mahalliy til kiritilgan satrga mos kelmasa, u holda biznikidagi Mon yoki Aprel kabi tilga bog'langan string ma'lumotlari tan olinmaydi va naqsh mos kelsa ham java.text.ParseException ni chiqaradi.

    Biroq, agar biz tilga xos bo'lmagan shablondan foydalanayotgan bo'lsak, formatni ko'rsatishimiz shart emas. Misol tariqasida - yyyy-AA-dd HH:dd:ss

  3. Biz formatlashtiruvchi yordamida sanani yaratamiz, u o'z navbatida uni kirish satridan tahlil qiladi:

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

    Konsol chiqishi:

    
    Sat Apr 04 00:00:00 EEST 2020

    Hmmm... Lekin format endi bir xil emas!

    Xuddi shu formatni yaratish uchun biz yana formatlovchidan foydalanamiz:

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

    Konsol chiqishi:

    
    Sat, April 4, 2020

SimpleDateFormat va Kalendar

SimpleDateFormat keyinchalik foydalanish uchun yaratgan barcha Sana va Taqvim obyektlarini formatlash imkonini beradi. Keling, davrlar bilan ishlash kabi qiziqarli nuqtani ko'rib chiqaylik. “BC” sanasini yaratish uchun Calendar.Era maydonidan foydalanish kerak.Masalan, Gannibal Rim armiyasini mag‘lub etgan Kanna jangini ko‘rsatuvchi sanani yarataylik. Bu miloddan avvalgi 216 yil 2 avgustda sodir bo'lgan. 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()));
}
Bu erda biz SimpleDateFormat sinfidan sanani bizga tushunarliroq formatda ko'rsatish uchun foydalandik (yuqorida aytib o'tilganidek, "GG" harflari davrni ko'rsatish uchun javobgardir). Xulosa:

02 авг 216 до н.э.

Java sana formati

Mana yana bir holat. Aytaylik, bu sana formati bizga mos kelmaydi:

Sat Nov 25 10:42:12 MSK 2017
Demak, bu yerda. Java sana formatidagi imkoniyatlarimizdan foydalanib, uni hech qanday qiyinchiliksiz o'zingizga o'zgartirishingiz mumkin:
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()));
}
Xulosa:

суббота, 25 Ноябрь 2017
Juda yaxshi, to'g'rimi? :)
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION