Ada satu hal yang selalu bikin deg-degan saat ngoding backend atau mobile app: error aneh yang muncul tiba-tiba, terutama kalau yang error itu berkaitan dengan waktu. Karena waktu memang selalu sensitif, sama seperti perasaan programmer yang udah ngoding 8 jam tapi hasilnya masih "undefined".
Nah, hari itu saya lagi tenang ngoding aplikasi. Flow-nya sudah rapi, Firestore lancar, UI mulus, mood juga lagi bagus. Sampai akhirnya muncul satu error yang bikin saya berhenti sejenak, menatap layar, dan berpikir:
“Ini maksud Firestore apa, sih? Kok timestamp saja dipermasalahkan?”
Dan akhirnya saya masuk ke perjalanan yang penuh plot twist: Firestore Timestamp Error.
Di artikel ini saya cerita pengalaman pribadiku menghadapi error itu apa penyebabnya, bagaimana paniknya, bagaimana solusinya, dan bagaimana caranya supaya kamu nggak ikut-ikutan depresi gara-gara timestamp Firestore.
Awal Mula: Ketika Timestamp Menjadi Musuh
Waktu itu saya mau menyimpan data ke Firestore berupa:
-
nama user
-
email
-
role
-
dan tentu saja createdAt dengan timestamp Firestore.
Seharusnya simpel, kan?
Tapi waktu jalankan, Firestore ngasih pesan error seperti:
Invalid argument: Failed to convert value of type java.lang.String to Timestamp
Atau versi Flutter-nya:
type 'String' is not a subtype of type 'Timestamp'
Atau versi yang lebih dramatis:
Expected a Timestamp, but got a string.
Saat itu saya cuma bisa bilang:
“Lah timestamp aja kok Firestore galak banget.”
Ternyata masalah muncul karena saya nyampur-nyampur jenis data timestamp. Kadang saya simpan sebagai Timestamp.now(), kadang sebagai DateTime.now().toString(), kadang sebagai FieldValue.serverTimestamp(). Firestore langsung bingung dan berkata:
“Bro, kamu mau timestamp versi apa nih? Tentuin dong…”
Dan benar saja, dari situ perjalanan saya semakin panjang.
Penyebab Umum Firestore Timestamp Error (berdasarkan pengalaman pahit & manis)
Saya rangkum dari berbagai kasus yang saya jumpai:
1. Mengirim String padahal Firestore minta Timestamp
Contoh kasus klasik:
"createdAt": DateTime.now().toString()
Firestore langsung ngambek.
Karena Firestore hanya menerima:
-
Timestamp -
FieldValue.serverTimestamp()
Bukan string jam 03.23 begadang sambil ngopi.
2. Data lama disimpan sebagai String, data baru sebagai Timestamp
Ini bikin aplikasi kamu pusing sendiri karena waktu fetch, hasilnya:
-
kadang
Timestamp -
kadang
String
Akhirnya error:
type 'String' is not a subtype of type 'Timestamp'
3. Timezone nggak konsisten (UTC vs local)
Pernah juga saya dapat error karena saya konversi timestamp pakai:
DateTime.parse()
yang ternyata nggak selalu bisa membaca format Firestore.
4. Menyimpan DateTime langsung ke Firestore (tanpa konversi)
Kadang Firestore bisa otomatis konversi, tapi kadang tiba-tiba error—tergantung mood Firestore.
Kronologi Panik 10 Menit Pertama
Saat error itu muncul, saya langsung gas:
-
Restart aplikasi
-
Restart VS Code
-
Restart emulator
-
Restart laptop (ini kebiasaan buruk programmer Indonesia)
Dan seperti biasa…
Tidak ada yang berubah.
Akhirnya saya sadar:
“Ini error bukan di laptop, ini error di logika hidup saya.”
Lalu saya cek satu per satu struktur data Firestore. Saya buka Firestore Console, saya lihat field satu-satu. Dan benar:
-
Di satu dokumen,
createdAtberupa timestamp -
Di dokumen lain, berupa string
-
Di dokumen lainnya lagi… kosong (karena saya lupa isi)
Tidak heran Firestore pusing melihatnya.
Solusi Firestore Timestamp Error (yang akhirnya berhasil)
Berikut solusi yang saya lakukan sampai benar-benar fix.
1. Gunakan Format Timestamp yang Konsisten
Akhirnya saya putuskan:
Semua createdAt dan updatedAt akan memakai:
FieldValue.serverTimestamp()
Kenapa?
-
akurat (pakai jam server Google Cloud)
-
konsisten
-
tidak tergantung timezone device user
-
lebih SEO-friendly dan jodoh-friendly (bercanda)
Contoh penyimpanan:
await FirebaseFirestore.instance.collection("users").add({
"name": name,
"email": email,
"createdAt": FieldValue.serverTimestamp(),
});2. Ubah Semua Data Lama Jadi Timestamp
Nah ini yang penting.
Kalau datanya sudah terlanjur beda-beda format, solusinya:
Cara 1: Update manual lewat Firestore Console
Cocok kalau datanya masih 10–20.
Cara 2: Buat fungsi migrasi sekali jalan
Saya buat script kecil di Flutter:
void fixTimestamps() async {
final snapshot = await FirebaseFirestore.instance.collection('users').get();
for (var doc in snapshot.docs) {
final data = doc.data();
final createdAt = data['createdAt'];
if (createdAt is String) {
await doc.reference.update({
'createdAt': Timestamp.fromDate(DateTime.parse(createdAt)),
});
}
}
}
Lalu panggil sekali → selesai.
3. Saat fetch data, selalu convert ke DateTime
Jangan percaya begitu saja pada isi Firestore. Kadang formatnya tidak konsisten.
Saya buat helper:
DateTime toDate(dynamic value) {
if (value is Timestamp) {
return value.toDate();
}
if (value is String) {
return DateTime.parse(value);
}
throw Exception("Unknown date format");
}
Di model:
createdAt = toDate(json['createdAt']);
Akhirnya aplikasi stabil, tidak ada drama lagi.
4. Saat memakai DateTime, selalu gunakan UTC
Firestore suka UTC.
Saya simpan seperti ini:
DateTime.now().toUtc()
Kalau user butuh waktu lokal, tinggal:
createdAt.toLocal()
Selesai.
5. Jangan simpan string tanggal kecuali betul-betul butuh
Misalnya untuk tampilan UI:
DateFormat('dd MMM yyyy').format(timestamp)
Jangan disimpan di Firestore.
Setelah Fix: Hidup Lebih Tenang
Setelah semua data saya betulkan, aplikasi berjalan mulus. Tidak ada lagi error “Expected Timestamp but got String”. Tidak ada lagi log merah panjang yang menghina kemampuan saya sebagai developer.
Saya bahkan merasa ada kedamaian batin setelah memperbaiki timestamp.
Dan lucunya, setelah saya selesaikan masalah itu, saya sadar:
Firestore sebenarnya tidak jahat.
Dia hanya meminta kita tegas dan konsisten sesuatu yang juga dibutuhkan dalam hubungan percintaan.
Tips Supaya Tidak Kena Timestamp Error Lagi
Berikut versi singkat yang bisa kamu bookmark:
-
Gunakan FieldValue.serverTimestamp() untuk keseluruhan sistem.
-
Jangan pernah simpan tanggal dalam format string di Firestore.
-
Kalau fetch data, always sanitize.
-
Pastikan semua data lama sudah seragam.
-
Gunakan UTC kalau kamu convert manual.
-
Jangan campurkan DateTime, Timestamp, dan String secara random kayak lotre.
Kalau kamu disiplin, Firestore akan sayang sama kamu.
Jangan Takut Timestamp
Kalau kamu baru kena Firestore Timestamp Error, percayalah:
-
kamu bukan satu-satunya,
-
solusinya selalu ada,
-
dan error ini bukan pertanda kamu harus pindah profesi.
Ini cuma masalah kecil yang akan kamu temukan lagi nanti… di project lain… pakai error yang beda. Tapi itu bagian dari hidup kita sebagai developer.
Yang penting:
Nikmati prosesnya. Nikmati ngopinya. Dan nikmati setiap error-nya.

No comments:
Post a Comment