Kalau awak pernah mengintegrasikan dua sistem yang menyimpan tarikh dengan cara berbeza, awak pasti faham betapa menyeksanya. Satu API mengembalikan 1714521600, satu lagi mengembalikan 2024-05-01T00:00:00Z, dan tiba-tiba awak terpaksa menulis logik penukaran pada tengah malam. Memilih format yang betul antara format unix timestamp dan ISO 8601 dari awal boleh menjimatkan berjam-jam masa debugging dan mengelakkan bug halus dalam persekitaran produksi. Kedua-dua format ini digunakan secara meluas, kedua-duanya ada kelebihan tersendiri, dan tiada satu pun yang secara mutlak "lebih baik." Yang penting ialah memahami bila setiap satu sesuai digunakan dan mengapa pilihan yang salah boleh mendatangkan masalah nyata.
Jadual Kandungan
Perkara Utama:
- Unix timestamp ialah integer yang mengira saat (atau milisaat) sejak 1 Januari 1970 UTC — sesuai untuk pengiraan matematik, penyimpanan, dan API.
- ISO 8601 ialah format string bertaraf antarabangsa yang boleh dibaca manusia — sesuai untuk log, antara muka pengguna, dan komunikasi antara sistem.
- Kedua-dua format ini saling melengkapi, bukan bersaing. Banyak sistem produksi menyimpan masa dalam format Unix secara dalaman dan mendedahkan ISO 8601 secara luaran.
- Memilih format yang salah untuk konteks yang tidak sesuai boleh menyebabkan bug zon waktu, ralat parsing, dan kerumitan yang tidak perlu.
Apakah Format Unix Timestamp?
Unix timestamp (juga dikenali sebagai Unix time atau epoch time) ialah satu integer tunggal yang mewakili bilangan saat yang telah berlalu sejak Unix epoch: 1 Januari 1970, 00:00:00 UTC. Format unix time ini tidak bergantung pada zon waktu kerana ia sentiasa merujuk kepada UTC. Tiada kekaburan berkaitan waktu jimat siang atau offset serantau.
Sebagai contoh, Unix timestamp 1714521600 mewakili satu saat yang tepat, tidak kira di mana sahaja di dunia awak membacanya. Sistem moden sering memanjangkan ini kepada milisaat (1714521600000) atau mikrosaat untuk ketepatan yang lebih tinggi. Awak boleh ketahui lebih lanjut tentang variasi ini dalam panduan kami mengenai saat vs milisaat vs mikrosaat dalam Unix timestamp.
Dari segi teknikal, Unix timestamp hanyalah satu nombor. Kesederhanaan itulah yang menjadi kekuatan terbesarnya sekaligus punca masalah keterbacaannya.
Untuk latar belakang yang lebih mendalam tentang asal usul konsep ini, lihat artikel kami mengenai epoch time dan asasnya.
Apakah Format Tarikh ISO 8601?
ISO 8601 ialah standard antarabangsa yang diterbitkan oleh Pertubuhan Piawaian Antarabangsa yang mentakrifkan cara mewakili tarikh dan masa sebagai string. Datetime dalam ISO 8601 yang biasa kelihatan seperti ini: 2024-05-01T00:00:00Z.
Pecahan formatnya:
2024-05-01— tarikh dalam format YYYY-MM-DDT— pemisah antara tarikh dan masa00:00:00— masa dalam format HH:MM:SSZ— menunjukkan UTC (awak juga boleh guna offset seperti+05:30)
ISO 8601 merupakan tulang belakang kepada standard RFC 3339 yang digunakan secara meluas dalam protokol internet. Ia boleh dibaca manusia, boleh diisih sebagai string, dan tidak mengelirukan merentasi lokasi berbeza. Tidak seperti penulisan "05/01/2024" yang bermaksud 1 Mei di Amerika Syarikat tetapi 5 Januari di Eropah, ISO 8601 adalah konsisten di seluruh dunia.
Perbezaan Utama Secara Ringkas
| Sifat | Format Unix Timestamp | Format Tarikh ISO 8601 |
|---|---|---|
| Jenis data | Integer (atau float) | String |
| Boleh dibaca manusia | Tidak | Ya |
| Pengendalian zon waktu | Sentiasa UTC (tersirat) | Offset atau Z yang eksplisit |
| Mesra matematik | Ya (tolak, bandingkan) | Tidak (memerlukan parsing) |
| Saiz storan | Kecil (4-8 bait) | Lebih besar (20+ aksara) |
| Boleh diisih terus | Ya (isih berangka) | Ya (leksikografi) |
| Selamat merentasi lokasi | Ya | Ya |
Bila Guna Format Unix Timestamp
Format unix time cemerlang dalam situasi tertentu yang jelas. Gunakannya apabila:
1. Melakukan Pengiraan Tarikh
Mengira tempoh masa adalah mudah dengan Unix timestamp. Untuk mengetahui berapa saat yang telah berlalu, awak hanya perlu menolak satu integer daripada integer yang lain. Dengan string ISO 8601, awak perlu mem-parse kedua-duanya menjadi objek datetime terlebih dahulu, kemudian baru kira perbezaannya. Untuk operasi berfrekuensi tinggi seperti merekod jutaan peristiwa, overhead parsing itu akan terkumpul dan memberi kesan.
2. Menyimpan Tarikh dalam Pangkalan Data
Lajur integer lebih pantas untuk diindeks dan dibandingkan berbanding lajur string. Jika awak menjalankan pertanyaan seperti "beri saya semua peristiwa dalam 7 hari lepas," membandingkan dua integer adalah lebih cekap daripada mem-parse dan membandingkan string. Panduan terperinci kami mengenai Unix timestamp dalam pangkalan data merangkumi strategi pengindeksan dan corak pertanyaan secara mendalam.
3. Komunikasi Antara Perkhidmatan Dalaman
Apabila dua perkhidmatan backend yang awak kawal perlu menghantar timestamp antara satu sama lain, format Unix mengurangkan kerumitan parsing. Kedua-dua pihak bersetuju dengan kontrak integer, dan tiada risiko salah tafsir string zon waktu.
4. Logik Tamat Tempoh dan TTL
Token JWT, entri cache, dan tamat tempoh sesi hampir semuanya dinyatakan sebagai Unix timestamp. Tuntutan exp dalam JSON Web Token (JWT) adalah Unix timestamp kerana sebab yang tepat ini: membandingkan exp > Date.now() / 1000 hanyalah satu perbandingan integer yang pantas.
5. Mengelakkan Bug Zon Waktu
Kerana Unix timestamp sentiasa dalam UTC, ia menghapuskan seluruh kelas bug waktu jimat siang. Jika aplikasi awak melayani pengguna merentasi pelbagai zon waktu, menyimpan Unix timestamp dan menukarnya kepada waktu tempatan hanya pada waktu paparan adalah corak seni bina yang telah terbukti.
Awak perlu sedar tentang masalah Tahun 2038 jika awak menggunakan integer bertanda 32-bit untuk menyimpan Unix timestamp — sentiasa gunakan integer 64-bit dalam sistem moden.
Bila Guna Format Tarikh ISO 8601
Format tarikh ISO 8601 lebih unggul dalam konteks di mana manusia atau sistem luaran perlu membaca, menulis, atau mengesahkan tarikh tanpa menjalankan kod.
1. Respons API yang Digunakan oleh Pihak Ketiga
Jika awak membina API awam, mengembalikan "created_at": "2024-05-01T12:30:00Z" jauh lebih mesra pembangun berbanding "created_at": 1714562200. Pembangun luar boleh terus memahami nilai tersebut tanpa perlu menukarnya. Banyak panduan gaya API, termasuk dari Stripe dan GitHub, menggunakan ISO 8601 secara lalai atas sebab ini.
2. Fail Log dan Jejak Audit
Log dibaca oleh manusia semasa insiden berlaku. Baris log yang berbunyi [2024-05-01T14:22:05Z] ERROR: payment failed boleh terus diambil tindakan. Log dengan [1714569725] ERROR: payment failed memaksa pembaca menukar timestamp itu sebelum boleh mula membuat debugging.
3. Pengantarabangsaan dan Penyetempatan
ISO 8601 menyertakan maklumat offset zon waktu yang eksplisit. Apabila sistem awak perlu mengekalkan waktu tempatan asal pengguna — contohnya, acara kalendar yang dicipta pada pukul 9:00 pagi di Tokyo — ISO 8601 dengan offset yang betul (2024-05-01T09:00:00+09:00) merakam niat itu dengan tepat. Unix timestamp sahaja tidak dapat memberitahu awak zon waktu pengguna semasa mereka mencipta acara tersebut.
4. Fail Konfigurasi dan Format Pertukaran Data
Fail JSON, YAML, dan CSV yang diedit oleh manusia patut menggunakan ISO 8601. Jika seorang pembangun perlu menetapkan tarikh tamat tempoh secara manual dalam fail konfigurasi, menulis 2025-01-01T00:00:00Z jauh lebih kurang terdedah kepada ralat berbanding mengira dan menulis Unix timestamp secara manual.
Contoh Kod dalam JavaScript dan Python
JavaScript: Penukaran Antara Format
// Dapatkan Unix timestamp semasa (saat)
const unixNow = Math.floor(Date.now() / 1000);
console.log(unixNow); // contoh: 1714521600
// Tukar Unix timestamp kepada string ISO 8601
const isoString = new Date(unixNow * 1000).toISOString();
console.log(isoString); // "2024-05-01T00:00:00.000Z"
// Tukar string ISO 8601 kembali kepada Unix timestamp
const parsed = new Date("2024-05-01T00:00:00Z");
const backToUnix = Math.floor(parsed.getTime() / 1000);
console.log(backToUnix); // 1714521600
// Kira tempoh antara dua Unix timestamp (tiada parsing diperlukan)
const start = 1714521600;
const end = 1714608000;
const durationSeconds = end - start;
console.log(`Duration: ${durationSeconds / 3600} hours`); // 24 hours
Python: Bekerja dengan Kedua-dua Format
import time
from datetime import datetime, timezone
# Dapatkan Unix timestamp semasa
unix_now = int(time.time())
print(unix_now) # contoh: 1714521600
# Tukar Unix timestamp kepada string ISO 8601
dt = datetime.fromtimestamp(unix_now, tz=timezone.utc)
iso_string = dt.isoformat()
print(iso_string) # "2024-05-01T00:00:00+00:00"
# Tukar string ISO 8601 kembali kepada Unix timestamp
parsed_dt = datetime.fromisoformat("2024-05-01T00:00:00+00:00")
back_to_unix = int(parsed_dt.timestamp())
print(back_to_unix) # 1714521600
# Kira tempoh - mudah dengan Unix timestamp
start = 1714521600
end = 1714608000
duration_hours = (end - start) / 3600
print(f"Duration: {duration_hours} hours") # 24.0 hours
Penting: Dalam Python, sentiasa hantar tz=timezone.utc apabila memanggil datetime.fromtimestamp(). Tanpanya, Python akan menggunakan zon waktu sistem tempatan awak, yang boleh menghasilkan keputusan tidak tepat pada pelayan di rantau berbeza.
Contoh Konkrit: Sistem Tempahan
Bayangkan awak sedang membina API tempahan hotel. Seorang pengguna di New York membuat tempahan bilik untuk daftar masuk pada 15 Jun 2024 pukul 3:00 petang waktu tempatan. Begini cara kedua-dua format berkelakuan secara berbeza dalam amalan.
Simpan sebagai Unix timestamp: Awak menukar waktu tempatan pengguna kepada UTC dan menyimpan 1718470800. Ini padat dan pantas untuk ditanya. Tetapi apabila kakitangan hotel di New York melihat rekod pangkalan data mentah, mereka melihat satu nombor. Mereka memerlukan alat untuk menyahkodnya. Lebih teruk lagi, jika awak terlupa menukar dari waktu tempatan ke UTC sebelum menyimpan, awak telah memperkenalkan bug senyap 4 jam (New York adalah UTC-4 pada musim panas).
Simpan sebagai ISO 8601: Awak menyimpan 2024-06-15T15:00:00-04:00. Offset dikekalkan. Kakitangan boleh membaca rekod secara terus. Niat zon waktu asal tidak hilang. Namun, perbandingan string dalam SQL sedikit lebih perlahan, dan mengira "berapa jam lagi hingga daftar masuk" memerlukan parsing string terlebih dahulu.
Penyelesaian produksi yang digunakan kebanyakan pasukan: Simpan Unix timestamp dalam pangkalan data untuk prestasi dan ketepatan, dan kembalikan string ISO 8601 dalam respons API untuk kebolehgunaan. Inilah corak yang digunakan oleh platform-platform utama. Awak mendapat manfaat terbaik dari kedua-dua dunia.
Untuk panduan lengkap tentang corak penukaran, lihat panduan penukaran Unix timestamp kepada tarikh yang lengkap kami.
Cadangan Jelas Mengikut Kes Penggunaan
Berdasarkan kekangan sebenar, berikut adalah cadangan langsung untuk setiap senario:
- Storan pangkalan data: Guna Unix timestamp (integer). Pengindeksan lebih pantas, tiada parsing zon waktu, jejak memori lebih kecil.
- Komunikasi dalaman antara microservice: Guna Unix timestamp. Kedua-dua pihak mengawal kontrak dan tiada manusia yang membaca payload mentah.
- Respons REST API awam: Guna ISO 8601. Pembangun pihak ketiga memerlukan nilai yang boleh dibaca dan mendokumentasikan diri sendiri.
- Fail log dan jejak audit: Guna ISO 8601. Manusia membaca log di bawah tekanan semasa insiden.
- Tamat tempoh JWT dan sesi: Guna Unix timestamp. Spesifikasi memerlukannya dan perbandingan adalah satu operasi tunggal.
- Fail konfigurasi dan tugasan berjadual: Guna ISO 8601. Manusia menulis dan mengedit fail ini secara terus.
- Ciri kalendar dan penjadualan: Guna ISO 8601 dengan offset zon waktu yang eksplisit. Mengekalkan niat zon waktu asal pengguna.
- Pengiraan aritmetik tarikh dalam logik aplikasi: Tukar kepada Unix timestamp terlebih dahulu, kira, kemudian tukar semula jika perlu.
Untuk set amalan terbaik yang lebih luas berkaitan bekerja dengan timestamp dalam kod backend, tutorial Unix timestamp untuk pembangun kami merangkumi corak storan, pemformatan, dan pengendalian zon waktu secara terperinci.
Kesimpulan
Perdebatan antara format unix timestamp dan format tarikh ISO 8601 bukan tentang mana yang lebih unggul. Ia tentang memadankan alat yang betul dengan kerja yang betul. Unix timestamp sesuai untuk lajur pangkalan data awak, kontrak perkhidmatan dalaman awak, dan logik tamat tempoh awak. ISO 8601 sesuai untuk respons API awak, log awak, dan mana-mana fail yang mungkin dibuka oleh manusia. Kebanyakan sistem produksi yang kukuh menggunakan kedua-duanya: simpan sebagai Unix time, dedahkan sebagai ISO 8601. Jika awak menghayati corak tunggal itu, awak akan mengelakkan bug pengendalian tarikh yang paling biasa sebelum ia sampai ke persekitaran produksi.
Henti Meneka Format Tarikh yang Perlu Digunakan
Cuba alat penukar Unix Timestamp percuma kami di unixtimestamp.app dan tukar antara Unix time dan ISO 8601 dengan serta-merta — tanpa perlu menulis kod. Tampal timestamp, dapatkan tarikh yang boleh dibaca dalam sekelip mata.
Cuba Alat Percuma Kami →
Ya, dan banyak pangkalan data menyokong jenis datetime asli yang menyimpan ISO 8601 secara dalaman. Walau bagaimanapun, Unix timestamp integer umumnya lebih pantas untuk pertanyaan julat dan perbandingan indeks. Untuk jadual berjumlah tinggi dengan penapisan berasaskan tarikh yang kerap, timestamp integer memberikan kelebihan prestasi yang ketara berbanding lajur string atau datetime.
Unix timestamp sentiasa dalam UTC mengikut definisi. Ia tidak menyimpan maklumat zon waktu. Untuk memaparkan Unix timestamp dalam zon waktu tempatan pengguna, awak menukarnya pada lapisan persembahan. Ini sebenarnya satu kelebihan: tiada kekaburan langsung dalam nilai yang disimpan, dan penukaran zon waktu dikendalikan secara eksplisit di tempat yang sepatutnya.
Unix timestamp berasaskan saat (contoh: 1714521600) ialah format tradisional yang digunakan dalam kebanyakan sistem Unix dan standard seperti JWT. Milisaat (contoh: 1714521600000) adalah lazim dalam JavaScript dan persekitaran pelayar. Sentiasa sahkan ketepatan yang dijangka oleh sesebuah API — menghantar saat apabila milisaat dijangka akan menghasilkan tarikh 1000 kali ganda jauh ke masa lalu.
RFC 3339 ialah profil ISO 8601 yang direka khusus untuk kegunaan internet. Ia sedikit lebih ketat: ia memerlukan offset zon waktu (seperti Z atau +00:00) dan tidak membenarkan beberapa ciri pilihan ISO 8601. Dalam amalan, kebanyakan pembangun menganggap kedua-duanya boleh digunakan secara bergantian untuk string datetime standard seperti 2024-05-01T00:00:00Z.
GitHub menggunakan string ISO 8601 dalam respons REST API-nya. Stripe menggunakan Unix timestamp (integer) dalam API-nya. Kedua-dua pilihan adalah disengajakan dan konsisten dengan kes penggunaan masing-masing. Ini menggambarkan bahawa tiada satu peraturan industri yang universal — pilihan yang betul bergantung pada khalayak API awak dan operasi yang perlu dilakukan pengguna ke atas nilai-nilai tersebut.