1. Date Time API ga kirish

Java yaratuvchilariga Date va Calendar sinflari joriy holati unchalik yoqmas edi. Ular o‘z vaqtida yaxshi edi, lekin davrlar o‘zgarmoqda. Oddiy, kuchli va ishonchli narsa kerak edi. Nihoyat, Java8 ning chiqishi bilan (Calendar ning chiqqanidan 15 yil oʻtib) Java Date Time API taqdim etildi: barcha vaqt bilan bog‘liq muammolarni hal qilishi kerak bo‘lgan sinflar to‘plami.
Sinflar shunchalik koʻp ediki, ularni bir nechta paketlarga bo‘lishdi:
Paket java.time — Java Date Time API uchun asosiy paket: unda LocalDate, LocalTime, LocalDateTime, Instant, Period, Duration kabi sinflar mavjud. Ushbu sinflarning barcha obyektlari immutable: yaratishdan keyin ularni o‘zgartirib bo‘lmaydi.
Paket java.time.format vaqti formatlash uchun sinflarni oʻz ichiga oladi: vaqtni (va sanani) matnli satrga va teskari koʻrinishga oʻtkazish. Masalan, unda DateTimeFormatter kabi universal sinf mavjud boʻlib, u SimpleDateFormat oʻrniga keldi.
Paket java.time.zone vaqt mintaqalari (time zones) bilan ishlash uchun sinflarni oʻz ichiga oladi. U TimeZone va ZonedDateTime kabi sinflarni oʻz ichiga oladi. Agar siz server uchun kod yozayotgan bo‘lsangiz va uning mijozlari dunyoning turli burchaklarida bo‘lsa, bu sinflar sizga juda kerak bo‘ladi.
2. Klass LocalDate
Date Time API dan o‘rganadigan birinchi va eng foydali klass — bu LocalDate klassi. Siz uning nomidan taxmin qilish mumkin, bu klass sana bilan ishlash uchun yaratilgan.
Ushbu klassning obyektlari yaratishdan keyin o‘zgartirilmaydi (LocalDate klassi immutable). Bu esa klassga soddalik va ishonchlilik qo‘shdi. Ayniqsa, agar klass obyektlari bir nechta iplar (ishtirok iplar) bir vaqtning o‘zida o‘zaro aloqada bo‘lsa.
Yangi LocalDate klassi obyektini yaratish uchun bir nechta statik metodlardan foydalanish kerak. Quyidagi asosiy metodlar ro‘yxati.
Hozirgi sanani olish
Hozirgi sanani olish uchun now() statik metoddan foydalanish kerak. Bu juda ham oson, ko‘rinib turibdiki:
LocalDate today = LocalDate.now();
Bu yerda today — bu LocalDate klassining o‘zgaruvchisi, va LocalDate.now() — bu now() statik metodi chaqiruvi LocalDate klassidan.
Misol:
| Kod | Ekranga chiqarish |
|---|---|
|
|
Muayyan vaqt mintaqasida sanani olish
Shuningdek, LocalDate klassida now(ZoneId) metodi ko'rinishida bo'lib, u ma'lum bir vaqt mintaqasidagi hozirgi sanani olishga imkon beradi.
Buning uchun bizga yana bir klass kerak bo‘ladi — ZoneId (java.time.ZoneId). Unda of() metodi bor bo‘lib, u vaqt mintaqasi nomi bo‘yicha ZoneId obyektini qaytaradi.
Xitoyning Shanchaydagi hozirgi sanasini aniqlash uchun kodni yozish kerak:
| Kod | Ekranga chiqarish |
|---|---|
|
|
Barcha vaqt mintaqalari (time zone) nomlarining ro‘yxatini internetdan topish mumkin.
3. Aniq sanani olish
Muayyan sanani o'z ichiga oluvchi LocalDate obyektini olish uchun of() statik metodidan foydalanish kerak. Hammasi juda oddiy va tushunarli ko'rinadi:
LocalDate date = LocalDate.of(2019, Month.FEBRUARY, 22);
Bu yerda date — bu LocalDate klassining o‘zgaruvchisi, va LocalDate.of() — bu of() statik metodi chaqiruvi LocalDate klassidan.
Shuningdek, bu yerda maxsus FEBRUARY klassi Month (java.time.Month) konstantasidan foydalanilayotganini ko‘ramiz, bu fevral oyi uchun
Qadimgi usulda raqam yordamida ham oy belgilanadi:
LocalDate date = LocalDate.of(2019, 2, 22);
Ikki? Fevral oyi o'rniga? Oylar yana birdan mi?
Ha, nihoyat, Java yaratishdan deyarli 20 yil o'tib, oylar noldan boshlangani tugadi.
Misol:
| Kod | Ekranga chiqarish |
|---|---|
|
|
Kunning raqami bo‘yicha sanani olish
Sanani yaratishning yana bir qiziqarli usuli mavjud: ofYearDay metodi orqali yilning raqami va yil kunining raqamiga ega bo'lgan sana olish mumkin. Umumiy ko'rinish quyidagicha:
LocalDate date = LocalDate.ofYearDay(yil, kun);
Bu yerda yil — yil raqami, kun esa yil kuni raqami.
Misol:
| Kod | Ekranga chiqarish |
|---|---|
|
|
2019 yilning yuzinchi kuni — 10 aprel.
Unix sanani olish
Date sinfining obyektlari har doim vaqtni 1970 yil 1 yanvardan boshlangan millisekundlar bilan saqlaganini eslaysizmi? Dasturchilar eski yaxshi davrlarda zerikmasligi uchun LocalDate sinfiga ofEpochDay() metodi qo‘shilgan, bu sana, 1970 yil 1 yanvardan boshlab, odni qaytaradi. Umumiy ko'rinish quyidagicha:
LocalDate date = LocalDate.ofEpochDay(kun);
Bu yerda kun — bu 1970 yil 1 yanvardan boshlab o'tgan kunlar soni.
Misol:
| Kod | Ekranga chiqarish |
|---|---|
|
|
4. Sananing fragmentlarini olish
LocalDate sinfidagi obyektlarni o'zgartirib bo'lmaydi, lekin sananing alohida bo'laklarini olish mumkin. Buning uchun LocalDate klassi obyektlarida bir nechta metodlar mavjud:
| Metod | Ta'rif |
|---|---|
|
Muayyan sanadan yilni qaytaradi |
|
Sanadagi oyni qaytaradi — maxsus konstantalardan biriJANUARY, FEBRUARY, ...; |
|
Sanadagi oy raqamini qaytaradi. Yanvar == 1. |
|
Oy kunining raqamini qaytaradi |
|
Yil boshidan boshlab kunning raqamini qaytaradi |
|
Haftaning kunini qaytaradi: maxsus konstantalardan biriMONDAY, TUESDAY, ...; |
|
Eratni qaytaradi: BC (Before Current Era) va CE(Current Era) konstanti |
Misol:
| Kod | Ekranga chiqarish |
|---|---|
|
|
5. LocalDate obyektidagi sanani o'zgartirish
LocalDate klassida sanani o‘zgartirish imkonini beruvchi bir nechta metodlar mavjud. Ushbu metodlar String klassi metodlariga o‘xshab amalga oshirilgan: ushbu metodlarning har biri mavjud LocalDate obyektini o'zgartirmaydi, balki kerakli ma'lumotlarni o'z ichiga olgan yangi obyektni qaytaradi.
LocalDate klassida quyidagi metodlar mavjud:
| Metod | Ta'rif |
|---|---|
|
Sanaga ma'lum miqdorda kun qo'shadi |
|
Sanaga haftalar qo'shadi |
|
Sanaga oylar qo'shadi |
|
Sanaga yillar qo‘shadi |
|
Sanadan kunlarni ayiradi |
|
Sanadan haftalarni ayiradi |
|
Sanadan oylarni ayiradi |
|
Sanadan yillarni ayiradi |
Misol:
| Kod | Ekranga chiqarish |
|---|---|
|
|
Biz metodlarini chaqirgan birthday obyekt o'zgarmaydi. Buning o'rniga uning metodlari kerakli ma'lumotlarni o'z ichiga olgan yangi obyektlarni qaytaradi.
GO TO FULL VERSION