Mobil ishlab chiqishda sana va vaqt: bu nima, qanday formatlar va qanday ishlash

Muallif: IT Sectr Nashr etilgan: 2026-07-22 O'qish vaqti: 11 daq

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

  • DateFormatter iOS da — kuchli, lekin tez-tez yaratilganda sekin. Nusxalarni keshlang yoki ISO 8601 formati uchun ISO8601DateFormatter dan foydalaning.
  • DateTimeFormatter Android da — java.time dan ip xavfsiz formatlovchi. API 26 dan boshlab eskirgan SimpleDateFormat o'rnini egalladi.
  • ThreeTenABP — Android API 26 dan past uchun java time backport. Eski qurilmalarga LocalDate, ZonedDateTime va DateTimeFormatter qo'shadi.
  • TimeZone — UTC ni mahalliy vaqtga aylantirish uchun juda muhim. Vaqtni UTC da saqlang, foydalanuvchining vaqt mintaqasida ko'rsating.
  • Unix Timestamp — vaqtni saqlashning standart formati. NTP orqali sinxronizatsiya millisekundgacha aniqlikni kafolatlaydi.

iOS da sana va vaqt: DateFormatter va ISO8601DateFormatter

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 va ishlash

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.

swift
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: java.time va DateTimeFormatter

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, ZonedDateTime va formatlash

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.

kotlin
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.

Vaqt mintaqalari: mobil ilovalarda sana va vaqt hamda TimeZone

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 va IANA identifikatorlari

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.

swift
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.

kotlin
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 — eski Android versiyalari uchun sana va vaqt

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.

ThreeTenABP ni qo'shish va sozlash

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.

kotlin
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 va NTP orqali vaqt sinxronizatsiyasi

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.

Unix Timestamp olish va NTP sinxronizatsiyasi

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.

swift
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

Nega DateFormatter iOS da sekin?

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.

Android da SimpleDateFormat o'rniga nima ishlatish kerak?

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.

Android da Java 8 dan oldingi sanalar bilan qanday ishlash kerak?

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.

Vaqtni UTC da saqlash kerakmi?

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.

iOS da Unix Timestamp qanday olish mumkin?

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

  • iOS da DateFormatter — sana va vaqtni formatlash uchun asosiy vosita, majburiy nusxa keshlashni talab qiladi. ISO8601DateFormatter ISO 8601 uchun engilroq alternativ.
  • Android da DateTimeFormatter — API 26+ uchun java.time dan ip xavfsiz formatlovchi. LocalDate va ZonedDateTime sanalar bilan ishlash uchun asosiy sinflar.
  • ThreeTenABP — barcha Android versiyalari uchun yagona API. API 21-25 bilan orqaga qarab muvofiqlik uchun qo'shing. Kod java.time dan farq qilmaydi.
  • TimeZone va UTC — vaqtni UTC da saqlang, faqat ko'rsatish uchun mahalliy vaqt mintaqasiga o'tkazing. IANA identifikatorlaridan foydalaning.
  • Unix Timestamp — server va mijoz o'rtasida vaqt almashish uchun universal format. iOS da Date().timeIntervalSince1970 orqali oling.
  • NTP sinxronizatsiyasi — millisekundgacha vaqt aniqligini ta'minlaydi. TrueTime (iOS) va AndroidNtp (Android) standart kutubxonalar.

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.

Loyihani muhokama qilish