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 — 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.
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.
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.
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 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.
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 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.
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.
fun isCacheExpired(
cachedAt: Instant,
ttlMinutes: Long
): Boolean {
val elapsed = Duration.between(cachedAt, Instant.now())
return elapsed.toMinutes() >= ttlMinutes
}
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.
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.
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.
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
}
}
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
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.
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.
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.
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.
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
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.