Tanggal dan Waktu dalam Pengembangan Seluler: Apa Itu, Format Apa, dan Cara Bekerja

Penulis: IT Sectr Diterbitkan: 2026-07-22 Waktu membaca: 11 mnt

Tanggal dan waktu dalam pengembangan seluler — salah satu topik utama dalam rekayasa seluler. iOS menggunakan DateFormatter dan ISO8601DateFormatter, Android menggunakan DateTimeFormatter dan LocalDate dari java.time. Menurut Android Developer Docs, pemilihan API seluler yang tepat untuk memformat tanggal dan waktu secara langsung mempengaruhi kinerja dan keakuratan tampilan di zona waktu yang berbeda.

Poin Utama

  • DateFormatter di iOS — kuat, tetapi lambat saat sering dibuat. Cache instance atau gunakan ISO8601DateFormatter untuk format ISO 8601.
  • DateTimeFormatter di Android — pemformat thread-safe dari java.time. Menggantikan SimpleDateFormat yang sudah usang mulai API 26.
  • ThreeTenABP — backport java.time untuk Android API di bawah 26. Menambahkan LocalDate, ZonedDateTime, dan DateTimeFormatter di perangkat lama.
  • TimeZone — sangat penting untuk konversi UTC ke waktu lokal. Simpan waktu di UTC, tampilkan di zona waktu pengguna.
  • Unix Timestamp — format standar penyimpanan waktu. Sinkronisasi melalui NTP menjamin akurasi hingga milidetik.

Tanggal dan Waktu di iOS: DateFormatter dan ISO8601DateFormatter

Di iOS, tanggal dan waktu secara tradisional diformat melalui DateFormatter dari Foundation. Kelas ini mengonversi Date menjadi string dan kembali menggunakan pola, lokal, dan zona waktu yang ditentukan. Masalah utama DateFormatter — tidak thread-safe dan lambat dibuat, oleh karena itu dalam kode seluler, instance harus di-cache. Tanggal dalam pengembangan seluler di iOS memerlukan pemformat yang tepat.

DateFormatter dan Kinerja

Membuat DateFormatter membutuhkan waktu sekitar 1 milidetik karena parsing pola dateFormat, memuat lokal, dan menentukan zona waktu. Saat memformat daftar ratusan tanggal, pembuatan berulang menyebabkan kelambatan yang terlihat di UI. Solusinya — buat pemformat sekali untuk seluruh layar dan gunakan kembali. Untuk akses multi-thread, gunakan sinkronisasi melalui DispatchQueue.

swift
import Foundation

// DateFormatter di-cache — dibuat sekali
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 — alternatif ringan
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"

Untuk format ISO 8601, gunakan ISO8601DateFormatter — tidak perlu menentukan pola dan bekerja lebih cepat dari DateFormatter. Di iOS 10+, kelas ini lebih disukai untuk bekerja dengan tanggal server. Untuk format lama, pertahankan DateFormatter tetapi pastikan untuk cache instance sebagai properti statis atau singleton.

Tanggal dan Waktu di Android: java.time dan DateTimeFormatter

Di Android, tanggal dan waktu diproses melalui paket java.time, tersedia dari API 26. Kelas utama: LocalDate (hanya tanggal), LocalTime (hanya waktu), LocalDateTime (tanggal dan waktu tanpa zona waktu) dan ZonedDateTime (dengan zona waktu). DateTimeFormatter — pemformat thread-safe untuk platform seluler Android. Tanggal dalam aplikasi seluler diformat melalui DateTimeFormatter dan LocalDate tanpa kehilangan kinerja.

LocalDate, ZonedDateTime dan Pemformatan

LocalDate menyimpan tanggal tanpa waktu — ideal untuk ulang tahun. ZonedDateTime menyimpan informasi lengkap dengan zona waktu. DateTimeFormatter mendukung pola yang telah ditentukan (ISO_LOCAL_DATE, ISO_DATE_TIME) dan khusus melalui ofPattern. Semua kelas java.time tidak dapat diubah dan thread-safe, yang menghilangkan kondisi balapan saat bekerja di banyak thread.

kotlin
import java.time.LocalDate
import java.time.LocalDateTime
import java.time.ZonedDateTime
import java.time.format.DateTimeFormatter
import java.time.ZoneId

// Membuat dan memformat tanggal saat ini
val today = LocalDate.now()
val formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy")
val formatted = today.format(formatter)

// Bekerja dengan zona waktu
val utcTime = ZonedDateTime.now(ZoneId.of("UTC"))
val moscowTime = utcTime.withZoneSameInstant(ZoneId.of("Europe/Moscow"))

