Mobil ishlab chiqishda sana va vaqt — mobil muhandislikning asosiy mavzularidan biridir. iOS DateFormatter va ISO8601DateFormatter dan foydalanadi, Android esa java.time dan DateTimeFormatter va LocalDate dan foydalanadi. Android Developer Docs ga ko'ra, sana va vaqtni formatlash uchun to'g'ri mobil API ni tanlash turli vaqt mintaqalarida ishlash va to'g'ri ko'rsatishga bevosita ta'sir qiladi.
Asosiy fikrlar
iOS da sana va vaqt an'anaviy ravishda Foundation dan DateFormatter orqali formatlanadi. Bu sinf belgilangan naqsh, mahalliy sozlamalar va vaqt mintaqasidan foydalanib Date ni satrga va orqaga aylantiradi. DateFormatter ning asosiy muammosi — ip xavfsiz emas va sekin yaratiladi, shuning uchun mobil kodda nusxalar majburiy ravishda keshlanishi kerak. iOS da mobil ishlab chiqishda sana to'g'ri formatlovchini talab qiladi.
DateFormatter yaratish taxminan 1 millisekund davom etadi, chunki dateFormat naqshini tahlil qilish, mahalliy sozlamalarni yuklash va vaqt mintaqasini aniqlash kerak. Yuzlab sanalar ro'yxatini formatlashda takroriy yaratish UI sezilarli kechikishlarga olib keladi. Yechim — formatlovchini butun ekran uchun bir marta yarating va qayta foydalaning. Ko'p ipli kirish uchun DispatchQueue orqali sinxronizatsiyadan foydalaning.
import Foundation
// Keshlangan DateFormatter — bir marta yaratiladi
private let dateFormatter: DateFormatter = {
let formatter = DateFormatter()
formatter.dateFormat = "dd.MM.yyyy HH:mm"
formatter.locale = Locale(identifier: "ru_RU")
formatter.timeZone = TimeZone(identifier: "Europe/Moscow")
return formatter
}()
// ISO8601DateFormatter — engil alternativ
private let isoFormatter: ISO8601DateFormatter = {
let formatter = ISO8601DateFormatter()
formatter.formatOptions = [.withInternetDateTime, .withFractionalSeconds]
return formatter
}()
let now = Date()
let formattedDate = dateFormatter.string(from: now)
// "01.07.2026 14:30"
let isoDate = isoFormatter.string(from: now)
// "2026-07-01T14:30:00.000Z"
ISO 8601 formati uchun ISO8601DateFormatter dan foydalaning — naqsh ko'rsatishni talab qilmaydi va DateFormatter dan tezroq ishlaydi. iOS 10+ da bu sinf server sanalari bilan ishlash uchun afzal. Eski formatlar uchun DateFormatter ni saqlang, lekin nusxani statik xususiyat yoki singleton sifatida keshlashni unutmang.
Android da sana va vaqt API 26 dan boshlab mavjud bo'lgan java.time paketi orqali qayta ishlanadi. Asosiy sinflar: LocalDate (faqat sana), LocalTime (faqat vaqt), LocalDateTime (vaqt mintaqasisiz sana va vaqt) va ZonedDateTime (vaqt mintaqasi bilan). DateTimeFormatter — Android mobil platformasi uchun ip xavfsiz formatlovchi. Mobil ilovalarda sana ishlash yo'qotilmasdan DateTimeFormatter va LocalDate orqali formatlanadi.
LocalDate vaqtsiz sanani saqlaydi — tug'ilgan kunlar uchun ideal. ZonedDateTime vaqt mintaqasi bilan to'liq ma'lumotni saqlaydi. DateTimeFormatter oldindan belgilangan naqshlarni (ISO_LOCAL_DATE, ISO_DATE_TIME) va ofPattern orqali maxsus naqshlarni qo'llab-quvvatlaydi. Barcha java.time sinflari o'zgarmas va ip xavfsizdir, bu bir nechta iplarda ishlashda poyga shartlarini yo'q qiladi.
import java.time.LocalDate
import java.time.LocalDateTime
import java.time.ZonedDateTime
import java.time.format.DateTimeFormatter
import java.time.ZoneId
// Joriy sanani yaratish va formatlash
val today = LocalDate.now()
val formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy")
val formatted = today.format(formatter)
// Vaqt mintaqalari bilan ishlash
val utcTime = ZonedDateTime.now(ZoneId.of("UTC"))
val moscowTime = utcTime.withZoneSameInstant(ZoneId.of("Europe/Moscow"))
DateTimeFormatter SimpleDateFormat dan sezilarli darajada samaraliroq, chunki har bir chaqiruvda naqshni tahlil qilmaydi. Formatlovchi konstantalarini sinf yoki hamroh ob'ekt darajasida yaratish tavsiya etiladi. Unix Timestamp ni aylantirish uchun Instant.ofEpochSecond dan foydalaning, so'ng vaqt mintaqasi orqali LocalDateTime yoki ZonedDateTime ga o'tkazing.
Foydalanuvchi ekranida to'g'ri sana va vaqt vaqt mintaqalarini to'g'ri qayta ishlashga bog'liq. Android uchun mobil ishlab chiqishda sana va vaqt qurilmaning vaqt mintaqasini hisobga olishni talab qiladi. Oltin qoida: vaqtni UTC da saqlang, faqat ko'rsatish uchun mahalliy vaqt mintaqasiga o'tkazing. iOS Foundation dan TimeZone ni, Android java.time dan ZoneId ni taqdim etadi. Mobil platformalar uchun ikkala API ham qurilmaning joriy vaqt mintaqasini avtomatik aniqlashni qo'llab-quvvatlaydi. Mobil ilovada sana ZoneId va TimeZone ga bog'liq.
Yozgi vaqt noaniqlik yaratadi: vaqtdagi bir lahza ikki xil mahalliy soat bilan ifodalanishi mumkin. java.time va Foundation DST ni avtomatik boshqaradi. IANA identifikatorlaridan (Europe/Moscow, America/New_York) foydalaning, qisqartmalardan (MSK, EST) emas — qisqartmalar noaniq va yozgi vaqtga o'tishni e'tiborsiz qoldiradi.
import Foundation
// UTC ni iOS da mahalliy vaqtga aylantirish
func formatToLocalTime(utcDate: Date, timeZoneId: String) -> String {
let formatter = DateFormatter()
formatter.dateFormat = "dd.MM.yyyy HH:mm"
formatter.timeZone = TimeZone(identifier: timeZoneId)
return formatter.string(from: utcDate)
}
// Qurilma vaqt mintaqasini aniqlash
let localTimeZone = TimeZone.current
let isDST = localTimeZone.isDaylightSavingTime()
let secondsFromGMT = localTimeZone.secondsFromGMT()
Android da qurilmaning vaqt mintaqasini olish uchun ZoneId.systemDefault() dan foydalaning. UTC ni mahalliy vaqtga aylantirishda ZoneOffset.UTC bilan ZonedDateTime yarating va withZoneSameInstant qo'llang. java.time bo'lmagan eski API lar uchun TimeZone.getDefault() va Calendar dan foydalaning — lekin to'g'ridan-to'g'ri ThreeTenABP qo'shish yaxshiroq.
import java.time.Instant
import java.time.ZonedDateTime
import java.time.ZoneId
// Unix Timestamp ni mahalliy vaqtga aylantirish
fun toLocalDisplay(unixSeconds: Long): String {
val instant = Instant.ofEpochSecond(unixSeconds)
val local = instant.atZone(ZoneId.systemDefault())
return local.format(DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm"))
}
ThreeTenABP — java.time ni Android API 26 dan pastga ko'chiruvchi adapter kutubxonasi. U bir xil sinflarni taqdim etadi: LocalDate, LocalTime, ZonedDateTime, DateTimeFormatter, Instant. Agar ilova Android 5 yoki 6 (API 21-25) ni qo'llab-quvvatlasa, ThreeTenABP eskirgan Calendar ga o'tmasdan zamonaviy mobil API dan foydalanishning yagona usuli. Eski qurilmalar uchun mobil ishlab chiqishda sana va vaqt ushbu kutubxona orqali amalga oshiriladi. Eski qurilmalar uchun sana va vaqt ThreeTenABP orqali amalga oshiriladi.
Kutubxona Application.onCreate() metodida AndroidThreeTen.init() chaqirish orqali ishga tushirishni talab qiladi. Bu aktivlardan vaqt mintaqasi ma'lumotlarini yuklaydi. Ishga tushirilgandan so'ng API butunlay java.time bilan bir xil — API 26+ va API 21+ uchun kod bir xil bo'ladi. Kutubxona hajmi taxminan 400 KB, bu ko'pchilik mobil ilovalar uchun maqbuldir.
import org.threeten.bp.LocalDate
import org.threeten.bp.format.DateTimeFormatter
// Application da ishga tushirish
class App : Application() {
override fun onCreate() {
super.onCreate()
AndroidThreeTen.init(this)
}
}
// API java.time bilan bir xil
val today = LocalDate.now()
val formatted = today.format(DateTimeFormatter.ISO_LOCAL_DATE)
ThreeTenABP ning ishlashi zamonaviy qurilmalarda original java.time bilan solishtirish mumkin. Eski qurilmalarda vaqt mintaqasi ma'lumotlarini yuklash tufayli birinchi chaqiruvda kechikish bo'lishi mumkin. Mavjud kodni Calendar dan ThreeTenABP ga bosqichma-bosqich ko'chiring: yangi modullarda Date va Calendar ni Instant va LocalDate bilan almashtiring, eski kodni o'zgarishsiz qoldiring.
Unix Timestamp — 1970 yil 1 yanvar 00:00 UTC dan boshlab o'tgan soniyalar soni. Bu server va mijoz o'rtasida vaqtni saqlash va almashish uchun universal formatdir. Biroq, foydalanuvchi sozlamalari tufayli qurilmadagi vaqt haqiqiy vaqtdan farq qilishi mumkin. Sinxronizatsiya uchun NTP ishlatiladi — UDP orqali aniq vaqt protokoli. Unix Timestamp serverda sana va vaqt saqlanadigan formatdir.
iOS da Date().timeIntervalSince1970 1970 yildan boshlab soniyalarni qaytaradi. Android da System.currentTimeMillis() millisekundlarni qaytaradi. Aniqlik uchun NTP dan foydalaning: iOS uchun TrueTime kutubxonasi va Android uchun AndroidNtp NTP serveriga so'rov yuboradi va vaqt ofsetini hisoblaydi. NTP aniqligi mahalliy tarmoqda 1-10 ms va internet orqali 10-100 ms.
import Foundation
// iOS da Unix Timestamp olish
let seconds = Date().timeIntervalSince1970
let milliseconds = Int64(seconds * 1000)
// TrueTime bilan NTP sinxronizatsiyasi
TrueTime.shared.start { result in
switch result {
case .success:
let ntpTime = TrueTime.shared.now()
print("Aniq vaqt: \(ntpTime)")
case .failure(let error):
print("NTP xatosi: \(error)")
}
}
Mobil ilovada sinxronizatsiyasiz xatolar mumkin: noto'g'ri hodisa vaqt belgilari, server bilan desinxronizatsiya. Mobil ishlab chiqishda vaqt ilova ishga tushganda bir marta NTP orqali sinxronlashtiriladi, shundan so'ng hisoblangan ofset ishlatiladi. Aniqlik uchun muhim mobil ilovalar (moliya, logistika) uchun serverga ma'lumot yuborishdan oldin NTP protokoli majburiydir.
Tez-tez so'raladigan savollar
DateFormatter har safar nusxa yaratilganda formatlash naqshini tahlil qiladi, mahalliy sozlamalarni yuklaydi va vaqt mintaqasini aniqlaydi. Formatlovchini statik konstanta sifatida keshlang yoki ISO 8601 uchun ISO8601DateFormatter dan foydalaning — u engilroq va tezroq.
java.time paketidan DateTimeFormatter — ip xavfsiz va samarali. API 26 dan boshlab mavjud. Eski versiyalar uchun bir xil API ni taqdim etuvchi ThreeTenABP dan foydalaning.
ThreeTenABP qo'shing — Android API 21+ uchun java.time backport. Application.onCreate() da AndroidThreeTen.init() orqali ishga tushiring. API asl java.time bilan butunlay bir xil.
Ha, serverda va mahalliy ma'lumotlar bazasida vaqtni UTC da saqlang. Faqat ko'rsatish bosqichida foydalanuvchining mahalliy vaqt mintaqasiga o'tkazing. Bu vaqt mintaqasini o'zgartirish yoki sayohat qilishda xatolarni yo'q qiladi.
Date().timeIntervalSince1970 1970 yil 1 yanvardan boshlab soniyalar sonini qaytaradi. Millisekundlar uchun 1000 ga ko'paytiring va Int64 ga o'tkazing. Aniq sinxronizatsiya uchun NTP server bilan TrueTime kutubxonasidan foydalaning.
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.