Saya mengambil celah pertama saya di Ajax dengan jQuery. Saya mendapatkan data saya ke halaman saya, tetapi saya mengalami beberapa masalah dengan data JSON yang dikembalikan untuk tipe data Date. Pada dasarnya, saya mendapatkan string kembali yang terlihat seperti ini:
/Date(1224043200000)/
Dari seseorang yang sama sekali baru ke JSON - Bagaimana cara memformat ini ke format tanggal pendek? Haruskah ini ditangani di suatu tempat dalam kode jQuery? Saya sudah mencoba jQuery.UI.datepicker
menggunakan plugin $.datepicker.formatDate()
tanpa hasil.
FYI: Inilah solusi yang saya gunakan dengan menggunakan kombinasi jawaban di sini:
function getMismatch(id) {
$.getJSON("Main.aspx?Callback=GetMismatch",
{ MismatchId: id },
function (result) {
$("#AuthMerchId").text(result.AuthorizationMerchantId);
$("#SttlMerchId").text(result.SettlementMerchantId);
$("#CreateDate").text(formatJSONDate(Date(result.AppendDts)));
$("#ExpireDate").text(formatJSONDate(Date(result.ExpiresDts)));
$("#LastUpdate").text(formatJSONDate(Date(result.LastUpdateDts)));
$("#LastUpdatedBy").text(result.LastUpdateNt);
$("#ProcessIn").text(result.ProcessIn);
}
);
return false;
}
function formatJSONDate(jsonDate) {
var newDate = dateFormat(jsonDate, "mm/dd/yyyy");
return newDate;
}
Solusi ini mendapatkan objek saya dari metode panggilan balik dan menampilkan tanggal pada halaman dengan benar menggunakan perpustakaan format tanggal.
Date
.Jawaban:
eval()
tidak perlu. Ini akan bekerja dengan baik:The
substr()
Fungsi mengambil keluar/Date(
bagian, danparseInt()
fungsi mendapat integer dan mengabaikan)/
di akhir. Angka yang dihasilkan dilewatkan keDate
konstruktor.Saya sengaja mengabaikan radix (argumen ke-2
parseInt
); lihat komentar saya di bawah ini .Juga, saya sepenuhnya setuju dengan komentar Rory : Tanggal ISO-8601 lebih disukai daripada format lama ini - jadi format ini umumnya tidak boleh digunakan untuk pengembangan baru. Lihat perpustakaan Json.NET yang sangat baik untuk alternatif hebat yang membuat serialisasi tanggal menggunakan format ISO-8601.
Untuk tanggal JSON yang diformat ISO-8601, cukup masukkan string ke
Date
konstruktor:sumber
Anda dapat menggunakan ini untuk mendapatkan tanggal dari JSON:
Dan kemudian Anda dapat menggunakan skrip Format Tanggal JavaScript (1,2 KB saat diperkecil dan di-gzip) untuk menampilkannya sesuai keinginan.
sumber
jsonDate = new Date(+jsonDate.replace(/\/Date\((\d+)\)\//, '$1'));
new Function
hampir sama buruknya denganeval
: dev.opera.com/articles/view/efisien-javascript/...Bagi mereka yang menggunakan Newtonsoft Json.NET , baca tentang cara melakukannya melalui Native JSON di IE8, Firefox 3.5 plus Json.NET .
Juga dokumentasi tentang mengubah format tanggal yang ditulis oleh Json.NET berguna: Membuat Tanggal dengan Json.NET
Bagi mereka yang terlalu malas, berikut adalah langkah-langkah cepatnya. Karena JSON memiliki implementasi DateTime yang longgar, Anda perlu menggunakan
IsoDateTimeConverter()
. Perhatikan bahwa sejak Json.NET 4.5 format tanggal default adalah ISO sehingga kode di bawah ini tidak diperlukan.JSON akan muncul sebagai
Akhirnya, beberapa JavaScript untuk mengonversi tanggal ISO menjadi tanggal JavaScript:
Saya menggunakannya seperti ini
sumber
new Date("2009-04-12T20:44:55")
+a[1]
dll merupakan potongan array dari regex dan+
akan dilemparkan ke angka, jadi+a[1]
sama dengan2009
dll. Berikut adalah rincian array:0: "2009-04-12T20:44:55" 1: "2009" 2: "04" 3: "12" 4: "20" 5: "44" 6: "55"
Contoh asli:
tidak mencerminkan pemformatan yang digunakan oleh WCF saat mengirim tanggal melalui WCF REST menggunakan serialisasi JSON bawaan. (setidaknya pada. NET 3.5, SP1)
Saya menemukan jawabannya di sini bermanfaat, tetapi sedikit pengeditan pada regex diperlukan, karena tampaknya zona waktu GMT offset sedang ditambahkan ke nomor yang dikembalikan (sejak 1970) di WCF JSON.
Dalam layanan WCF saya punya:
ApptVisitLinkInfo didefinisikan secara sederhana:
Ketika "Field2" dikembalikan sebagai Json dari layanan, nilainya adalah:
Perhatikan offset zona waktu termasuk sebagai bagian dari nilai.
Regex yang dimodifikasi:
Ini sedikit lebih bersemangat dan meraih segalanya di antara parens, bukan hanya nomor pertama. Waktu yang dihasilkan sinze 1970, ditambah offset zona waktu semua dapat dimasukkan ke dalam eval untuk mendapatkan objek tanggal.
Garis yang dihasilkan dari JavaScript untuk penggantian adalah:
sumber
Jangan ulangi diri Anda sendiri - secara otomatis konversi tanggal menggunakan
$.parseJSON()
Jawaban untuk posting Anda memberikan konversi tanggal manual ke tanggal JavaScript. Saya telah memperpanjang jQuery
$.parseJSON()
hanya sedikit, sehingga dapat secara otomatis mengurai tanggal ketika Anda menginstruksikannya. Ini memproses tanggal ASP.NET diformat tanggal (/Date(12348721342)/
) serta tanggal diformat ISO (2010-01-01T12.34.56.789Z
) yang didukung oleh fungsi JSON asli di browser (dan perpustakaan seperti json2.js).Bagaimanapun. Jika Anda tidak ingin mengulangi kode konversi tanggal Anda berulang-ulang, saya sarankan Anda membaca posting blog ini dan mendapatkan kode yang akan membuat hidup Anda sedikit lebih mudah.
sumber
Jika Anda mengatakan dalam JavaScript,
Anda akan melihat bahwa itu adalah tanggal yang benar, dan Anda dapat menggunakannya di mana saja dalam kode JavaScript dengan kerangka kerja apa pun.
sumber
Klik di sini untuk memeriksa Demo
JavaScript / jQuery
Hasil - "10/15/2008"
sumber
Diperbarui
Kami memiliki pustaka UI internal yang harus mengatasi kedua format JSON
/Date(msecs)/
bawaan ASP.NET Microsoft, seperti , yang awalnya ditanyakan di sini, dan sebagian besar format tanggal JSON termasuk JSON.NET, seperti2014-06-22T00:00:00.0
. Selain itu, kita perlu mengatasi ketidakmampuan oldIE untuk mengatasi apa pun kecuali 3 tempat desimal .Kami pertama-tama mendeteksi jenis tanggal yang kami konsumsi, menguraikannya menjadi
Date
objek JavaScript normal , lalu memformatnya.1) Mendeteksi format Microsoft Date
2) Mendeteksi format tanggal ISO
3) Format tanggal Parse MS:
4) Memformat format tanggal ISO.
Kami setidaknya memiliki cara untuk memastikan bahwa kami berurusan dengan tanggal ISO standar atau tanggal ISO yang dimodifikasi untuk selalu memiliki tiga tempat milidetik ( lihat di atas ), sehingga kode ini berbeda tergantung pada lingkungan.
4a) Memformat format Tanggal ISO standar, mengatasi masalah oldIE:
4b) Format Parse ISO dengan desimal tiga milidetik tetap - jauh lebih mudah:
5) Format itu:
6) Ikat semuanya:
Jawaban lama di bawah ini berguna untuk mengikat pemformatan tanggal ini ke parsing JSON jQuery sendiri sehingga Anda mendapatkan objek Date daripada string, atau jika Anda masih terjebak di jQuery <1,5 entah bagaimana.
Jawaban Lama
Jika Anda menggunakan fungsi Ajax jQuery 1.4 dengan ASP.NET MVC, Anda bisa mengubah semua properti DateTime menjadi objek Date dengan:
Di jQuery 1.5 Anda dapat menghindari mengganti
parseJSON
metode secara global dengan menggunakan opsi konverter dalam panggilan Ajax.http://api.jquery.com/jQuery.ajax/
Sayangnya Anda harus beralih ke rute eval yang lebih lama untuk mendapatkan Tanggal untuk menguraikan secara global di tempat - jika tidak, Anda perlu mengonversinya berdasarkan basis kasus per kasus.
sumber
Tidak ada tipe tanggal bawaan di JSON . Ini terlihat seperti jumlah detik / milidetik dari beberapa zaman. Jika Anda tahu zamannya, Anda dapat membuat tanggal dengan menambahkan jumlah waktu yang tepat.
sumber
Saya juga harus mencari solusi untuk masalah ini dan akhirnya saya menemukan moment.js yang merupakan pustaka bagus yang dapat menguraikan format tanggal ini dan banyak lagi.
Ini menyelamatkan beberapa sakit kepala untuk saya, jadi saya pikir saya akan membagikannya kepada Anda. :)
Anda dapat menemukan lebih banyak info tentang itu di sini: http://momentjs.com/
sumber
Saya akhirnya menambahkan "karakter ke dalam ekspresi reguler Panos untuk menghilangkan yang dihasilkan oleh serializer Microsoft ketika menulis objek ke dalam skrip inline:
Jadi, jika Anda memiliki properti di kode C # Anda -belakang itu seperti itu
Dan dalam aspx Anda, Anda miliki
Anda akan mendapatkan sesuatu seperti
Perhatikan tanda kutip ganda.
Untuk mendapatkan ini ke bentuk yang eval akan deserialize dengan benar, saya menggunakan:
Saya menggunakan Prototipe dan untuk menggunakannya saya menambahkan
sumber
Di jQuery 1.5, selama Anda memiliki json2.js untuk menutupi peramban yang lebih lama, Anda dapat membatalkan deserialisasi semua tanggal yang datang dari Ajax sebagai berikut:
Saya menyertakan logika yang mengasumsikan Anda mengirim semua tanggal dari server sebagai UTC (yang seharusnya); konsumen kemudian mendapatkan
Date
objek JavaScript yang memiliki nilai kutu yang tepat untuk mencerminkan hal ini. Yaitu, panggilangetUTCHours()
, dll. Pada tanggal tersebut akan mengembalikan nilai yang sama seperti di server, dan panggilangetHours()
akan mengembalikan nilai dalam zona waktu lokal pengguna sebagaimana ditentukan oleh browser mereka.Ini tidak memperhitungkan format WCF dengan offset zona waktu, meskipun itu relatif mudah untuk ditambahkan.
sumber
Menggunakan datepicker jQuery UI - benar-benar masuk akal jika Anda sudah memasukkan jQuery UI:
keluaran:
sumber
Jangan terlalu memikirkan ini. Seperti yang telah kami lakukan selama beberapa dekade, berikan offset numerik dari zaman standar de-facto 1 Januari 1970 tengah malam GMT / UTC / & c dalam beberapa detik (atau milidetik) sejak zaman ini. JavaScript menyukainya, Java menyukainya, C menyukainya, dan Internet menyukainya.
sumber
Setiap orang dari jawaban ini memiliki satu kesamaan: semuanya menyimpan tanggal sebagai nilai tunggal (biasanya string).
Opsi lain adalah untuk mengambil keuntungan dari struktur yang melekat dari JSON, dan mewakili tanggal sebagai daftar angka:
Tentu saja, Anda harus memastikan kedua ujung percakapan menyetujui format (tahun, bulan, hari), dan bidang mana yang dimaksudkan sebagai tanggal, ... tetapi memiliki keuntungan untuk sepenuhnya menghindari masalah tanggal konversi ke string. Itu semua angka - tidak ada string sama sekali. Selain itu, menggunakan pesanan: tahun, bulan, hari juga memungkinkan penyortiran yang tepat berdasarkan tanggal.
Hanya berpikir di luar kotak di sini - tanggal JSON tidak harus disimpan sebagai string.
Bonus lain untuk melakukannya dengan cara ini adalah bahwa Anda dapat dengan mudah (dan efisien) memilih semua catatan untuk tahun atau bulan tertentu dengan memanfaatkan cara CouchDB menangani kueri pada nilai array.
sumber
Posting di utas luar biasa:
sumber
Hanya untuk menambahkan pendekatan lain di sini, "pendekatan kutu" yang diambil WCF rentan terhadap masalah dengan zona waktu jika Anda tidak terlalu berhati-hati seperti yang dijelaskan di sini dan di tempat lain. Jadi saya sekarang menggunakan format ISO 8601 yang didukung .NET & JavaScript sebagaimana mestinya termasuk zona waktu. Berikut ini rinciannya:
Di WCF / .NET:
Di mana CreationDate adalah System.DateTime; ToString ("o") menggunakan specifier format Round-trip .NET yang menghasilkan string tanggal yang sesuai dengan ISO 8601
Dalam JavaScript
Hanya setelah mengambil JSON saya pergi fixup tanggal menjadi objek JavaSript Date menggunakan konstruktor Tanggal yang menerima string tanggal 8601 ISO ...
Setelah Anda memiliki tanggal JavaScript, Anda dapat menggunakan semua metode Tanggal yang nyaman dan andal seperti toDateString , toLocaleString , dll.
sumber
Apakah ada opsi lain tanpa menggunakan perpustakaan jQuery?
sumber
Ini juga dapat membantu Anda.
sumber
Di bawah ini adalah solusi yang cukup sederhana untuk mem-parsing tanggal JSON. Gunakan fungsi di bawah ini sesuai kebutuhan Anda. Anda hanya perlu meneruskan format JSON Tanggal yang diambil sebagai parameter ke fungsi di bawah ini:
sumber
Anda juga dapat menggunakan library JavaScript moment.js , yang berguna ketika Anda berencana menangani berbagai format lokal dan melakukan operasi lain dengan nilai tanggal:
Menyiapkan pelokalan semudah menambahkan file konfigurasi (Anda mendapatkannya di momentjs.com) ke proyek Anda dan mengonfigurasi bahasa:
sumber
Saya mendapatkan tanggal seperti ini:
Dalam beberapa contoh, tanggal dalam format yang sedikit berbeda:
dll.
Jadi saya datang dengan RegExp berikut:
dan kode terakhir adalah:
Semoga ini bisa membantu.
Pembaruan: Saya menemukan tautan ini dari Microsoft: Bagaimana cara saya Serialize Tanggal dengan JSON?
Ini sepertinya yang kita semua cari.
sumber
Periksa tanggal standar ISO; jenis seperti ini:
Menjadi
2008.11.20T22:18
.sumber
Ini membuat frustrasi. Solusi saya adalah mem-parsing keluar "/ dan /" dari nilai yang dihasilkan oleh JavaScriptSerializer ASP.NET sehingga, meskipun JSON mungkin tidak memiliki tanggal literal, itu masih akan ditafsirkan oleh browser sebagai tanggal, itulah yang saya benar-benar ingin:
{"myDate":Date(123456789)}
Custom JavaScriptConverter untuk DateTime?
Saya harus menekankan keakuratan komentar Roy Tinker. Ini bukan JSON legal. Ini adalah hack kotor di server untuk menghapus masalah sebelum menjadi masalah bagi JavaScript. Ini akan mencekik parser JSON. Saya menggunakannya untuk turun dari tanah, tapi saya tidak menggunakannya lagi. Namun, saya masih merasakan jawaban terbaik terletak dengan mengubah cara format server tanggal, misalnya, ISO seperti yang disebutkan di tempat lain.
sumber
Posting yang terlambat, tetapi untuk mereka yang mencari posting ini.
Bayangkan ini:
Seperti yang Anda lihat, saya menggunakan fitur C # 3.0 untuk membuat Generik "Otomatis". Agak malas, tapi saya suka dan berhasil. Sekedar catatan: Profil adalah kelas khusus yang saya buat untuk proyek aplikasi web saya.
sumber
FYI, bagi siapa saja yang menggunakan Python di sisi server: datetime.datetime (). Ctime () mengembalikan string yang dapat diurai secara alami oleh "new Date ()". Yaitu, jika Anda membuat contoh datetime.datetime baru (seperti dengan datetime.datetime.now), string dapat dimasukkan dalam string JSON, dan kemudian string itu dapat diteruskan sebagai argumen pertama ke konstruktor Tanggal. Saya belum menemukan pengecualian, tetapi saya juga belum mengujinya dengan ketat.
sumber
Solusi Mootools:
Membutuhkan lebih banyak mootool. Diuji menggunakan mootools-1.2.3.1-lebih pada Firefox 3.6.3 dan IE 7.0.5730.13
sumber
sumber
Tambahkan plugin jQuery UI di halaman Anda:
sumber
Bagaimana jika .NET mengembalikan ...
Dan kemudian di JavaScript ...
sumber