DateTimeFormatter secara signifikan lebih efisien daripada SimpleDateFormat karena tidak mengurai pola setiap kali dipanggil. Disarankan untuk membuat konstanta pemformat di tingkat kelas atau objek pendamping. Untuk mengonversi Unix Timestamp, gunakan Instant.ofEpochSecond, lalu konversikan ke LocalDateTime atau ZonedDateTime melalui zona waktu.

Zona Waktu: Tanggal dan Waktu dalam Aplikasi Seluler dan TimeZone

Tanggal dan waktu yang benar di layar pengguna tergantung pada pemrosesan zona waktu yang tepat. Tanggal dan waktu dalam pengembangan seluler untuk Android memerlukan pertimbangan zona waktu perangkat. Aturan emas: simpan waktu di UTC, konversikan ke zona waktu lokal hanya untuk ditampilkan. iOS menyediakan TimeZone dari Foundation, Android menyediakan ZoneId dari java.time. Kedua API untuk platform seluler mendukung deteksi otomatis zona waktu perangkat saat ini. Tanggal dalam aplikasi seluler tergantung pada ZoneId dan TimeZone.

Waktu Musim Panas dan Pengidentifikasi IANA

Waktu musim panas menciptakan ambiguitas: satu momen dalam waktu dapat diwakili oleh dua waktu lokal yang berbeda. java.time dan Foundation menangani DST secara otomatis. Gunakan pengidentifikasi IANA (Europe/Moscow, America/New_York), bukan singkatan (MSK, EST) — singkatan bersifat ambigu dan mengabaikan transisi waktu musim panas.

swift
import Foundation

// Mengonversi UTC ke waktu lokal di iOS
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)
}

// Menentukan zona waktu perangkat
let localTimeZone = TimeZone.current
let isDST = localTimeZone.isDaylightSavingTime()
let secondsFromGMT = localTimeZone.secondsFromGMT()

Di Android, gunakan ZoneId.systemDefault() untuk mendapatkan zona waktu perangkat. Saat mengonversi UTC ke waktu lokal, buat ZonedDateTime dengan ZoneOffset.UTC dan terapkan withZoneSameInstant. Untuk API lama tanpa java.time, gunakan TimeZone.getDefault() dan Calendar — tetapi lebih baik langsung menambahkan ThreeTenABP.

kotlin
import java.time.Instant
import java.time.ZonedDateTime
import java.time.ZoneId

// Konversi Unix Timestamp ke waktu lokal
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 — Tanggal dan Waktu untuk Versi Android Lama

ThreeTenABP — pustaka adaptor yang memporting java.time ke Android API di bawah 26. Ini menyediakan kelas yang sama: LocalDate, LocalTime, ZonedDateTime, DateTimeFormatter, Instant. Jika aplikasi mendukung Android 5 atau 6 (API 21-25), ThreeTenABP adalah satu-satunya cara untuk menggunakan API seluler modern tanpa beralih ke Calendar yang sudah usang. Tanggal dan waktu dalam pengembangan seluler untuk perangkat lama diimplementasikan melalui pustaka ini. Untuk perangkat lama, tanggal dan waktu diimplementasikan melalui ThreeTenABP.

Menambahkan dan Mengonfigurasi ThreeTenABP

Pustaka memerlukan inisialisasi dalam metode Application.onCreate() dengan memanggil AndroidThreeTen.init(). Ini memuat data zona waktu dari assets. Setelah inisialisasi, API sepenuhnya identik dengan java.time — kode untuk API 26+ dan API 21+ akan sama. Ukuran pustaka sekitar 400 KB, yang dapat diterima untuk sebagian besar aplikasi seluler.

kotlin
import org.threeten.bp.LocalDate
import org.threeten.bp.format.DateTimeFormatter

// Inisialisasi di Application
class App : Application() {
    override fun onCreate() {
        super.onCreate()
        AndroidThreeTen.init(this)
    }
}

// API identik dengan java.time
val today = LocalDate.now()
val formatted = today.format(DateTimeFormatter.ISO_LOCAL_DATE)

Kinerja ThreeTenABP sebanding dengan java.time asli di perangkat modern. Di perangkat lama, mungkin ada penundaan pada panggilan pertama karena memuat data zona waktu. Migrasikan kode yang ada dari Calendar ke ThreeTenABP secara bertahap: ganti Date dan Calendar dengan Instant dan LocalDate di modul baru, biarkan kode lama tidak berubah.

Unix Timestamp dan Sinkronisasi Waktu melalui NTP

Unix Timestamp — jumlah detik yang telah berlalu sejak 1 Januari 1970 00:00 UTC. Ini adalah format universal untuk menyimpan dan bertukar waktu antara server dan klien. Namun, waktu di perangkat mungkin berbeda dari waktu sebenarnya karena pengaturan pengguna. Untuk sinkronisasi, NTP digunakan — protokol waktu yang tepat melalui UDP. Unix Timestamp adalah format di mana tanggal dan waktu disimpan di server.

Mendapatkan Unix Timestamp dan Sinkronisasi NTP

Date().timeIntervalSince1970 di iOS mengembalikan detik sejak 1970. Di Android, System.currentTimeMillis() mengembalikan milidetik. Untuk akurasi, gunakan NTP: pustaka TrueTime untuk iOS dan AndroidNtp untuk Android mengirim permintaan ke server NTP dan menghitung offset waktu. Akurasi NTP adalah 1-10 ms di jaringan lokal dan 10-100 ms melalui internet.

swift
import Foundation

// Mendapatkan Unix Timestamp di iOS
let seconds = Date().timeIntervalSince1970
let milliseconds = Int64(seconds * 1000)

// Sinkronisasi NTP dengan TrueTime
TrueTime.shared.start { result in
    switch result {
    case .success:
        let ntpTime = TrueTime.shared.now()
        print("Waktu yang tepat: \(ntpTime)")
    case .failure(let error):
        print("Kesalahan NTP: \(error)")
    }
}

Tanpa sinkronisasi dalam aplikasi seluler, kesalahan mungkin terjadi: stempel waktu peristiwa yang salah, desinkronisasi dengan server. Waktu dalam pengembangan seluler disinkronkan melalui NTP sekali saat startup aplikasi, setelah itu offset yang dihitung digunakan. Untuk aplikasi seluler yang kritis terhadap akurasi (keuangan, logistik), protokol NTP wajib sebelum mengirim data ke server.

Pertanyaan yang Sering Diajukan

Mengapa DateFormatter lambat di iOS?

DateFormatter mengurai pola pemformatan, memuat lokal, dan menentukan zona waktu setiap kali instance dibuat. Cache pemformat sebagai konstanta statis atau gunakan ISO8601DateFormatter untuk ISO 8601 — lebih ringan dan lebih cepat.

Apa yang digunakan sebagai pengganti SimpleDateFormat di Android?

DateTimeFormatter dari paket java.time — thread-safe dan efisien. Tersedia dari API 26. Untuk versi lama, gunakan ThreeTenABP yang menyediakan API identik.

Bagaimana cara bekerja dengan tanggal sebelum Java 8 di Android?

Tambahkan ThreeTenABP — backport java.time untuk Android API 21+. Inisialisasi melalui AndroidThreeTen.init() di Application.onCreate(). API sepenuhnya identik dengan java.time asli.

Apakah perlu menyimpan waktu di UTC?

Ya, simpan waktu di UTC di server dan di basis data lokal. Konversikan ke zona waktu lokal pengguna hanya pada tahap tampilan. Ini menghilangkan kesalahan saat mengubah zona waktu atau bepergian.

Bagaimana cara mendapatkan Unix Timestamp di iOS?

Date().timeIntervalSince1970 mengembalikan jumlah detik sejak 1 Januari 1970. Untuk milidetik, kalikan dengan 1000 dan konversikan ke Int64. Untuk sinkronisasi yang akurat, gunakan pustaka TrueTime dengan server NTP.

Ringkasan

  • DateFormatter di iOS — alat utama untuk memformat tanggal dan waktu, memerlukan caching instance wajib. ISO8601DateFormatter adalah alternatif yang lebih ringan untuk ISO 8601.
  • DateTimeFormatter di Android — pemformat thread-safe dari java.time untuk API 26+. LocalDate dan ZonedDateTime adalah kelas utama untuk bekerja dengan tanggal.
  • ThreeTenABP — API terpadu untuk semua versi Android. Tambahkan untuk kompatibilitas mundur dengan API 21-25. Kode tidak berbeda dari java.time.
  • TimeZone dan UTC — simpan waktu di UTC, konversikan ke zona waktu lokal hanya untuk ditampilkan. Gunakan pengidentifikasi IANA.
  • Unix Timestamp — format universal untuk bertukar waktu antara server dan klien. Dapatkan melalui Date().timeIntervalSince1970 di iOS.
  • Sinkronisasi NTP — menjamin akurasi waktu hingga milidetik. TrueTime (iOS) dan AndroidNtp (Android) adalah pustaka standar.

Kami akan mengembangkan aplikasi seluler turnkey

IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.

Diskusikan proyek