Instant: bu nima, vaqt belgisi va dasturlashda qo'llanilishi

Muallif: IT Sectr Nashr etilgan: 2026-07-13 O'qish vaqti: 9 daq

Instant — java.time paketidagi o'zgarmas sinf bo'lib, UTC vaqt shkalasida nuqtani nanosekund aniqlik bilan ifodalaydi. LocalDateTime dan farqli o'laroq, Instant inson o'qiy oladigan formatda sana va vaqtni o'z ichiga olmaydi — bu momentning mashina ko'rinishidir. Oracle Java 17 (2024) spetsifikatsiyasiga ko'ra, Instant mashina vaqt belgilarini almashish uchun mo'ljallangan va System.currentTimeMillis() analogidir, ammo nanosekund aniqlik bilan.

Asosiy

  • Instant — UTC da nanosekund aniqlik bilan vaqt momenti, o'zgarmas va thread-safe.
  • Vaqtni epoxadan (1970-01-01T00:00:00Z) soniyalar soni plyus nanosekundlar sifatida saqlaydi.
  • Instant.now() qurilmaning vaqt mintaqasidan qat'iy nazar joriy momentni UTC da qaytaradi.
  • Inson o'qiy oladigan formatga o'tkazish uchun atZone(ZoneId) ishlatiladi, u ZonedDateTime qaytaradi.
  • Instant — API va taqsimlangan tizimlarda vaqt belgilarini uzatish uchun afzal qilingan tur.

Instant nima?

Instant — vaqt shkalasida bitta nuqtani modellashtiruvchi sinf. Uning ichki ko'rinishi ikkita maydondan iborat: long seconds (1970-01-01T00:00:00Z dan soniyalar soni) va int nanos (joriy soniya ichidagi nanosekundlar, 0 dan 999999999 gacha).

Instant qiymatlari diapazoni — epoxadan -31557014167219200 dan 31556889864403199 soniyagacha, bu har ikki yo'nalishda taxminan 292 million yilni qamrab oladi. Bu astronomik hisoblar hamda barcha amaliy vazifalar uchun yetarli.

Baeldung (2024) ga ko'ra, Instant inson o'qiy oladigan turlar (LocalDateTime, ZonedDateTime) va mashina formatlari (millisekundlardagi timestamp) o'rtasidagi ko'prikdir. Instant loglash, keshlash, sinxronizatsiya va vaqtning mutlaq momenti muhim bo'lgan barcha vazifalar uchun ishlatiladi.

Sinf Comparable (momentlarni solishtirish uchun) va Temporal (java.time umumiy API da foydalanish uchun) interfeyslarini amalga oshiradi. Instant o'zgarmas — barcha metodlar yangi obyekt qaytaradi.

Instant vs Date vs Long

Java 8 dan oldin vaqt momentlari bilan ishlash uchun java.util.Date va System.currentTimeMillis() ishlatilgan. Ikkala yondashuvning kamchiliklari bor. Date o'zgaruvchan, thread-safe emas, vaqtni epoxadan millisekundlarda saqlaydi, ammo metod nomlari eskirgan (getYear() 2016 uchun 116 qaytaradi).

Long (oddiy timestamp) tez va ixcham, ammo nanosekundlar uchun o'rnatilgan qo'llab-quvvatlashga ega emas, o'qish mumkin bo'lgan shaklda ko'rinmaydi va nosozliklarni tuzatishda qo'lda parslashni talab qiladi. Long yondashuvi ma'lumotlar turini farqlamaydi — dasturchi noto'g'ri qiymat uzatishi mumkin.

Instant barcha bu muammolarni hal qiladi. U o'zgarmas, aniqlik haqida aniq ma'lumotni o'z ichiga oladi (soniyalar + nanosekundlar), ISO-8601 "2026-07-21T15:00:00Z" formatiga seriyalanadi va konvertatsiyalar uchun boy API ga ega. SonarSource (2024) ga ko'ra, Instant barcha yangi loyihalarda Date uchun tavsiya etilgan almashtirishdir.

