Saya telah melihat begitu banyak standar berbeda untuk format tanggal JSON:
"\"\\/Date(1335205592410)\\/\"" .NET JavaScriptSerializer
"\"\\/Date(1335205592410-0500)\\/\"" .NET DataContractJsonSerializer
"2012-04-23T18:25:43.511Z" JavaScript built-in JSON object
"2012-04-21T18:25:43-05:00" ISO 8601
Yang mana yang benar? Atau yang terbaik? Apakah ada standar dalam hal ini?
javascript
json
Kamyar Nazeri
sumber
sumber
strings
,numbers
,true
,false
,null
,objects
Danarrays
Jawaban:
JSON sendiri tidak menentukan bagaimana tanggal harus diwakili, tetapi JavaScript melakukannya.
Anda harus menggunakan format yang dipancarkan oleh
Date
'stoJSON
metode:2012-04-23T18:25:43.511Z
Inilah alasannya:
Itu bisa dibaca manusia tetapi juga ringkas
Jenisnya benar
Ini termasuk detik fraksional, yang dapat membantu membangun kembali kronologi
Sesuai dengan ISO 8601
ISO 8601 telah mapan secara internasional selama lebih dari satu dekade
ISO 8601 didukung oleh W3C , RFC3339 , dan XKCD
Yang sedang berkata , setiap perpustakaan tanggal yang pernah ditulis dapat memahami "milidetik sejak tahun 1970". Jadi untuk portabilitas yang mudah, ThiefMaster benar.
sumber
JSON.stringify({'now': new Date()}) "{"now":"2013-10-21T13:28:06.419Z"}"
-
datang sebelum angkaASCII
, itu akan baik-baik saja hingga 100.000 tahun. ; PJSON tidak tahu apa-apa tentang kencan. Apa yang dilakukan .NET adalah peretasan / ekstensi non-standar.
Saya akan menggunakan format yang dapat dengan mudah dikonversi ke
Date
objek dalam JavaScript, yaitu yang dapat diteruskan kenew Date(...)
. Format termudah dan mungkin paling portabel adalah cap waktu yang mengandung milidetik sejak tahun 1970.sumber
Tidak ada format yang tepat ; The JSON Spesifikasi tidak menentukan format untuk bertukar tanggal yang mengapa ada begitu banyak cara yang berbeda untuk melakukannya.
Format terbaik adalah tanggal yang direpresentasikan dalam format ISO 8601 ( lihat Wikipedia ); itu adalah format yang terkenal dan banyak digunakan dan dapat ditangani di berbagai bahasa, membuatnya sangat cocok untuk interoperabilitas. Jika Anda memiliki kontrol atas json yang dihasilkan, misalnya, Anda memberikan data ke sistem lain dalam format json, memilih 8601 karena format pertukaran tanggal adalah pilihan yang baik.
Jika Anda tidak memiliki kendali atas json yang dihasilkan, misalnya, Anda adalah konsumen json dari beberapa sistem yang ada, cara terbaik untuk menangani ini adalah memiliki fungsi utilitas penguraian tanggal untuk menangani berbagai format yang diharapkan.
sumber
Dari RFC 7493 (Format Pesan I-JSON) :
I-JSON adalah singkatan dari Internet JSON atau Interonable JSON, tergantung pada siapa yang Anda tanya.
sumber
Date().toISOString()
danDate().toJSON()
, dengan batasan yangDate
tidak melacak nilai zona waktu, dan karenanya selalu mengeluarkan cap waktu diZ
zona waktu UTC ( ). Nilai dapat diuraikan menggunakannew Date("...")
danDate.parseDate
.Hanya untuk referensi, saya telah melihat format ini digunakan:
Ia bekerja dengan JSONP yang didukung oleh
$.getJSON()
fungsi. Tidak yakin saya akan merekomendasikan pendekatan ini ... hanya membuangnya di luar sana sebagai kemungkinan karena orang melakukannya dengan cara ini.FWIW: Jangan pernah menggunakan detik sejak zaman dalam protokol komunikasi, atau milidetik sejak zaman, karena ini penuh dengan bahaya berkat implementasi acak dari detik kabisat (Anda tidak tahu apakah pengirim dan penerima sama-sama menerapkan detik kabisat UTC dengan benar).
Agak benci binatang peliharaan, tetapi banyak orang percaya bahwa UTC hanya nama baru untuk GMT - salah! Jika sistem Anda tidak menerapkan detik kabisat maka Anda menggunakan GMT (sering disebut UTC meskipun salah). Jika Anda menerapkan sepenuhnya detik kabisat Anda benar-benar menggunakan UTC. Detik lompatan di masa depan tidak dapat diketahui; mereka dipublikasikan oleh IERS seperlunya dan membutuhkan pembaruan yang konstan. Jika Anda menjalankan sistem yang mencoba menerapkan detik kabisat tetapi berisi dan tabel referensi kedaluwarsa (lebih umum daripada yang Anda kira), maka Anda tidak memiliki GMT, atau UTC, Anda memiliki sistem miring yang berpura-pura menjadi UTC.
Penghitung tanggal ini hanya kompatibel ketika dinyatakan dalam format rusak (y, m, d, dll). Mereka TIDAK PERNAH kompatibel dalam format zaman. Ingatlah itu.
sumber
Jika ragu cukup buka konsol web javascript browser modern dengan menekan F12 (Ctrl + K di Firefox) dan tulis yang berikut ini:
Akan menghasilkan:
Ta-da !!
sumber
Saya percaya bahwa format terbaik untuk interoperabilitas universal bukanlah string ISO-8601, melainkan format yang digunakan oleh EJSON:
{ "myDateField": { "$date" : <ms-since-epoch> } }
Seperti dijelaskan di sini: https://docs.meteor.com/api/ejson.html
Manfaat
Kesimpulan
Saya mengerti bahwa format yang dapat dibaca manusia (string ISO-8601) sangat membantu dan lebih nyaman untuk 80% kasus penggunaan, dan memang tidak seorang pun boleh diberi tahu untuk tidak menyimpan tanggal mereka sebagai string ISO-8601 jika itu adalah aplikasi mereka mengerti, tetapi untuk format transportasi yang diterima secara universal yang harus menjamin nilai-nilai tertentu untuk pasti tanggal, bagaimana kita dapat memungkinkan ambiguitas dan kebutuhan untuk begitu banyak validasi?
sumber
JSON sendiri tidak memiliki format tanggal, tidak peduli bagaimana orang menyimpan tanggal. Namun, karena pertanyaan ini ditandai dengan javascript, saya berasumsi Anda ingin tahu cara menyimpan tanggal javascript di JSON. Anda cukup mengirimkan tanggal ke
JSON.stringify
metode, dan itu akan digunakanDate.prototype.toJSON
secara default, yang pada gilirannya menggunakanDate.prototype.toISOString
( MDN pada Date.toJSON ):Saya juga merasa berguna untuk menggunakan
reviver
parameterJSON.parse
( MDN di JSON.parse ) untuk secara otomatis mengkonversi kembali string ISO ke tanggal javascript setiap kali saya membaca string JSON.sumber
Cara yang disukai menggunakan
2018-04-23T18:25:43.511Z
...Gambar di bawah ini menunjukkan mengapa ini cara yang disukai:
Jadi seperti yang Anda lihat Date memiliki Metode asli
toJSON
, yangreturn
dalam format ini dan dapat dengan mudah dikonversiDate
lagi ...sumber
Di Sharepoint 2013, mendapatkan data dalam JSON tidak ada format untuk mengonversi tanggal menjadi format hanya tanggal, karena pada tanggal tersebut harus dalam format ISO
Ini mungkin bermanfaat bagi Anda
sumber
"2014-01-01T23: 28: 56.782Z"
Tanggal diwakili dalam format standar dan diurutkan yang mewakili waktu UTC (ditunjukkan oleh Z). ISO 8601 juga mendukung zona waktu dengan mengganti nilai Z dengan + atau - untuk offset zona waktu:
"2014-02-01T09: 28: 56.321-10: 00"
Ada variasi lain dari pengkodean zona waktu dalam spesifikasi ISO 8601, tetapi format –10: 00 adalah satu-satunya format TZ yang didukung parser JSON saat ini. Secara umum lebih baik menggunakan format berbasis UTC (Z) kecuali jika Anda memiliki kebutuhan khusus untuk mengetahui zona waktu di mana tanggal tersebut diproduksi (hanya mungkin dalam pembuatan sisi server).
NB: var date = Date baru (); console.log (tanggal); // Rabu 01 Jan 2014 13:28:56 GMT- 1000 (Waktu Standar Hawaii)
untuk memberi tahu Anda bahwa itu cara yang disukai meskipun JavaScript tidak memiliki format standar untuk itu
sumber
Jika Anda menggunakan Kotlin maka ini akan menyelesaikan masalah Anda. (Format MS Json)
sumber
itu bekerja untuk saya dengan Server parse
sumber
Hanya ada satu jawaban yang benar untuk ini dan sebagian besar sistem salah. Jumlah milidetik sejak zaman, alias integer 64 bit. Time Zone adalah masalah UI dan tidak memiliki bisnis di lapisan aplikasi atau lapisan db. Mengapa db Anda peduli apa zona waktu sesuatu itu, ketika Anda tahu itu akan menyimpannya sebagai integer 64 bit kemudian lakukan perhitungan transformasi.
Hapus bit yang asing dan hanya memperlakukan tanggal sebagai angka hingga UI. Anda dapat menggunakan operator aritmatika sederhana untuk melakukan kueri dan logika.
sumber
Kode berikut ini berfungsi untuk saya. Kode ini akan mencetak tanggal dalam format DD-MM-YYYY .
selain itu, Anda juga dapat menggunakan:
sumber
Saya pikir itu sangat tergantung pada use case. Dalam banyak kasus mungkin lebih bermanfaat menggunakan model objek yang tepat (alih-alih merender tanggal ke string), seperti:
Memang ini lebih verbal daripada RFC 3339 tetapi:
Date.toJSON()
tidak)Saya tidak berpikir bahwa penyortiran yang benar (seperti dicatat oleh funroll untuk RFC 3339) adalah fitur yang sangat dibutuhkan ketika membuat serial suatu tanggal ke JSON. Juga itu hanya berlaku untuk tanggal-kali memiliki offset zona waktu yang sama.
sumber
post contains wrong information, is poorly researched, or fails to communicate information
. Tolong jelaskan salah satu dari alasan ini mengapa Anda menurunkan jawaban ini.