JavaRush /Kurslar /All lectures for UZ purposes /Hozirgi kunda Sana bilan ishlash

Hozirgi kunda Sana bilan ishlash

All lectures for UZ purposes
Daraja, Dars
Mavjud

1. Date Time API ga kirish

Введение в Date Time API

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
LocalDate today = LocalDate.now();
System.out.println("Bugun = " + today);

Bugun = 2019-02-22

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
ZoneId  timezone = ZoneId.of("Asia/Shanghai");
LocalDate today = LocalDate.now(timezone);
System.out.println("Hozirda Shanxayda = " + today);


Hozirda Shanxayda = 2019-02-22

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
LocalDate today = LocalDate.of(2019, 2, 22);
System.out.println("Bugun = " + today);

Bugun = 2019-02-22

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
LocalDate today = LocalDate.ofYearDay(2019, 100);
System.out.println("Bugun = " + today);

Bugun = 2019-04-10

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
LocalDate today = LocalDate.ofEpochDay(1);
System.out.println("Bugun = " + today);

Bugun = 1970-01-02

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
int getYear()
Muayyan sanadan yilni qaytaradi
Month getMonth()
Sanadagi oyni qaytaradi — maxsus konstantalardan biri
JANUARY, FEBRUARY, ...;
int getMonthValue()
Sanadagi oy raqamini qaytaradi. Yanvar == 1.
int getDayOfMonth()
Oy kunining raqamini qaytaradi
int getDayOfYear()
Yil boshidan boshlab kunning raqamini qaytaradi
DayOfWeek getDayOfWeek()
Haftaning kunini qaytaradi: maxsus konstantalardan biri
MONDAY, TUESDAY, ...;
IsoEra getEra()
Eratni qaytaradi: BC (Before Current Era) va CE(Current Era) konstanti

Misol:

Kod Ekranga chiqarish
LocalDate today = LocalDate.now();
System.out.println(today.getYear());
System.out.println(today.getMonth());
System.out.println(today.getMonthValue());
System.out.println(today.getDayOfMonth());
System.out.println(today.getDayOfWeek());

2019
FEBRUARY
2
22
FRIDAY

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
plusDays(int days)
Sanaga ma'lum miqdorda kun qo'shadi
plusWeeks(int weeks)
Sanaga haftalar qo'shadi
plusMonths(int months)
Sanaga oylar qo'shadi
plusYears(int years)
Sanaga yillar qo‘shadi
minusDays(int days)
Sanadan kunlarni ayiradi
minusWeeks(int weeks)
Sanadan haftalarni ayiradi
minusMonths(int months)
Sanadan oylarni ayiradi
minusYears(int years)
Sanadan yillarni ayiradi

Misol:

Kod Ekranga chiqarish
LocalDate birthday = LocalDate.of(2019, 2, 28);
LocalDate nextBirthday = birthday.plusYears(1);
LocalDate firstBirthday = birthday.minusYears(30);

System.out.println(birthday);
System.out.println(nextBirthday);
System.out.println(firstBirthday);




2019-02-28
2020-02-28
1989-02-28

Biz metodlarini chaqirgan birthday obyekt o'zgarmaydi. Buning o'rniga uning metodlari kerakli ma'lumotlarni o'z ichiga olgan yangi obyektlarni qaytaradi.


Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION