TimeZone — iOS va macOS-dagi Foundation klassi bo‘lib, vaqt mintaqalari haqidagi ma’lumotlarni umumlashtirib, vaqtni geografik hududlar o‘rtasida to‘g‘ri konvertatsiya qilish uchun xizmat qiladi. Apple Developer Documentation, 2024 ma’lumotlariga ko‘ra, TimeZone vaqt mintaqasi identifikatorlari (IANA Time Zone Database), UTC ga nisbatan siljish va yozgi vaqtga o‘tish qoidalari bilan ishlash uchun metodlarni taqdim etadi. Klass DateFormatter va Calendar bilan integratsiyalashgan bo‘lib, sanalarni formatlashda to‘g‘ri vaqt mintaqasining avtomatik qo‘llanilishini ta’minlaydi. Qo‘lda siljish hisoblashdan farqli o‘laroq, TimeZone qurilmaning vaqt mintaqasi o‘zgarganda ma’lumotlarni avtomatik yangilaydi.
Asosiy ma’lumotlar
TimeZone — Swift-da geografik vaqt mintaqasi haqida ma’lumot beruvchi value tipidir: UTC ga nisbatan siljish, nom, qisqartma va yozgi vaqtga o‘tish qoidalari. Objective-C da klass NSTimeZone deb ataladi. Ikkala klass ham 1970 yildan boshlab vaqt mintaqalari o‘zgarishlari tarixini o‘z ichiga olgan IANA Time Zone Database-ga (Olson ma’lumotlar bazasi sifatida ham tanilgan) asoslanadi.
Har bir TimeZone namunasi vaqt mintaqasi identifikatorini (masalan, Europe/Moscow), UTC dan soniyalardagi joriy siljishni, isDaylightSavingTime bayrog‘ini va keyingi o‘tish sanasini saqlaydi. Identifikator asosiy kalitdir: TimeZone(identifier:) bilan ishga tushirishda tizim qurilmaning vaqt mintaqalari ma’lumotlar bazasidan tegishli yozuvni yuklaydi.
IANA (2024) ma’lumotlariga ko‘ra, ma’lumotlar bazasi 600 dan ortiq noyob vaqt mintaqasi identifikatorlarini o‘z ichiga oladi. Apple iOS va macOS ning har bir versiyasida ushbu bazaning bir qismini taqdim etadi, bu esa tarmoq so‘rovlarisiz barcha qurilmalarda hisob-kitoblarning bir xilligini kafolatlaydi.
Arxitekturasi — Foundation-dagi TimeZone ikki darajali tizimga asoslangan: vaqt mintaqasi identifikatori (inson o‘qiy oladigan nom) va uning sonli ifodasi (UTC dan siljish). Tizim qurilma sozlamalaridan joriy vaqt mintaqasini avtomatik tanlaydi, ammo dasturchi uni muayyan formatlash operatsiyalari uchun o‘zgartirishi mumkin.
TimeZone Calendar va DateFormatter bilan chambarchas bog‘liq. Sanani formatlashda DateFormatter vaqtning mutlaq momentini (Date) tegishli vaqt mintaqasida matn ko‘rinishiga o‘tkazish uchun TimeZone namunasining timeZone xususiyatidan foydalanadi. Agar timeZone o‘rnatilmagan bo‘lsa, standart tizim vaqt mintaqasi — TimeZone.current ishlatiladi.
| Tur | Ishga tushirish | Xususiyatlari |
|---|---|---|
| Joriy | TimeZone.current | Sozlamalarda hudud o‘zgarganda avtomatik yangilanadi, yozgi vaqtni kuzatadi |
| Qat’iy | TimeZone(identifier:) | Qurilma hududiga bog‘liq emas. Tanlangan identifikatorni doimiy qo‘llaydi |
| UTC | TimeZone(secondsFromGMT: 0) | Korreksiyasiz vaqt mintaqasi. Identifikator: GMT |
| Ixtiyoriy siljish bilan | TimeZone(secondsFromGMT: 10800) | Soniyalardagi qat’iy siljish. Yozgi vaqtni hisobga olmaydi |
Muhim nuance: TimeZone(identifier:) noma’lum identifikatorlar uchun nil qaytaradi. Bu ilovaning ishdan chiqishining tez-tez uchraydigan sababi — dasturchilar foydalanuvchi kiritmasidan noto‘g‘ri identifikator uzatib, ixtiyoriy qiymatni boshqarishni unutadilar. IANA identifikatorlari uchun harf kattaligi muhim: Europe/Moscow — to‘g‘ri, europe/moscow — nil.
IANA Time Zone Database “Hudud/Shahar” (Continent/City) formatidan foydalanadi, bu yerda hudud qit’alardan biri (Africa, America, Asia, Atlantic, Australia, Europe, Indian, Pacific) yoki okean, shahar esa vaqt mintaqasi zonasidagi eng katta aholi punktidir. Bu format identifikatorning noyobligi va o‘qilishini kafolatlaydi.
Asosiy formatdan tashqari, TimeZone uchta qo‘shimcha identifikatsiya usulini qo‘llab-quvvatlaydi: qisqartmalar (MSK, EST, PST), uch harfli vaqt zonasi kodlari (GMT, UTC) va sonli siljishlar (+0300, -0500). Biroq qisqartmalar noaniq: EST ham Eastern Standard Time (GMT-5), ham Avstraliyadagi Eastern Summer Time (GMT+10) ma’nosini berishi mumkin. Apple faqat IANA identifikatorlaridan foydalanishni tavsiya qiladi.
import Foundation
// Barcha ma’lum vaqt mintaqasi identifikatorlarini olish
let allIdentifiers: [String] = TimeZone.knownTimeZoneIdentifiers
print("Jami vaqt mintaqalari: \(allIdentifiers.count)")
// Hudud bo‘yicha filtrlash
let europeZones = allIdentifiers.filter { $0.hasPrefix("Europe/") }
print("Yevropa vaqt mintaqalari: \(europeZones)")
// Qisqartmalar (ishlab chiqarish uchun tavsiya etilmaydi)
if let moscowTimeZone = TimeZone(abbreviation: "MSK") {
print("GMT dan MSK soniyalari: \(moscowTimeZone.secondsFromGMT())")
}
// Siljish bo‘yicha identifikatorni topish
let utcPlus3 = TimeZone(secondsFromGMT: 10800)
print("Identifikator: \(utcPlus3.identifier)")
Qisqartmalar TimeZone.abbreviationDictionary barcha ma’lum vaqt mintaqalari uchun qisqartmalarni o‘z ichiga oladi, ammo bu lug‘at noyoblikni kafolatlamaydi: PST kaliti ham America/Los_Angeles, ham Pacific/Pago_Pago-ga mos kelishi mumkin. Ishlab chiqarish kodida har doim IANA identifikatorlaridan foydalaning.
TimeZone yozgi va qishki vaqtga o‘tishni (DST — Daylight Saving Time) bu qo‘llaniladigan barcha hududlar uchun avtomatik hisobga oladi. Tizim har bir vaqt mintaqasi uchun aniq o‘tish sanalarini o‘z ichiga olgan IANA Time Zone Database-dan tarixiy ma’lumotlardan foydalanadi. isDaylightSavingTime xususiyati, agar vaqt mintaqasi hozirda yozgi vaqtda bo‘lsa, true qaytaradi.
nextDaylightSavingTimeTransition metodi keyingi o‘tish sanasini bilish imkonini beradi, bu kelajakdagi voqealarni rejalashtirish uchun foydalidir. Bu funksiya ayniqsa DST qoidalari tez-tez o‘zgaradigan Braziliya yoki Marokash kabi hududlar uchun muhimdir — 2024 yilgacha Braziliya har yili o‘tish sanalarini o‘zgartirar edi va qo‘lda hisoblash ilovalarda xatolarga olib kelardi.
Apple WWDC 2023 ma’lumotlariga ko‘ra, Foundation asosidagi ICU (International Components for Unicode) kutubxonasi har bir iOS yangilanishida DST ma’lumotlarini yangilaydi. Ilovalar yozgi vaqt haqidagi ma’lumotlarni tizim yangilanishidan keyin bir kundan ortiq keshlamasligi kerak — IANA bazasi vaqt mintaqasi tuzatishlari orqali OT versiyasini yangilamasdan ham o‘zgarishi mumkin.
import Foundation
// Europe/Moscow uchun DST ni tekshirish
let moscow = TimeZone(identifier: "Europe/Moscow")!
let now = Date()
let isMoscowDST = moscow.isDaylightSavingTime(for: now)
print("Moskva hozirda DST da: \(isMoscowDST)")
// Keyingi DST o‘tish sanasini olish
if let nextTransition = moscow.nextDaylightSavingTimeTransition(
after: now
) {
let dstOffset = moscow.daylightSavingTimeOffset(
for: nextTransition
)
print("Keyingi o‘tish: \(nextTransition), DST siljishi: \(dstOffset)s")
}
// DST ma’lumoti bilan xavfsiz konvertatsiya
let newYork = TimeZone(identifier: "America/New_York")!
let offsetNY = newYork.secondsFromGMT(for: now)
print("NY joriy siljishi: \(offsetNY / 3600)h")
Kritik nuance: secondsFromGMT(for:) belgilangan sana uchun DST ni hisobga oladi, secondsFromGMT() esa faqat joriy vaqt uchun. Tarixiy sanalarni formatlashda har doim Date parametri bilan versiyadan foydalaning: secondsFromGMT(for: someHistoricalDate). Farq 1–2 soatgacha bo‘lishi mumkin, bu jurnallar yoki tarixiy ma’lumotlar uchun juda muhimdir.
Sanani formatlash muayyan vaqt mintaqasi bilan — TimeZone bilan ishlashda eng keng tarqalgan vazifa. DateFormatter Date ni matnga o‘tkazish uchun timeZone xususiyatidan foydalanadi. Agar timeZone aniq o‘rnatilmagan bo‘lsa, formatlagich TimeZone.current — foydalanuvchi qurilmasida o‘rnatilgan vaqt mintaqasidan foydalanadi, bu server ma’lumotlari uchun kutilmagan natijalarga olib kelishi mumkin.
import Foundation
// Sanani ma’lum vaqt mintaqasida formatlash
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
let tokyo = TimeZone(identifier: "Asia/Tokyo")!
formatter.timeZone = tokyo
let tokyoTime = formatter.string(from: Date())
print("Tokio vaqti: \(tokyoTime)")
// Foydalanuvchi tanlovi uchun mavjud identifikatorlar
let displayNames: [(String, String)] = TimeZone.knownTimeZoneIdentifiers
.prefix(20)
.map { ($0, TimeZone(identifier: $0)!.localizedName(
for: .generic, locale: .current
)) }
// Ikki vaqt mintaqasini solishtirish
let london = TimeZone(identifier: "Europe/London")!
let difference = tokyo.secondsFromGMT(for: Date())
- london.secondsFromGMT(for: Date())
print("Tokio-London farqi: \(difference / 3600)h")
// Qisqartma lug‘ati bilan ishlash
let knownAbbrevs = TimeZone.abbreviationDictionary
for (abbr, ident) in knownAbbrevs.sorted(by: { $0.key < $1.key }).prefix(5) {
print("\(abbr) -> \(ident)")
}
Mahalliylashtirilgan nom — localizedName(for:locale:) orqali vaqt mintaqasining belgilangan tilda o‘qiladigan nomini qaytaradi. Masalan, Europe/Moscow uchun rus lokalida metod “Moskva”, ingliz lokalida esa “Moscow Time” qaytaradi. Quyidagi uslublar mavjud: .standard (standart nom), .daylightSaving (yozgi vaqt) va .shortGeneric (qisqa).
import Foundation
let paris = TimeZone(identifier: "Europe/Paris")!
let nameRU = paris.localizedName(
for: .standard,
locale: Locale(identifier: "ru_RU")
)
print("Rus nomi: \(nameRU)")
// Hududning bir kunda ekanligini tekshirish
let isSameDay = Calendar.current.isDate(
Date(),
equalTo: Date(),
toGranularity: .day
)
print("Turli vaqt mintaqalarida bir kun: \(isSameDay)")
Serializatsiya — vaqt mintaqasi identifikatorini saqlash TimeZone-ni ma’lumotlar bazalarida yoki UserDefaults-da saqlashning eng yaxshi amaliyotidir. Soniyalardagi siljishni yoki qisqartmani emas, balki identifikatorni (Europe/Moscow tipidagi satrni) saqlang. Siljish DST o‘zgarishi bilan o‘zgarishi mumkin, qisqartma esa noaniq. Qayta tiklash: TimeZone(identifier: savedString).
Qat’iy siljishdan foydalanish vaqt mintaqasi identifikatori o‘rniga — eng keng tarqalgan xato. TimeZone(secondsFromGMT: 10800) DST ni hisobga olmaydi, shuning uchun Europe/Moscow uchun yozda bu konstruksiya 1 soat xato siljish beradi. Yozgi vaqti bo‘lgan hududlar uchun har doim IANA identifikatoridan foydalaning.
Unutilgan nil boshqaruvi TimeZone(identifier:) ishga tushirishda — ikkinchi eng keng tarqalgan xato. Agar foydalanuvchi xato identifikator kiritsa (masalan, “Europe/Moscow” o‘rniga “moscow”), konstruktor nil qaytaradi. Ixtiyoriy qiymatni boshqarmasdan ilova runtime error bilan ishdan chiqadi. guard let yoki ma’lum fallback bilan TimeZone(identifier:) dan foydalaning.
Kelajakdagi sanalar bilan ishlashda DST ni e’tiborsiz qoldirish. TimeZone.secondsFromGMT(for:) — muayyan sana uchun siljishni olishning yagona to‘g‘ri usuli. Parametrsiz secondsFromGMT() dan tarixiy yoki kelajakdagi sanalar uchun foydalanish joriy moment uchun siljishni beradi, bu ko‘rsatilgan sanadagi haqiqiy siljishga mos kelmasligi mumkin, ayniqsa DST bekor qilingan yoki joriy qilingan hududlar uchun.
Stack Overflow (2024) ma’lumotlariga ko‘ra, DateFormatter bilan bog‘liq savollarning taxminan 15% timeZone ning noto‘g‘ri o‘rnatilishi bilan bog‘liq. Odatdagi stsenariy: server UTC da sanani yuboradi, dasturchi formatlagichning timeZone sini o‘rnatmasdan formatlaydi va sana qurilmaning vaqt mintaqasida ko‘rsatiladi, bu turli hududlardagi foydalanuvchilar orasida chalkashlikka olib keladi. Qoida: server ma’lumotlari uchun har doim formatlagichning timeZone sini aniq o‘rnating.
Tez-tez beriladigan savollar
TimeZone — iOS va macOS-da vaqt mintaqalari bilan ishlash uchun Foundation klassi. U UTC ga nisbatan siljish, yozgi vaqtga o‘tish qoidalari va IANA Time Zone Database asosida vaqt mintaqasi identifikatorlari haqida ma’lumot beradi.
Uch format: IANA identifikatorlari (Europe/Moscow), qisqartmalar (MSK, EST) va sonli siljishlar (+0300). Apple ishlab chiqarish kodi uchun yagona aniq format sifatida IANA identifikatorlaridan foydalanishni tavsiya qiladi.
Avtomatik — secondsFromGMT(for:) va isDaylightSavingTime(for:) metodlari orqali. TimeZone iOS ning har bir versiyasida yangilanadigan IANA tarixiy ma’lumotlaridan foydalanadi, bu har qanday sana uchun to‘g‘ri DST o‘tishlarini kafolatlaydi.
TimeZone.current foydalanuvchi sozlamalarda tanlagan vaqt mintaqasini qaytaradi (geografik joydan farq qilishi mumkin). TimeZone.system qurilmaning vaqt mintaqasini qaytaradi, u avtomatik ravishda geografik joylashuvga qarab aniqlanadi va foydalanuvchi tomonidan o‘zgartirilmaydi.
TimeZone.current qurilmaning joriy vaqt mintaqasini qaytaradi. Identifikatorni olish uchun identifier xususiyatidan foydalaning: TimeZone.current.identifier. Mahalliylashtirilgan nom uchun localizedName(for:locale:) metodini chaqiring.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.