Apakah ada alasan teknis mengapa seperti itu? Saya bertanya-tanya dalam kasus RDBMS bahwa itu ada hubungannya dengan kinerja, karena "TAHUN" lebih spesifik daripada "BULAN", misalnya: Anda hanya memiliki satu tahun 2000, tetapi setiap tahun memiliki "Januari", yang akan membuatnya lebih mudah / lebih cepat untuk memfilter / menyortir sesuatu berdasarkan tahun pertama, dan itulah sebabnya tahun itu datang lebih dulu.
Tetapi saya tidak tahu apakah itu benar-benar masuk akal ... Apakah ada alasan?
sql
engineering
rdbms
date-format
lucaswxp
sumber
sumber
asctime
, masih banyak digunakan di banyak tempat. Sangat menyenangkan bahwa RFC 3339 dan ISO 8601 secara bertahap mengganti format yang lebih lama, dan mereka pasti apa yang harus digunakan di masa depan. Secara umum, saya akan mengatakan bentuk dasar ISO 8601 (YYYYMMDD polos tanpa karakter pemisah) sebenarnya kurang umum daripada beberapa bentuk lain, seperti YYYY-MM-DD.Jawaban:
Dengan cara ini, tanggal dapat dengan mudah diurutkan sebagai string menggunakan aturan penyortiran default (yaitu penyortiran lexicographical ).
Ini juga mengapa bulan dan hari ditentukan menggunakan dua digit (menambahkan nol di depan jika diperlukan).
Bahkan itu adalah salah satu format tanggal yang ditentukan oleh ISO 8601 . Standar itu juga mendefinisikan format tanggal dan waktu
2015-03-27T15:26:40Z
, yang juga dapat disortir sebagai string.Namun, YYYYMMDD memiliki manfaat tambahan untuk memungkinkannya dengan mudah (tanpa penggantian substring atau karakter), parsing string sebagai integer, dan masih menggunakan pemesanan default pada integer.
sumber
Belum disebutkan, tetapi Anda dengan cepat mengabaikan pesanan di dalam YYYY. Itu sudah ribuan tahun, berabad-abad, puluhan tahun, bertahun-tahun. Artinya, YYYY sudah dipesan dari periode terpanjang ke periode terpendek. Hal yang sama berlaku untuk MM dan DD, begitulah sistem bilangan bekerja.
Jadi untuk menjaga urutan antar bidang konsisten dengan urutan dalam bidang, satu-satunya pilihan adalah YYYYMMDD.
Seperti dicatat zahbaz dan Arseni Mourzenko, format YYYYMMDD mudah disortir. Itu bukan kebetulan yang beruntung, itu konsekuensi langsung dari menempatkan bidang untuk durasi terlama pertama (dan menjaga panjang tetap; kami memperkenalkan masalah Y10K di sini.)
sumber
Iya. Perangkat lunak tersebut akan menggunakan ISO 8601 .
ISO 8601 memiliki sejumlah keunggulan dibandingkan format tanggal lainnya:
1_file, 10_file, 2_file
).Adapun mengapa ISO 8601 ada di tempat pertama, itu karena orang-orang menemukan format tanggal ambigu dan membingungkan ketika bertukar data antar negara / sistem, dan mereka membutuhkan sesuatu yang tidak ambigu.
Untuk alasannya lihat pengantar spesifikasi .
Standar mendefinisikan variasi "dasar" sebagai meminimalkan penggunaan pembatas. Jadi,
YYYYMMDD
adalah alternatif dasar untuk format yang diperluasYYYY-MM-DD
.sumber
Itu karena semua cara lain untuk melakukannya adalah ambigu.
01/02/2003 apa artinya itu? Januari kedua 2003? Atau di Eropa: 1 Februari 2003? Semakin buruk jika Anda menggunakan dua digit untuk tahun ini, seperti 01/02/03.
Itulah mengapa Anda menggunakan YYYYMMDD, itu adalah konvensi yang memungkinkan kami untuk berkomunikasi dengan jelas tentang tanggal, 20030201 karena tanggalnya selalu jelas. (dan membuatnya lebih mudah untuk disortir)
(Sekarang jangan menyimpannya sebagai bilangan bulat 20 juta 30 ribu dua ratus dan 1. tolong ok? Cantik tolong?)
sumber
Biarkan t1 dan t2 menjadi bilangan bulat berbeda yang mewakili dua kali ditulis dalam format YYYYMMDD. Kemudian t1 <t2 menyiratkan bahwa t2 terjadi setelah t1.
Anda kehilangan pemesanan ini dengan pemformatan pertama DD dan MM.
ISO adalah, IMO, satu-satunya format yang masuk akal.
sumber
feature_test_macros(7)
, seperti memiliki_POSIX_C_SOURCE > 200809L
berarti bahwa fitur dari POSIX.1-2008 didukung ...Satu hal yang tidak disebutkan adalah bahwa, dalam input interaktif, format ini memungkinkan untuk mengontrol input.
Sistem tidak dapat mengetahui apakah suatu bulan memiliki 28, 29, 30 atau 31 hari tanpa mengetahui tahun dan bulan tertentu. Ketika input interaktif memberi mandat bahwa tahun dan bulan datang lebih dulu, ia dapat memeriksa apakah hari (yang dimasukkan terakhir) dalam kisaran yang diizinkan.
Memang, pertanyaannya sebagian besar tentang format tanggal, tetapi dapat diperdebatkan bahwa format tanggal mengikuti format yang disajikan kepada pengguna.
sumber
YYYYMMDD memesan tanggal dengan cara yang sama seperti Anda memesan nomor: porsi paling signifikan terlebih dahulu. MMDDYYYY akan seperti menulis "seratus dua puluh tiga" sebagai "dua puluh dan seratus tiga".
Dalam budaya kita, kita memiliki pemahaman alami tentang MMDDYYYY karena, sebagai manusia, kita memiliki kesadaran akan waktu, dan tahun-tahun berjalan lambat. Kita umumnya tahu tahun berapa itu. Melihat tahun jarang penting, jadi kami mendorongnya ke belakang. Bulan berubah cukup cepat untuk mempertahankan kepentingannya. Budaya lain menangani hal ini secara berbeda. Banyak dunia lebih suka DDMMYYYY.
sumber
Penyortiran telah disebutkan tetapi sejauh ini alasan paling berguna untuk dilakukan adalah membandingkannya sebagai "string", dan ya stempel waktu 26 karakter dipesan dengan cara yang sama.
Saya menyadari perbandingan semacam itu sangat penting untuk menyortir, tetapi umumnya berguna untuk elemen 2 elemen.
Saya telah mengerjakan proyek di mana ini tidak diadopsi, dan ya, programmer mencoba (dengan hasil beragam) untuk membandingkan tanggal sebagai string.
Pemformatan cantik adalah untuk sisi klien atau pengaturan huruf.
sumber
Format ini membuat urutan alfabet string identik dengan urutan kronologis tanggal. Ini berguna karena banyak alat menyediakan urutan abjad file misalnya dengan nama, tetapi tidak ada cara untuk menguraikan tanggal yang diformat secara sewenang-wenang dari nama file dan mengurutkannya.
sumber
Ini tentang pembatasan. Bayangkan YEAR, MONTH, dan DAY sebagai parameter, dalam format YYYYMMDD setiap parameter lebih ketat daripada yang sebelumnya.
Jadi, jika Anda ingin mencari sesuatu yang terjadi pada tahun 1970 Anda dapat melakukannya dengan mencari sebuah string yang dimulai
"1970*"
, tetapi jika Anda mengingat bulan yang Anda dapat menambahkan bulan seperti"197005*"
. Dengan cara ini setiap "parameter" tanggal memberi Anda informasi yang lebih spesifik.Ini satu-satunya cara untuk beralih dari info yang kurang spesifik (
"1970*"
) ke info yang lebih spesifik ("19700523"
).sumber
1970*
dan197005*
mewakili sintaks wildcard "glob", maka Anda dapat mencari sekelompok tanggal MMDDYYYY dengan mencari glob*1970
atau05*1970
. Jawaban Anda mungkin secara implisit mengasumsikan beberapa kendala tambahan yang tidak Anda sebutkan secara eksplisit, dan dapat ditingkatkan dengan menjelaskan asumsi Anda.Ini adalah format yang dapat dibaca manusia untuk input dan output, tidak harus disimpan seperti itu.
Lebih dari sepertiga dari semua bahasa pemrograman dikembangkan di negara dengan bahasa Inggris sebagai bahasa utama dan sebagian besar yang modern mematuhi Standar beberapa deskripsi - Standar internasional untuk tanggal adalah ISO 8601 .
Info lebih lanjut: (TMI?)
Ketika waktu berubah, biasanya maju, kenaikan hari pertama, lalu bulan, tahun terakhir - mungkin lebih mudah untuk memahami jika kita memiliki tanggal desimal (dan waktu desimal ) - seiring berjalannya waktu angka semakin besar. Lebih mudah bagi manusia untuk melihat jumlahnya dan membandingkannya dengan kencan lain secara sekilas.
Komputer tidak peduli struktur apa yang ingin Anda gunakan dan di sebagian besar (tetapi tidak semua ) logika biner komputer digunakan - basis e sebenarnya memiliki ekonomi radix terendah tetapi bukan yang paling efisien atau termudah untuk urutan lengkap .
Format input dan output aktual untuk tanggal berbeda-beda di setiap negara dan diatur oleh lokalisasi , sementara YYYYMMDD mungkin tampak paling masuk akal dan menjadi apa yang Anda terbiasa dengannya tidak universal hari ini, juga tidak seperti itu di masa lalu untuk waktu yang lama, namun bahkan hari ini angka Romawi yang umum digunakan untuk tanggal .
Mengetahui tahun depan memberi tahu Anda jumlah hari dalam setahun, variasi durasi terbesar yang bisa dijalani setahun. Ini memberitahu Anda dimuka jumlah hari di setiap bulan untuk mengikuti (untuk pengecekan kesalahan saat masuk), mengizinkan input hari pertama mungkin harus mendukung Anda jika tahun berikutnya tidak setuju dengan input Anda - mungkin membuat input yang dapat diakses lebih sulit . Ini juga memiliki arti penting berkaitan dengan format kalender . Lihat juga kalender geek , dengan stardate desimalnya.
Sejauh menyangkut komputer itu kemungkinan akan menggunakan waktu UNIX Epoch , jumlah detik yang telah berlalu sejak 00:00:00 Waktu Universal Terkoordinasi (UTC), Kamis, 1 Januari 1970, di mana setiap hari diperlakukan seolah-olah mengandung tepatnya 86400 detik. Lihat juga hari Julian . Format YYYYMMDD lebih disukai oleh manusia egosentris, IAU menganggap satu tahun sebagai tahun Julian dari 365,25 hari (31,5576 juta detik) kecuali dinyatakan sebaliknya.
sumber
Penggunaan lain yang saya lihat untuk representasi ini adalah Anda dapat menyimpan tanggal sebagai bilangan bulat (yaitu dalam database), hanya menggunakan 4 byte per tanggal. Dengan menggunakan YYYYMMDD berarti perbandingan integer (seringkali instruksi mesin tunggal) memiliki hasil yang sama dengan perbandingan pada tanggal yang diwakili. Dan itu mencetak cukup mudah dibaca manusia. Dan semua ini tidak memerlukan kode atau dukungan khusus sama sekali, di lingkungan pemrograman mainstream.
Jika hal-hal itu sebagian besar dari apa yang perlu Anda lakukan dengan tanggal, dan Anda perlu melakukan banyak hal, maka format ini memiliki banyak daya tarik.
Sebagai perbandingan, tanggal dalam format umum seperti DD / MM / YYYY mengambil 10 byte sebagai string karakter ASCII. String YYYYMMDD menguranginya menjadi 8 dan mendapatkan keuntungan "membandingkan representasi memiliki hasil yang sama dengan membandingkan tanggal", tetapi bahkan perbandingan berbasis string lebih bersifat karakter per karakter daripada perbandingan integer tunggal.
sumber
Alasan yang sama Bulan terbuat dari keju hijau: bukan. Dalam kebanyakan kasus, format default adalah semacam string terlokalisasi. Terkadang format ISO digunakan tetapi biasanya dengan tanda hubung untuk keterbacaan yang lebih baik.
YYYYMMDD
(atau%Y%m%d
dalamstrftime
istilah) jarang yang default. Agar adil saya yakin saya telah melihatnya tetapi saya tidak bisa memikirkan contoh saat ini.Tanggal unix (utilitas inti GNU)
Keluaran:
Python
keluaran:
C
Keluaran:
C ++
Keluaran:
Javascript
Keluaran:
SQLite
Keluaran:
LibreOffice Calc
Gnumerik
OnlyOffice
Python + numpy
Keluaran:
Python + panda
Keluaran:
Rekayasa Perangkat Lunak
apport.log
alternative.log
cangkir / access.log
syslog
sumber
Do 27. Sep 22:27:09 CEST 2018
sini.)Manfaat tambahan yang tidak disebutkan sejauh ini adalah bahwa kuantisasi yang diinginkan (menetapkan nilai tepat sebagai milik rentang nilai umum yang sama) adalah operasi tunggal yang relatif mudah dan cepat.
Misalkan Anda sedang menulis laporan yang merangkum acara hari ini, seperti jumlah dan jumlah penjualan. Tanggal dan waktu penjualan disimpan sebagai YYYYMMDDHHMISS, Anda hanya perlu menyimpan 8 karakter paling kiri (jika berupa string) atau integer divide (yaitu lantai) sebanyak 1.000.000 untuk mengurangi waktu Anda hingga hari penjualan.
Demikian pula, jika Anda menginginkan penjualan bulan itu, Anda hanya menyimpan 6 digit paling kiri, atau membagi dengan 100.000.000
Tentu, Anda bisa berargumen bahwa manipulasi string apa pun dimungkinkan, suatu masa untuk penjualan "12-25-2018 12:34" dapat dikurangi dan dimanipulasi beberapa kali untuk mendapatkan bulan dan tahun. Dalam bentuk angka 122520181234 dapat dibagi dan diubah, dan dikalikan, dan dibagi lagi, dan akhirnya juga menghasilkan satu bulan dan satu tahun ... ... tetapi kode itu akan sangat sulit untuk ditulis, dibaca, dipelihara, dan dimengerti ..
Dan bahkan pengoptimasi basis data yang canggih mungkin tidak dapat menggunakan indeks pada kolom untuk klausa di mana jika formulir tanggal adalah MM / DD / YYYY tetapi potong dan potong kembali bersama-sama. Sebagai perbandingan, menyimpan representasi YYYYMMDD dan menginginkan Desember 2018 mengarah ke tempat klausa sejenisnya
dateasstring LIKE '201812%'
ataudateasint BETWEEN 20181200 and 20181299
- sesuatu yang indeks dapat dengan mudah digunakan untukJadi, jika tidak ada tipe data khusus untuk tanggal dan representasi string / numerik adalah satu-satunya pilihan, menggunakan dan menyimpan waktu dalam beberapa representasi interval-waktu-terpanjang-di-kiri-ke-pendek-interval-di-the- right memiliki beberapa manfaat untuk kemudahan pemahaman, manipulasi, penyimpanan, pengambilan dan pemeliharaan kode
sumber