Soat zonalari

All lectures for UZ purposes
Daraja, Dars
Mavjud

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)
for (String s: ZoneId.getAvailableZoneIds())
   System.out.println(s);
Asia/Aden
America/Cuiaba
Etc/GMT+9
Etc/GMT+8

ZoneId ob'ektini uning nomi bilan olish uchun of() statik metodidan foydalanish kerak;

Kod Izoh
ZoneId zone = ZoneId.of("Africa/Cairo");
Qohira


2. ZonedDateTime ob'ekti yaratish

ZonedDateTime ob'ektini yaratishda, unga now() statik metodini chaqirish va ZoneId ob'ektini berish kerak.

Kod Ekranga chiqarish
ZoneId zone = ZoneId.of("Africa/Cairo");
ZonedDateTime time = ZonedDateTime.now(zone);
System.out.println(time);

2019-02-22T11:37:58.074816+02:00[Africa/Cairo]

Agar now() metodiga ZoneId ob'ektini berilmasa, bu ham mumkin, vaqt zonasi avtomatik ravishda aniqlanadi: dasturning ishlayotgan kompyuteridagi sozlamalar asosida.

Misol:

Kod Ekranga chiqarish
ZonedDateTime time = ZonedDateTime.now();
System.out.println(time);

2019-02-22T13:39:05.70842+02:00[Europe/Helsinki]

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:

int getYear()
Berilgan sanadan yilni qaytaradi
Month getMonth()
Berilgan sananing oyi qaytaradi: maxsus konstantlardan biri JANUARY, FEBRUARY, ...;
int getMonthValue()
Sana oyining raqamini qaytaradi. Yanvar == 1
int getDayOfMonth()
Oydagi kunning raqamini qaytaradi
DayOfWeek getDayOfWeek()
Haftaning kunini qaytaradi: maxsus konstantlardan biri MONDAY, TUESDAY, ...;
int getDayOfYear()
Yildagi kunning raqamini qaytaradi
int getHour()
Soatni qaytaradi
int getMinute()
Minutlarni qaytaradi
int getSecond()
Sekundlarni qaytaradi
int getNano()
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
plusYears(int)
Sana yiliga qo'shiladi
plusMonths(int)
Sana oylarini qo'shiladi
plusDays(int)
Sana kunlarni qo'shiladi
plusHours(int)
Soat qo'shadi
plusMinutes(int)
Minutlar qo'shadi
plusSeconds(int)
Sekundlar qo'shadi
plusNanos(int)
Nanosaniyalarni qo'shadi
minusYears(int)
Sana yilidan ayiriladi
minusMonths(int)
Sana oylaridan ayiriladi
minusDays(int)
Sana kunlaridan ayiriladi
minusHours(int)
Soatni ayiradi
minusMinutes(int)
Minutlarni ayiradi
minusSeconds(int)
Sekundlarni ayiradi
minusNanos(int)
Nanosaniya ayiradi

Misollar keltirmaymiz: umid qilamizki, yuqorida ko'rib chiqilgan klasslarga o'xshashlik aniq.


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