1. Klass ZonedDateTime
Date Time API'da yana bir qiziqarli klass bor — ZonedDateTime klassi. Uning asosiy maqsadi — turli soat zonalarida sanalar bilan qulay ishlash.
LocalDate sanani ifodalash uchun juda mos keladi. Masalan, tug'ilgan kun: mening tug'ilgan kunim, qaerda bo'lsam ham, 15-mart. Bu sananing namunasi.
LocalTime vaqtdan foydalanish uchun juda qulay, masalan, budilnik: erta tongda soat beshda budilnik o'rnatdim va qaerda bo'lsam ham hechnarsa fark etmaydi, to'rt besh. Bu vaqt bilan ishlashning bir misoli.
Endi bir dastur yozaylik, samolyot chiptalarini bron qiladi. Samolyotlar mahalliy vaqt bo'yicha uchadi va yetib keladi, samolyot belgilangan vaqt uchi, ammo soat zonalari o'zgaradi.
Soat zonalari
Bu bilan faqat ham kam emas, vaqt zonalari (soat zonalari) bilan jahonda haqiqiy chalkashlik mavjud. Agar siz soat zonalari 24 deb o'ylasangiz, juda xatoga yo'l qo'yasiz.
Misol uchun, Hindistondagi vaqt Grinvichdan 5 yarim soat farq qiladi: GMT+5:30. Ba'zi mamlakatlar yozgi vaqtga o'tishadi, boshqalari esa yo'q. Turli mamlakatlar har xil vaqtga yozgi vaqt rejimiga o'tishadi.
Va ba'zi mamlakatlar qonunlar bilan yozgi vaqtga o'tishni bekor qilishadi, yoki yana o'rnatishadi, yoki yana bekor qilishadi.
Xulosa qilib aytganda, dunyoda soatlar zonalari mavjud, har bir zonada bir vaqt bor. Turli zonalarda vaqt yiling muayyan davrlarida bir xil bo'lishi mumkin, boshqalarida esa farq qiladi. Zonalarga odatda ulardagi yirik shaharlar nomi beriladi: Europe/Monaco, Asia/Singapore, ba'zida esa istisnolar bo'ladi — US/Pacific.
Hozirgi paytda rasmiy ravishda 599 ta vaqt zonalari mavjud. Tasavvur qiling: 599. Bu hech qanday 24 emas. Global dunyoga xush kelibsiz.
Java'da vaqt zonalarini saqlash uchun java.time paketidagi ZoneId klassi ishlatiladi.
Aytgancha, unda getAvailableZoneIds() nomli statik metod mavjud bo'lib, u hozirda ma'lum bo'lgan barcha vaqt zonalarining to'plamini qaytaradi. Barcha zonalarni olish uchun quyidagi kodni yozish kerak:
| Kod | Ekranga chiqarish (qismi) |
|---|---|
|
|
ZoneId ob'ektini uning nomi bilan olish uchun of() statik metodidan foydalanish kerak;
| Kod | Izoh |
|---|---|
|
|
2. ZonedDateTime ob'ekti yaratish
ZonedDateTime ob'ektini yaratishda, unga now() statik metodini chaqirish va ZoneId ob'ektini berish kerak.
| Kod | Ekranga chiqarish |
|---|---|
|
|
Agar now() metodiga ZoneId ob'ektini berilmasa, bu ham mumkin, vaqt zonasi avtomatik ravishda aniqlanadi: dasturning ishlayotgan kompyuteridagi sozlamalar asosida.
Misol:
| Kod | Ekranga chiqarish |
|---|---|
|
|
Global sanani mahalliyga aylantirish
ZonedDateTime ning qiziqarli xususiyatlaridan biri uni mahalliy sana va vaqtda aylantirish imkoniyatidir. Misol.
ZoneId zone = ZoneId.of("Africa/Cairo");
ZonedDateTime cairoTime = ZonedDateTime.now(zone);
LocalDate localDate = cairoTime.toLocalDate();
LocalTime localTime = cairoTime.toLocalTime();
LocalDateTime localDateTime = cairoTime.toLocalDateTime();
3. Vaqt bilan ishlash
LocalDateTime klassida bo'lganidek, ZonedDateTime klassida sanani va vaqtning turli qismlarini olish uchun ko'plab usullar mavjud. Mana, bu metodlarning ro'yxati:
|
Berilgan sanadan yilni qaytaradi |
|
Berilgan sananing oyi qaytaradi: maxsus konstantlardan biri JANUARY, FEBRUARY, ...; |
|
Sana oyining raqamini qaytaradi. Yanvar == 1 |
|
Oydagi kunning raqamini qaytaradi |
|
Haftaning kunini qaytaradi: maxsus konstantlardan biri MONDAY, TUESDAY, ...; |
|
Yildagi kunning raqamini qaytaradi |
|
Soatni qaytaradi |
|
Minutlarni qaytaradi |
|
Sekundlarni qaytaradi |
|
Nanosaniyani qaytaradi |
Barcha metodlar LocalDateTime metodlariga to'liq o'xshash. Va, albatta, ZonedDateTime klassida sana va vaqt bilan ishlash imkonini beruvchi metodlar mavjud. Bu metodlar chaqirilgan ob'ektni o'zgartirmaydi: o'rniga yangi ZonedDateTime ob'ektini qaytaradi:
| Metodlar | Tavsif |
|---|---|
|
Sana yiliga qo'shiladi |
|
Sana oylarini qo'shiladi |
|
Sana kunlarni qo'shiladi |
|
Soat qo'shadi |
|
Minutlar qo'shadi |
|
Sekundlar qo'shadi |
|
Nanosaniyalarni qo'shadi |
|
Sana yilidan ayiriladi |
|
Sana oylaridan ayiriladi |
|
Sana kunlaridan ayiriladi |
|
Soatni ayiradi |
|
Minutlarni ayiradi |
|
Sekundlarni ayiradi |
|
Nanosaniya ayiradi |
Misollar keltirmaymiz: umid qilamizki, yuqorida ko'rib chiqilgan klasslarga o'xshashlik aniq.
GO TO FULL VERSION