Instant yaratish va o'qish

Joriy moment Instant.now() orqali olinadi. LocalDateTime.now() dan farqli o'laroq, Instant.now() har doim vaqtni UTC da qaytaradi, qurilmaning vaqt mintaqasini e'tiborsiz qoldiradi. Bu uni server vaqt belgilari uchun ideal qiladi.

Mavjud qiymatlardan: Instant.ofEpochSecond(long epochSecond) — epoxadan soniyalardan, Instant.ofEpochMilli(long epochMilli) — millisekundlardan, Instant.parse(CharSequence) — ISO-8601 satridan ("2026-07-21T15:00:00Z").

O'qish uchun getEpochSecond() — epoxadan soniyalar soni, toEpochMilli() — millisekundlar soni, getNano() — nanosekundlar ishlatiladi. toString() metodi ISO-8601 formatida satr qaytaradi.

kotlin
val now = Instant.now()

val fromSeconds = Instant.ofEpochSecond(1784700000)
val fromMillis = Instant.ofEpochMilli(1784700000000)
val parsed = Instant.parse("2026-07-21T15:00:00Z")

val epochSecond = now.getEpochSecond()
val epochMilli = now.toEpochMilli()
val nanos = now.getNano()

Instant ni boshqa formatlarga o'tkazish

Instant ZonedDateTime ga atZone(ZoneId) orqali o'tkaziladi. Masalan, Instant.now().atZone(ZoneId.of("Europe/Moscow")) Moskva uchun ZonedDateTime qaytaradi. Mintaqasiz konvertatsiya mumkin emas — Instant kalendar ma'lumotini o'z ichiga olmaydi.

LocalDateTime ga Instant atZone(ZoneId).toLocalDateTime() orqali o'tkaziladi. Bu usul aniq va ma'lumotni yo'qotmaydi. Teskari konvertatsiya — LocalDateTime.atZone(ZoneId).toInstant().

