Fungsi tarikh dan masa SQLite telah menjadi punca kekecewaan bagi pembangun yang bekerja dengan aplikasi JavaScript . Isu utama berpunca daripada pendekatan SQLite dalam memformat cap masa UTC , yang berbeza daripada amalan standard dan mewujudkan masalah keserasian dengan pembangunan web moden.
Penunjuk UTC yang Hilang Mewujudkan Masalah Penghuraian JavaScript
Masalah teras terletak pada tingkah laku pemformatan tarikh SQLite . Apabila SQLite menjana cap masa UTC , ia tidak menyertakan aksara 'Z' di hujung yang menunjukkan masa UTC mengikut piawaian ISO . Peninggalan yang kelihatan kecil ini mempunyai akibat yang ketara bagi pembangun JavaScript . Apabila penghuraian tarikh JavaScript menemui cap masa tanpa akhiran 'Z', ia menganggap tarikh tersebut berada dalam zon masa tempatan klien dan bukannya UTC . Tingkah laku ini telah menyebabkan sesi penyahpepijatan berlangsung selama beberapa jam bagi pembangun yang tidak menyedari keanehan ini.
Isu ini menjadi sangat bermasalah dengan corak pangkalan data biasa seperti lajur createdAt yang menggunakan fungsi NOW() SQLite . Setiap kejadian di mana cap masa ini perlu diproses memerlukan pengendalian tambahan untuk menambah aksara 'Z' yang hilang. Pembangun terpaksa melaksanakan penyelesaian sementara untuk memeriksa sama ada tarikh UTC menyertakan penunjuk di hujung dan menambahkannya secara manual apabila hilang.
Format Fungsi Tarikh SQLite
| Fungsi | Format Output | Contoh |
|---|---|---|
date() |
YYYY-MM-DD | 2025-06-16 |
time() |
HH:MM:SS | 13:22:19 |
datetime() |
YYYY-MM-DD HH:MM:SS | 2025-06-16 13:22:19 |
current_timestamp |
YYYY-MM-DD HH:MM:SS | 2025-06-15 19:50:50 |
Nota: Tiada satu pun daripada format ini termasuk penunjuk UTC 'Z' secara lalai.
Kekeliruan Pematuhan ISO 8601
Satu lagi perkara yang mengelirukan melibatkan dakwaan SQLite mengenai pematuhan ISO 8601 . Fungsi current_timestamp mengembalikan tarikh dalam format seperti 2025-06-15 19:50:50, menggunakan pemisah ruang dan bukannya aksara 'T' yang biasanya dijangkakan dalam format ISO 8601 . Ini mewujudkan ketidakkonsistenan apabila bekerja dengan kaedah .toISOString() JavaScript , yang menghasilkan rentetan ISO yang diformat dengan betul.
Walaupun ada yang berpendapat bahawa menggunakan ruang dan bukannya 'T' dibenarkan di bawah tafsiran tertentu piawaian ISO 8601 , dokumentasi tidak menjelaskan dengan jelas variasi ini. Piawaian secara teknikal membenarkan peninggalan pemisah 'T' melalui persetujuan bersama dalam aplikasi tertentu, tetapi menggantikannya dengan ruang tidak dibenarkan secara eksplisit dalam spesifikasi teras.
Penyelesaian Alternatif
Penambahan Penunjuk UTC Secara Manual:
strftime('%Y-%m-%dT%H:%M:%SZ')- Format UTC asas dengan Zstrftime('%Y-%m-%dT%H:%M:%fZ')- Format UTC dengan saat pecahan
Kaedah Penyimpanan Alternatif:
- Simpan sebagai INTEGER (milisaat/nanosaat epoch Unix)
- Gunakan nombor hari Julian untuk tarikh bersejarah
- Laksanakan serialisasi JSON tersuai untuk zon masa yang kompleks
Pendekatan Penyimpanan Alternatif
Ramai pembangun telah beralih daripada fungsi datetime berasaskan rentetan SQLite sepenuhnya. Menyimpan cap masa sebagai integer yang mewakili milisaat atau nanosaat sejak epoch Unix telah menjadi alternatif yang popular. Pendekatan ini menawarkan beberapa kelebihan: ia lebih pantas untuk diproses, mengambil ruang penyimpanan yang lebih sedikit, dan mengelakkan ketidakkonsistenan pemformatan sama sekali.
Walau bagaimanapun, pendekatan berasaskan integer ini datang dengan pertukaran tersendiri. Tarikh berasaskan rentetan boleh dibaca dengan serta-merta apabila memeriksa kandungan pangkalan data secara langsung, manakala cap masa integer memerlukan penukaran untuk difahami oleh manusia. Sesetengah pembangun menyelesaikan ini dengan mencipta paparan pangkalan data yang memaparkan tarikh yang boleh dibaca manusia apabila diperlukan untuk pemeriksaan.
Pertimbangan Migrasi Pangkalan Data
Isu pemformatan datetime telah mempengaruhi pilihan sesetengah pembangun terhadap sistem pangkalan data. Fungsi tarikh PostgreSQL secara automatik menyertakan akhiran 'Z' untuk cap masa UTC , menjadikannya lebih serasi dengan aplikasi JavaScript secara langsung. Kelebihan keserasian ini telah menjadi faktor dalam keputusan pemilihan pangkalan data, terutamanya untuk aplikasi web yang sangat bergantung pada pemprosesan tarikh sebelah klien.
Bagi pembangun yang perlu bekerja dengan kedua-dua SQLite dan pangkalan data lain, ketidakkonsistenan pemformatan ini mewujudkan kerumitan tambahan dalam mengekalkan tingkah laku yang konsisten merentas sistem pangkalan data yang berbeza.
Komuniti pembangunan SQLite terus membincangkan isu-isu ini, dengan sesetengah pengguna mencadangkan sambungan dan pengubahsuaian untuk menambah baik pengendalian datetime. Walau bagaimanapun, tingkah laku pemformatan teras kekal tidak berubah, memerlukan pembangun melaksanakan penyelesaian mereka sendiri untuk integrasi JavaScript yang lancar.
Rujukan: sqlite - Date And Time Functions