java.util.Date bilan moslik uchun: Date.from(instant) va date.toInstant(). Bu millisekundgacha aniqlikni saqlaydigan ikki tomonlama konvertatsiya (Date nanosekundlarni qo'llab-quvvatlamaydi). java.sql.Timestamp bilan ishlash uchun nanosekundlarni qo'llab-quvvatlagan holda Timestamp.from(instant) ishlatiladi.

kotlin
val instant = Instant.now()

val zoned = instant.atZone(ZoneId.of("Europe/Moscow"))
val localDateTime = instant
    .atZone(ZoneId.systemDefault())
    .toLocalDateTime()

val oldDate = Date.from(instant)
val backToInstant = oldDate.toInstant()

Instant va vaqt mintaqalari

Instant ning asosiy xususiyati — u vaqt mintaqalaridan butunlay mustaqil. Instant.now() dunyoning istalgan nuqtasidagi istalgan qurilmada bir xil natijani qaytaradi. Bunga vaqtni UTC da belgilash orqali erishiladi.

Vaqt mintaqasi faqat Instant ni insonga ko'rsatish uchun kerak. Buning uchun atZone(ZoneId) ishlatiladi. ZoneId.systemDefault() operatsion tizimda o'rnatilgan qurilmaning vaqt mintaqasini qaytaradi. ZoneOffset.UTC — UTC uchun doimiy.

Taqsimlangan tizimlarda barcha vaqt belgilarini Instant (yoki ZoneOffset.UTC bilan OffsetDateTime) shaklida saqlash va uzatish tavsiya etiladi. Mahalliy vaqtga o'tkazish faqat mijoz tomonda foydalanuvchiga ko'rsatishdan oldin amalga oshiriladi. Bu vaqt mintaqalari bilan chalkashlikning oldini oladi.

Instant orqali vaqt sinxronizatsiyasi

Taqsimlangan Android ilovalarida vaqt sinxronizatsiyasi keshlash, bildirishnomalar va birgalikda tahrirlash uchun muhimdir. Instant — UTC ga bog'liqligi tufayli bu vazifa uchun tabiiy tanlov.

Turli qurilmalardan vaqt belgilarini solishtirganda, tizim soatlari farq qilishi mumkinligini hisobga olish kerak. Malumot sifatida server vaqtidan foydalanish tavsiya etiladi. Server Instant ni UTC da qaytaradi, mijoz faqat nisbiy hisoblar uchun mahalliy Instant bilan solishtiradi.

Ikki moment o'rtasidagi farqni hisoblash uchun Duration.between(Instant start, Instant end) ishlatiladi. Bu metod Duration ni qaytaradi — soatlarga, daqiqalarga, soniyalarga o'tkaziladigan muddat. isAfter() va isBefore() metodlari momentlarni solishtirishga imkon beradi.

kotlin
fun isCacheExpired(
    cachedAt: Instant,
    ttlMinutes: Long
): Boolean {
    val elapsed = Duration.between(cachedAt, Instant.now())
    return elapsed.toMinutes() >= ttlMinutes
}

Android da amaliy misollar

Birinchi misol — vaqt belgisi bilan hodisalarni qayd etish. Instant Room ma'lumotlar bazasida saqlanadi va serverga uzatiladi. Vaqt belgisi aniq talqin qilish uchun UTC da loglanadi.

kotlin
data class EventLog(
    val id: Long = 0,
    val eventName: String,
    val timestamp: Instant
)

class Converters {
    @TypeConverter
    fun fromInstant(value: Instant?): Long? {
        return value?.toEpochMilli()
    }

    @TypeConverter
    fun toInstant(value: Long?): Instant? {
        return value?.let { Instant.ofEpochMilli(it) }
    }
}

Ikkinchi misol — hodisadan keyin o'tgan vaqtni aniqlash. Duration.between yordamida "5 daqiqa oldin", "2 soat oldin" — messenjerlar va ijtimoiy tarmoqlarda keng tarqalgan formatni ko'rsatamiz.

kotlin
fun timeAgo(instant: Instant): String {
    val duration = Duration.between(instant, Instant.now())
    return when {
        duration.toMinutes() < 1 -> "just now"
        duration.toHours() < 1 -> "${duration.toMinutes()} min ago"
        duration.toDays() < 1 -> "${duration.toHours()} h ago"
        else -> "${duration.toDays()} d ago"
    }
}

Uchinchi misol — server va mijoz o'rtasida ma'lumotlarni sinxronlashtirish. Oxirgi yangilanish vaqtini kuzatish uchun Instant dan foydalanamiz.

kotlin
class SyncManager {
    private var lastSyncAt: Instant? = null

    fun sync() {
        val syncStart = Instant.now()
        // lastSyncAt bilan server so'rovi
        lastSyncAt = syncStart
    }

    fun shouldSync(intervalMinutes: Long): Boolean {
        val last = lastSyncAt ?: return true
        return Duration.between(last, Instant.now())
            .toMinutes() >= intervalMinutes
    }
}

Oddiy xatolar

Birinchi xato — foydalanuvchiga ko'rsatish uchun Instant.now().toString() dan foydalanish. Instant UTC formatida "2026-07-21T15:00:00Z" ko'rinishida chiqadi, bu inson uchun o'qib bo'lmaydi. Har doim Instant ni ko'rsatishdan oldin atZone() orqali mahalliy vaqt mintaqasiga o'tkazing.

Ikkinchi xato — java.util.Date ga o'tkazishda nanosekundlarni yo'qotish. Date faqat millisekundlarni qo'llab-quvvatlaydi. Agar Instant nanosekundlarga ega bo'lsa, ular Date.from(instant) da yo'qoladi. Aniqlikni aniq ko'rsatish uchun Instant.truncatedTo(ChronoUnit.MILLIS) dan foydalaning.

Uchinchi xato — toEpochMilli() va getEpochSecond() ni chalkashtirish. toEpochMilli() epoxadan millisekundlar sonini (long) qaytaradi, getEpochSecond() esa soniyalar sonini (long). Bu metodlarni chalkashtirish 1000 marta xatoga olib kelishi mumkin.

To'rtinchi xato — Instant.now() barcha qurilmalarda sinxronlangan deb taxmin qilish. Tizim soatlari daqiqalar va hatto soatlar bilan farq qilishi mumkin. Vaqtga sezgir operatsiyalar (autentifikatsiya, to'lovlar) uchun haqiqat manbai sifatida server Instant dan foydalaning.

Tez-tez so'raladigan savollar

Instant System.currentTimeMillis() dan qanday farq qiladi?

System.currentTimeMillis() long qaytaradi — vaqt mintaqasiga bog'lanmagan holda epoxadan millisekundlar soni. Instant bir xil funksionallikni taqdim etadi, ammo nanosekund aniqlik va konvertatsiyalar, solishtirishlar va java.time bilan moslik uchun boy API bilan.

Instant ni Room ma'lumotlar bazasida qanday saqlash mumkin?

Room Instant ni to'g'ridan-to'g'ri qo'llab-quvvatlamaydi. Instant ni Long ga (toEpochMilli) va orqaga (Instant.ofEpochMilli) o'tkazuvchi TypeConverter dan foydalaning. Nanosekund aniqlik uchun ikkita maydon saqlang: epoxa-soniyalar va nanosekundlar.

Instant ni HashMap da kalit sifatida ishlatish mumkinmi?

Ha, Instant o'zgarmas va equals() va hashCode() ni to'g'ri amalga oshiradi. Bir xil qiymatga ega ikkita Instant teng bo'ladi. Bu uni o'zgaruvchan java.util.Date dan farqli o'laroq HashMap va boshqa kolleksiyalar uchun ishonchli kalit qiladi.

Ikki Instant o'rtasidagi farqni qanday olish mumkin?

Duration.between(start, end) yordamida Duration oling yoki soniyalardagi farq uchun (long) ChronoUnit.SECONDS.between(start, end). Duration toMinutes(), toHours(), toDays() va toNanos() metodlarini taqdim etadi.

Nega Instant.parse() Z suffiksi yoki ofsetni talab qiladi?

Instant vaqt shkalasida mutlaq nuqta sifatida yaratilgan. Vaqt mintaqasi yoki UTC ko'rsatilmagan holda parslash mumkin emas, chunki Instant kalendar ma'lumotini o'z ichiga olmaydi. "Z" suffiksi nol ofsetni (UTC) bildiradi va ISO-8601 formati uchun majburiydir.

Xulosa

  • Instant — UTC da mutlaq vaqt momenti uchun nanosekund aniqlik bilan o'zgarmas sinf, taqsimlangan tizimlarda vaqt belgilari uchun afzal qilingan.
  • java.util.Date dan farqli o'laroq, Instant o'zgarmas, thread-safe va nanosekund aniqlikka ega. Long dan farqli o'laroq — aniq tiplashtirilgan va boshqa raqamli qiymatlar bilan chalkashmaydi.
  • Foydalanuvchiga ko'rsatish uchun Instant atZone(ZoneId) orqali ZonedDateTime ga o'tkaziladi, aks holda vaqt UTC da ko'rsatiladi.
  • API ga uzatish uchun Instant.toString() (ISO-8601) yoki eski formatlar bilan moslik uchun toEpochMilli() dan foydalaning.
  • Room bilan ishlaganda Instant ni TypeConverter orqali toEpochMilli() metodi bilan Long sifatida saqlang.
  • O'tgan vaqtni hisoblash uchun nanosekundlarni to'g'ri boshqaradigan Duration.between() dan foydalaning.
  • Qurilma soatlarining sinxronizatsiyasiga ishonmang — kritik operatsiyalar uchun haqiqat manbai sifatida server Instant dan foydalaning.

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

Shuningdek o'qing