ASP.NET MVC JsonResult Format Tanggal

248

Saya memiliki aksi pengontrol yang secara efektif mengembalikan JsonResult dari model saya. Jadi, dalam metode saya, saya memiliki sesuatu seperti berikut:

return new JsonResult(myModel);

Ini bekerja dengan baik, kecuali untuk satu masalah. Ada properti tanggal dalam model dan ini tampaknya dikembalikan dalam hasil Json seperti:

"\/Date(1239018869048)\/"

Bagaimana saya harus berurusan dengan tanggal sehingga dikembalikan dalam format yang saya butuhkan? Atau bagaimana saya menangani format ini di atas dalam skrip?

Jon Archway
sumber
Saya telah memposting hasil json net saya ke masalah yang sama, itu mengubah tanggal ke format iso membuatnya lebih mudah untuk bekerja dengannya. stackoverflow.com/questions/15778599/…
Kieran
Silakan lihat tautan di bawah ini. Lurus ke depan. stackoverflow.com/a/60392503/5962626
Mohamedasiq

Jawaban:

195

Hanya untuk memperluas jawaban casperOne .

Spesifikasi JSON tidak memperhitungkan nilai tanggal. MS harus membuat panggilan, dan jalur yang mereka pilih adalah untuk mengeksploitasi sedikit trik dalam representasi javascript string: string literal "/" sama dengan "\ /", dan string literal tidak akan pernah di -serialisasi menjadi " \ / "(datar" \ / "harus dipetakan ke" \\ / ").

Lihat http://msdn.microsoft.com/en-us/library/bb299886.aspx#intro_to_json_topic2 untuk penjelasan yang lebih baik (gulir ke bawah ke "Dari JavaScript Literals ke JSON")

Salah satu poin sakit JSON adalah kurangnya tanggal / waktu literal. Banyak orang terkejut dan kecewa mengetahui hal ini ketika mereka pertama kali bertemu JSON. Penjelasan sederhana (menghibur atau tidak) untuk tidak adanya tanggal / waktu literal adalah bahwa JavaScript tidak pernah memiliki salah satu dari keduanya: Dukungan untuk nilai tanggal dan waktu dalam JavaScript sepenuhnya disediakan melalui objek Tanggal. Sebagian besar aplikasi menggunakan JSON sebagai format data, oleh karena itu, umumnya cenderung menggunakan string atau angka untuk mengekspresikan nilai tanggal dan waktu. Jika string digunakan, Anda biasanya dapat mengharapkannya dalam format ISO 8601. Jika angka digunakan, sebagai gantinya, maka nilai biasanya diambil untuk berarti jumlah milidetik di Universal Coordinated Time (UTC) sejak zaman, di mana zaman didefinisikan sebagai tengah malam 1 Januari 1970 (UTC). Lagi, ini hanya konvensi dan bukan bagian dari standar JSON. Jika Anda bertukar data dengan aplikasi lain, Anda perlu memeriksa dokumentasinya untuk melihat bagaimana ia menyandikan nilai tanggal dan waktu dalam literal JSON. Misalnya, Microsoft ASP.NET AJAX tidak menggunakan konvensi yang dijelaskan. Alih-alih, ini mengkodekan .NET DateTime nilai sebagai string JSON, di mana konten string adalah / Date (kutu) / dan di mana kutu mewakili milidetik sejak zaman (UTC). Jadi, 29 November 1989, 4:55:30 pagi, dalam UTC dikodekan sebagai "\ / Tanggal (628318530718) \ /". NET AJAX tidak menggunakan konvensi yang dijelaskan. Alih-alih, ini mengkodekan .NET DateTime nilai sebagai string JSON, di mana konten string adalah / Date (kutu) / dan di mana kutu mewakili milidetik sejak zaman (UTC). Jadi, 29 November 1989, 4:55:30 pagi, dalam UTC dikodekan sebagai "\ / Tanggal (628318530718) \ /". NET AJAX tidak menggunakan konvensi yang dijelaskan. Alih-alih, ini mengkodekan .NET DateTime nilai sebagai string JSON, di mana konten string adalah / Date (kutu) / dan di mana kutu mewakili milidetik sejak zaman (UTC). Jadi, 29 November 1989, 4:55:30 pagi, dalam UTC dikodekan sebagai "\ / Tanggal (628318530718) \ /".

Solusi adalah dengan menguraikannya:

value = new Date(parseInt(value.replace("/Date(", "").replace(")/",""), 10));

Namun saya pernah mendengar bahwa ada pengaturan di suatu tempat untuk mendapatkan serializer ke DateTimeobjek keluaran dengan new Date(xxx)sintaks. Saya akan mencoba menggali itu.


Parameter kedua dari JSON.parse()menerima reviverfungsi di mana menentukan bagaimana nilai awalnya diproduksi oleh, sebelum dikembalikan.

Berikut ini contoh untuk kencan:

var parsed = JSON.parse(data, function(key, value) {
  if (typeof value === 'string') {
    var d = /\/Date\((\d*)\)\//.exec(value);
    return (d) ? new Date(+d[1]) : value;
  }
  return value;
});

Lihat dokumen JSON.parse ()

JPot
sumber
1
Terima kasih, kemana perginya parsing?
Jon Archway
Kode yang saya posting adalah JavaScript. Anda akan memasukkannya ke dalam kode klien Anda.
JPot
6
Anda dapat mempersingkat js ke Date baru (parseInt (dateString.replace (/ \ / Date \ ((\ d +) \) \ // gi, "$ 1")))
kͩeͣmͮpͥ ͩ
6
Sebenarnya regex lebih benar sebagai ganti (/ \ / Date \ ((-? \ D +) \) gi //, "$ 1") karena tanggal tersebut dapat direpresentasikan sebagai nomor -ve juga
Dokie
1
@HarshilShah Itulah argumen kedua untuk parseInt(). Ini memberitahu fungsi untuk mengekstrak integer dalam sistem angka 10 basis. Itu radix. Jika dimasukkan 8ke sana, itu akan mengekstrak angka oktal.
AnalogWeapon
99

Inilah solusi saya di Javascript - sangat mirip dengan JPot, tetapi lebih pendek (dan mungkin sedikit lebih cepat):

value = new Date(parseInt(value.substr(6)));

"value.substr (6)" mengeluarkan bagian "/ Date (", dan fungsi parseInt mengabaikan karakter non-angka yang terjadi di akhir.

EDIT: Saya sengaja mengabaikan radix (argumen ke-2 untuk parseInt); lihat komentar saya di bawah ini . Perlu diketahui juga bahwa 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 konstruktor Tanggal:

var date = new Date(jsonDate); //no ugly parsing needed; full timezone support
Roy Tinker
sumber
1
+1 Saya mengambil solusi sederhana Anda dan meletakkannya di fungsi rekursif. Lihat di sini: danielsadventure.info/dotnetdatetime
Sungai Vivian
7
Anda harus selalu menentukan radix saat menggunakan parseInt. [Sumber]: developer.mozilla.org/en-US/docs/JavaScript/Reference/…
John Zabroski
6
@JohnZabroski: Setiap aturan memiliki pengecualian. Serializer tanggal .NET tidak pernah mengembalikan bilangan bulat dengan nol terkemuka, sehingga kami dapat dengan aman meninggalkan radix.
Roy Tinker
4
Kami memiliki hal yang hampir sama. Kami digunakan value.substr(6, 13)untuk menghapus karakter non-angka lainnya. Tetapi jika Anda melakukan itu, semua tanggal SEBELUM 04/26/1938 tidak valid! Kami tidak tahu parseIntakan mengabaikan karakter bukan angka. Terima kasih!
Ralph Jansen
2
@ JohnZabroski — parseIntharus mengabaikan nol di awal ECMAScript ed 5 (2011).
RobG
69

Ada sedikit jawaban untuk mengatasinya dari sisi klien, tetapi Anda dapat mengubah sisi server output jika diinginkan.

Ada beberapa cara untuk mendekati ini, saya akan mulai dengan dasar-dasarnya. Anda harus mensubkelas kelas JsonResult dan mengganti metode ExecuteResult. Dari sana Anda dapat mengambil beberapa pendekatan berbeda untuk mengubah serialisasi.

Pendekatan 1: Implementasi default menggunakan JsonScriptSerializer . Jika Anda melihat pada dokumentasi, Anda dapat menggunakan metode RegisterConverters untuk menambahkan JavaScriptConverters kustom . Ada beberapa masalah dengan ini: JavaScriptConverter membuat serial ke kamus, yaitu mengambil objek dan membuat serial ke kamus Json. Untuk membuat objek cerita bersambung menjadi string, ia membutuhkan sedikit peretasan, lihat posting . Retasan khusus ini juga akan lolos dari string.

public class CustomJsonResult : JsonResult
{
    private const string _dateFormat = "yyyy-MM-dd HH:mm:ss";

    public override void ExecuteResult(ControllerContext context)
    {
        if (context == null)
        {
            throw new ArgumentNullException("context");
        }

        HttpResponseBase response = context.HttpContext.Response;

        if (!String.IsNullOrEmpty(ContentType))
        {
            response.ContentType = ContentType;
        }
        else
        {
            response.ContentType = "application/json";
        }
        if (ContentEncoding != null)
        {
            response.ContentEncoding = ContentEncoding;
        }
        if (Data != null)
        {
            JavaScriptSerializer serializer = new JavaScriptSerializer();

            // Use your custom JavaScriptConverter subclass here.
            serializer.RegisterConverters(new JavascriptConverter[] { new CustomConverter });

            response.Write(serializer.Serialize(Data));
        }
    }
}

Pendekatan 2 (disarankan): Pendekatan kedua adalah mulai dengan JsonResult yang ditimpa dan pergi dengan serializer Json lain, dalam kasus saya serializer Json.NET . Ini tidak memerlukan peretasan pendekatan 1. Inilah implementasi saya dari subkelas JsonResult:

public class CustomJsonResult : JsonResult
{
    private const string _dateFormat = "yyyy-MM-dd HH:mm:ss";

    public override void ExecuteResult(ControllerContext context)
    {
        if (context == null)
        {
            throw new ArgumentNullException("context");
        }

        HttpResponseBase response = context.HttpContext.Response;

        if (!String.IsNullOrEmpty(ContentType))
        {
            response.ContentType = ContentType;
        }
        else
        {
            response.ContentType = "application/json";
        }
        if (ContentEncoding != null)
        {
            response.ContentEncoding = ContentEncoding;
        }
        if (Data != null)
        {
            // Using Json.NET serializer
            var isoConvert = new IsoDateTimeConverter();
            isoConvert.DateTimeFormat = _dateFormat;
            response.Write(JsonConvert.SerializeObject(Data, isoConvert));
        }
    }
}

Contoh Penggunaan:

[HttpGet]
public ActionResult Index() {
    return new CustomJsonResult { Data = new { users=db.Users.ToList(); } };
}

Kredit tambahan: James Newton-King

Dave yang mudah rusak
sumber
Dan bagaimana dengan format lain seperti moneter, nomor identifikasi, telepon, dan sebagainya? Bukankah pendekatan yang lebih baik untuk mendapatkan format ini dari ModelMetadata dan menggunakannya untuk membuat serialisasi Model ke Json? Bagaimana?
Luciano
1
Ini adalah solusi terbaik (jawaban Perishable Dave). Server bertanggung jawab untuk memberikan format tanggal yang benar. Juga memiliki custom JsonResult memberi lebih banyak manfaat dan kontrol. Saya akan menyarankan menerapkan metode pembantu "CustomJson (data)" yang instantiates CustomJsonResult karena ada "Json (data)", yang instantiates JsonResult dengan datanya.
Olah raga tanggal
2
Satu koreksi diperlukan jika Anda menggunakan salah satu dari pendekatan ini - baris pertama adalah: private const string _dateFormat = "yyyy-MM-ddTHH: mm: ss"; Saya menambahkan "T".
Dominick
31

Moment.js adalah pustaka datetime luas yang juga mendukung ini. http://momentjs.com/docs/#/parsing/asp-net-json-dates/

mis: saat ("/ Tanggal (1198908717056-0700) /")

Mungkin membantu. keluaran plunker

Eric
sumber
Pertama unduh file moment.js. Tambahkan dalam proyek Anda daripada penggunaan, moment("json_date_string_value").format('appropriate format'); Anda dapat melihat nilai format yang berbeda pada halaman momet.js
Harshil Shah
20

Saya menemukan bahwa membuat yang baru JsonResultdan kembali yang tidak memuaskan - harus mengganti semua panggilan return Json(obj)dengan return new MyJsonResult { Data = obj }adalah menyakitkan.


Jadi saya pikir, mengapa tidak membajak saja JsonResultmenggunakan ActionFilter:

public class JsonNetFilterAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        if (filterContext.Result is JsonResult == false)
        {
            return;
        }

        filterContext.Result = new JsonNetResult(
            (JsonResult)filterContext.Result);
    }

    private class JsonNetResult : JsonResult
    {
        public JsonNetResult(JsonResult jsonResult)
        {
            this.ContentEncoding = jsonResult.ContentEncoding;
            this.ContentType = jsonResult.ContentType;
            this.Data = jsonResult.Data;
            this.JsonRequestBehavior = jsonResult.JsonRequestBehavior;
            this.MaxJsonLength = jsonResult.MaxJsonLength;
            this.RecursionLimit = jsonResult.RecursionLimit;
        }

        public override void ExecuteResult(ControllerContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException("context");
            }

            var isMethodGet = string.Equals(
                context.HttpContext.Request.HttpMethod, 
                "GET", 
                StringComparison.OrdinalIgnoreCase);

            if (this.JsonRequestBehavior == JsonRequestBehavior.DenyGet
                && isMethodGet)
            {
                throw new InvalidOperationException(
                    "GET not allowed! Change JsonRequestBehavior to AllowGet.");
            }

            var response = context.HttpContext.Response;

            response.ContentType = string.IsNullOrEmpty(this.ContentType) 
                ? "application/json" 
                : this.ContentType;

            if (this.ContentEncoding != null)
            {
                response.ContentEncoding = this.ContentEncoding;
            }

            if (this.Data != null)
            {
                response.Write(JsonConvert.SerializeObject(this.Data));
            }
        }
    }
}

Ini dapat diterapkan pada metode apa pun yang mengembalikan a JsonResultuntuk menggunakan JSON.Net sebagai gantinya:

[JsonNetFilter]
public ActionResult GetJson()
{
    return Json(new { hello = new Date(2015, 03, 09) }, JsonRequestBehavior.AllowGet)
}

yang akan merespons

{"hello":"2015-03-09T00:00:00+00:00"}

seperti yang diinginkan!


Anda dapat, jika Anda tidak keberatan menyebut isperbandingan di setiap permintaan, tambahkan ini ke FilterConfig:

// ...
filters.Add(new JsonNetFilterAttribute());

dan semua JSON Anda sekarang akan diserialisasi dengan JSON.Net alih-alih built-in JavaScriptSerializer.

dav_i
sumber
Ini adalah satu-satunya jawaban yang memberikan pendekatan yang solid (dapat ditetapkan sebagai global atau granular) tanpa inline javascript yang aneh. Bisakah saya memilih dua kali?
T-moty
19

Menggunakan jQuery untuk mengonversi tanggal secara otomatis dengan $.parseJSON

Catatan : jawaban ini menyediakan ekstensi jQuery yang menambahkan dukungan format tanggal ISO dan .net otomatis.

Karena Anda menggunakan Asp.net MVC, saya curiga Anda menggunakan jQuery di sisi klien. Saya sarankan Anda membaca posting blog ini yang memiliki kode cara menggunakan $.parseJSONuntuk secara otomatis mengkonversi tanggal untuk Anda.

Kode mendukung tanggal yang diformat Asp.net seperti yang Anda sebutkan serta tanggal yang diformat ISO. Semua tanggal akan secara otomatis diformat untuk Anda dengan menggunakan $.parseJSON().

Robert Koritnik
sumber
2
Awalnya saya pikir pendekatan ini bekerja dengan sangat baik. (Lihat komentar di akhir artikel untuk cara mendaftarkan konverter di $ .ajaxSetup ()) Namun, kerugian besar untuk solusi ini adalah bahwa ia tidak mendukung tanggal sebelum Epoc (1970) ..... jadi sekarang saya sudah memutuskan untuk menyerah pada file .asmx dan beralih ke WebAPI yang format tanggal lebih baik (menggunakan JSON.NET) dan akan menghindari semua masalah ini.
ClearCloud8
11

Komunikasi ajax antara klien dan server sering melibatkan data dalam format JSON. Sementara JSON berfungsi dengan baik untuk string, angka dan Boolean, JSON dapat menimbulkan beberapa kesulitan untuk tanggal karena cara ASP.NET membuat serial mereka. Karena tidak memiliki representasi khusus untuk tanggal, mereka diserialisasi sebagai string biasa. Sebagai solusi mekanisme serialisasi default ASP.NET Web Forms dan MVC membuat serialisasi tanggal dalam bentuk khusus - / Tanggal (kutu) / - di mana kutu adalah jumlah milidetik sejak 1 Januari 1970.

Masalah ini dapat diselesaikan dengan 2 cara:

sisi klien

Ubah string tanggal yang diterima menjadi angka dan buat objek tanggal menggunakan konstruktor dari kelas tanggal dengan centang sebagai parameter.

function ToJavaScriptDate(value) {
  var pattern = /Date\(([^)]+)\)/;
  var results = pattern.exec(value);
  var dt = new Date(parseFloat(results[1]));
  return (dt.getMonth() + 1) + "/" + dt.getDate() + "/" + dt.getFullYear();
}

sisi server

Solusi sebelumnya menggunakan skrip sisi klien untuk mengonversi tanggal menjadi objek Tanggal JavaScript. Anda juga dapat menggunakan kode sisi server yang membuat serial .NET DateTime instance dalam format pilihan Anda. Untuk menyelesaikan tugas ini, Anda perlu membuat ActionResult Anda sendiri dan kemudian membuat serial data seperti yang Anda inginkan.

referensi: http://www.developer.com/net/dealing-with-json-dates-in-asp.net-mvc.html

Mischa
sumber
7

Saya memiliki masalah yang sama dan alih-alih mengembalikan nilai tanggal aktual saya hanya menggunakan ToString ("dd MMM yyyy") di atasnya. Kemudian di javascript saya, saya menggunakan Date baru (datevalue), di mana datevalue mungkin "01 Jan 2009".

Joe
sumber
1
Ini seharusnya memiliki lebih banyak suara positif. Setidaknya sama baiknya dengan yang paling terunggul. Sedikit lebih elegan daripada memotong talinya. Secara pribadi, saya menggunakan ini tetapi tidak membuat ulang objek tanggal di ujung depan karena saya hanya perlu menampilkannya, jadi saya hanya menampilkan string yang diformat (sedikit berbeda). Terima kasih atas tipnya, @Joe!
vbullinger
1
Itu tidak memecah pemisahan keprihatinan, yaitu menempatkan kekhawatiran tentang bagaimana tanggal ditampilkan di ujung depan di ujung belakang. Tapi meh, masih lebih elegan.
A. Murray
1
Mengapa tidak menggunakan sesuatu yang kurang rapuh ToString("o")?
binki
"dd MMM yyyy" tidak didukung oleh ECMA-262, jadi Anda seharusnya tidak mengharapkan pengurai bawaan untuk menguraikannya
RobG
3

Lihat utas ini:

http://forums.asp.net/p/1038457/1441866.aspx#1441866

Pada dasarnya, sementara Date()formatnya adalah javascript yang valid, itu BUKAN JSON yang valid (ada perbedaan). Jika Anda ingin format lama, Anda mungkin harus membuat fasad dan mengubah nilainya sendiri, atau menemukan cara untuk mendapatkan di serializer untuk jenis Anda di JsonResultdan menggunakannya menggunakan format kustom untuk tanggal.

casperOne
sumber
Pikirkan maksud Anda "selagi format Date () baru adalah javascript yang valid" [perhatikan kata kunci "baru"]?
JPot
2

Bukan cara yang paling elegan tetapi ini berhasil bagi saya:

var ms = date.substring(6, date.length - 2);
var newDate = formatDate(ms);


function formatDate(ms) {

    var date = new Date(parseInt(ms));
    var hour = date.getHours();
    var mins = date.getMinutes() + '';
    var time = "AM";

    // find time 
    if (hour >= 12) {
        time = "PM";
    }
    // fix hours format
    if (hour > 12) {
        hour -= 12;
    }
    else if (hour == 0) {
        hour = 12;
    }
    // fix minutes format
    if (mins.length == 1) {
        mins = "0" + mins;
    }
    // return formatted date time string
    return date.getMonth() + 1 + "/" + date.getDate() + "/" + date.getFullYear() + " " + hour + ":" + mins + " " + time;
}
Gabe
sumber
2

Saya telah mengerjakan solusi untuk masalah ini karena tidak ada jawaban di atas yang benar-benar membantu saya. Saya bekerja dengan kalender minggu jquery dan membutuhkan tanggal saya untuk memiliki informasi zona waktu di server dan secara lokal di halaman. Setelah sedikit menggali, saya menemukan solusi yang dapat membantu orang lain.

Saya menggunakan asp.net 3.5, vs 2008, asp.net MVC 2, dan kalender minggu jquery,

Pertama, saya menggunakan perpustakaan yang ditulis oleh Steven Levithan yang membantu menangani tanggal di sisi klien, perpustakaan tanggal Steven Levithan . Format isoUtcDateTime sangat cocok untuk apa yang saya butuhkan. Dalam panggilan AJAX jquery saya, saya menggunakan fungsi format yang disediakan dengan perpustakaan dengan format isoUtcDateTime dan ketika panggilan ajax hits metode tindakan saya, Jenis datetime diatur ke lokal dan mencerminkan waktu server.

Ketika saya mengirim tanggal ke halaman saya melalui AJAX, saya mengirimnya sebagai string teks dengan memformat tanggal menggunakan "ddd, dd MMM yyyy HH ':' mm ':' ss 'GMT'zzzz". Format ini mudah dikonversi menggunakan sisi klien

var myDate = new Date(myReceivedDate);

Ini solusi lengkap saya dikurangi sumber Steve Levithan, yang bisa Anda unduh:

Pengendali:

public class HomeController : Controller
{
    public const string DATE_FORMAT = "ddd, dd MMM yyyy HH':'mm':'ss 'GMT'zzzz";

    public ActionResult Index()
    {
        ViewData["Message"] = "Welcome to ASP.NET MVC!";

        return View();
    }

    public ActionResult About()
    {
        return View();
    }


    public JsonResult GetData()
    {
        DateTime myDate = DateTime.Now.ToLocalTime();

        return new JsonResult { Data = new { myDate = myDate.ToString(DATE_FORMAT) } };
    }

    public JsonResult ReceiveData(DateTime myDate)
    {
        return new JsonResult { Data = new { myDate = myDate.ToString(DATE_FORMAT) } };
    }
}

Javascript:

<script type="text/javascript">

function getData() {
    $.ajax({
        url: "/Home/GetData",
        type: "POST",
        cache: "false",
        dataType: "json",
        success: function(data) {
            alert(data.myDate);
            var newDate = cleanDate(data.myDate);
            alert(newDate);
            sendData(newDate);
        }
    });
} 

function cleanDate(d) {
    if (typeof d == 'string') {
        return new Date(d) || Date.parse(d) || new Date(parseInt(d));
    }
    if (typeof d == 'number') {
        return new Date(d);
    }
    return d;
}

function sendData(newDate) {
    $.ajax({
        url: "/Home/ReceiveData",
        type: "POST",
        cache: "false",
        dataType: "json",
        data:
        {
            myDate: newDate.format("isoUtcDateTime")
        },
        success: function(data) {
            alert(data.myDate);
            var newDate = cleanDate(data.myDate);
            alert(newDate);
        }
    });
}

// bind myButton click event to call getData
$(document).ready(function() {
    $('input#myButton').bind('click', getData);
});
</script>

Saya harap contoh cepat ini membantu orang lain dalam situasi yang sama dengan saya. Pada saat ini tampaknya bekerja dengan sangat baik dengan Serialisasi Microsoft JSON dan menjaga tanggal saya benar di seluruh zona waktu.

Jesse
sumber
Jika Anda dapat menentukan format tanggal, maka Anda harus menggunakan ISO 8601 yang diperluas karena itulah satu-satunya format yang memerlukan dukungan untuk ECMA-262.
RobG
2

Cara yang lebih baik untuk menangani tanggal di knockout adalah dengan menggunakan perpustakaan saat dan menangani tanggal seperti bos. Anda dapat dengan mudah menangani tanggal seperti / Tanggal (-62135578800000) /. Tidak perlu repot bagaimana serialize date Anda di controller.

function jsonToDate(date,format) {
   return moment(date).format(format);
}

gunakan seperti

var formattedDate = jsonToDate(date,'MM/DD/YYYY')

momentjs mendukung banyak format waktu tanggal dan fungsi utilitas pada tanggal.

Ajay Kelkar
sumber
1

Format tanggal dalam kueri.

var _myModel = from _m in model.ModelSearch(word)
    select new { date = ((DateTime)_m.Date).ToShortDateString() };

Satu-satunya masalah dengan solusi ini adalah bahwa Anda tidak akan mendapatkan hasil apa pun jika nilai tanggal APAPUN adalah nol. Untuk menyiasatinya, Anda bisa memasukkan pernyataan kondisional ke dalam kueri Anda SEBELUM Anda memilih tanggal yang mengabaikan tanggal nol atau Anda bisa mengatur kueri untuk mendapatkan semua hasil dan kemudian mengulang semua informasi itu menggunakan loop foreach dan memberikan nilai. untuk semua tanggal yang nol SEBELUM Anda melakukan SELECT Anda yang baru.

Contoh keduanya:

var _test = from _t in adc.ItemSearchTest(word)
                        where _t.Date != null
                        select new { date = ((DateTime)_t.Date).ToShortDateString() };

Opsi kedua membutuhkan kueri lain sepenuhnya sehingga Anda dapat menetapkan nilai ke semua nol. Loop ini dan foreach harus SEBELUM permintaan Anda yang memilih nilai-nilai.

var _testA = from _t in adc.ItemSearchTest(word)
                         select _i;

            foreach (var detail in _testA)
            {
                if (detail.Date== null)
                {
                    detail.Date= Convert.ToDateTime("1/1/0001");
                }
            }

Hanya sebuah ide yang saya temukan lebih mudah daripada semua contoh javascript.

Chad
sumber
1

Anda dapat menggunakan metode ini:

String.prototype.jsonToDate = function(){
    try{
        var date;
        eval(("date = new " + this).replace(/\//g,''));
        return date;
    } 
    catch(e){
        return new Date(0);
    }
};
Eladmat
sumber
1

0

Di cshtml Anda,

<tr ng-repeat="value in Results">                
 <td>{{value.FileReceivedOn | mydate | date : 'dd-MM-yyyy'}} </td>
</tr>

Di File JS Anda, mungkin app.js,

Di luar app.controller, tambahkan filter di bawah ini.

Di sini "tanggal saya" adalah fungsi yang Anda panggil untuk menguraikan tanggal. Di sini "app" adalah variabel yang berisi angular.module

app.filter("mydate", function () {
    var re = /\/Date\(([0-9]*)\)\//;
    return function (x) {
        var m = x.match(re);
        if (m) return new Date(parseInt(m[1]));
        else return null;
    };
});
Mohamedasiq
sumber
Ini sangat spesifik untuk angular, tidak semua orang menggunakannya, tapi ini berhasil buat saya, terima kasih.
Lauro182
0

tambahkan plugin jquery ui di halaman Anda.

function JsonDateFormate(dateFormate, jsonDateTime) {
    return $.datepicker.formatDate(dateFormate, eval('new ' + jsonDateTime.slice(1, -1)));
};
Thulasiram
sumber
0

Bukan untuk apa-apa, tapi ada cara lain. Pertama, buat kueri LINQ Anda. Lalu, buat kueri hasil yang dihitung dan terapkan jenis pemformatan apa pun yang cocok untuk Anda.

var query = from t in db.Table select new { t.DateField };
var result = from c in query.AsEnumerable() select new { c.DateField.toString("dd MMM yyy") };

Saya harus mengatakan, langkah ekstra itu menyebalkan, tetapi bekerja dengan baik.

skrile
sumber
0

Apa yang berhasil bagi saya adalah membuat model tampilan yang berisi properti tanggal sebagai string. Menetapkan properti DateTime dari model domain dan memanggil .ToString () pada properti date sambil menetapkan nilai ke viewmodel.

Hasil JSON dari metode tindakan MVC akan mengembalikan tanggal dalam format yang kompatibel dengan tampilan.

Lihat Model

public class TransactionsViewModel
{
    public string DateInitiated { get; set; }
    public string DateCompleted { get; set; }
}

Model Domain

public class Transaction{
   public DateTime? DateInitiated {get; set;}
   public DateTime? DateCompleted {get; set;}
}

Metode Aksi Pengendali

public JsonResult GetTransactions(){

var transactions = _transactionsRepository.All;
        var model = new List<TransactionsViewModel>();

        foreach (var transaction in transactions)
        {
            var item = new TransactionsViewModel
            {
                ...............
                DateInitiated = transaction.DateInitiated.ToString(),
                DateCompleted = transaction.DateCompleted.ToString(),
            };

            model.Add(item);
        }
        return Json(model, JsonRequestBehavior.AllowGet);
}
Oladipo Olasemo
sumber
0

Timpa pengontrol Json / JsonResult untuk mengembalikan JSON.Net:

Ini berhasil

Ian
sumber
0

Mengganggu, bukan?

Solusi saya adalah mengubah layanan WCF saya untuk mengembalikan DateTimes dalam format yang lebih mudah dibaca (non-Microsoft). Perhatikan di bawah ini, " UpdateDateOriginal", yang merupakan format tanggal WCF default, dan " UpdateDate" saya , yang diformat ke sesuatu yang lebih mudah dibaca.

masukkan deskripsi gambar di sini

Inilah cara melakukannya:

Mengubah format tanggal WCF

Semoga ini membantu.

Mike Gledhill
sumber
0

Saya menemukan ini sebagai cara termudah untuk mengubahnya dari sisi server.

using System.Collections.Generic;
using System.Web.Mvc;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Serialization;

namespace Website
{
    /// <summary>
    /// This is like MVC5's JsonResult but it uses CamelCase and date formatting.
    /// </summary>
    public class MyJsonResult : ContentResult
    {
        private static readonly JsonSerializerSettings Settings = new JsonSerializerSettings
        {
            ContractResolver = new CamelCasePropertyNamesContractResolver(),
            Converters = new List<JsonConverter> { new StringEnumConverter() }
        };

        public FindersJsonResult(object obj)
        {
            this.Content = JsonConvert.SerializeObject(obj, Settings);
            this.ContentType = "application/json";
        }
    }
}
Mohamed Fakhreddine
sumber
0

Saya memiliki sejumlah masalah dengan tanggal JSON dan memutuskan untuk menyingkirkan masalah dengan mengatasi masalah tanggal dalam SQL. Ubah format tanggal menjadi format string

select flddate from tblName

select flddate, convert(varchar(12), flddate, 113) as fldDateStr from tblName

Dengan menggunakan fldDateStr masalah menghilang dan saya masih bisa menggunakan bidang tanggal untuk menyortir atau keperluan lain.

Harry Binnendyk
sumber
0

Ini mengembalikan Format Tanggal Server. Anda perlu mendefinisikan fungsi Anda sendiri.

function jsonDateFormat(jsonDate) {
  // Changed data format;
  return (new Date(parseInt(jsonDate.substr(6)))).format("mm-dd-yyyy / h:MM tt");
};
Manish Kundu
sumber
0

Berikut adalah beberapa kode JavaScript yang saya tulis yang menetapkan <input type="date">nilai dari tanggal yang diteruskan dari ASP.NET MVC.

var setDate = function(id, d) {
  if (d !== undefined && d !== null) {
    var date = new Date(parseInt(d.replace("/Date(", "").replace(")/", ""), 10));
    var day = ('0' + date.getDate()).slice(-2);
    var month = ('0' + (date.getMonth() + 1)).slice(-2);
    var parsedDate = date.getFullYear() + "-" + (month) + "-" + (day);
    $(id).val(parsedDate);
  }
};

Anda memanggil fungsi ini seperti ini:

setDate('#productCommissionStartDate', data.commissionStartDate);

Di mana commissionStartDatetanggal JSON disahkan oleh MVC.

Pembuat Kode Suku
sumber
-1

Yang termudah:

var milisegundos = parseInt (data.replace ("/ Date (", "") .replace (") /", ""));
Var newDate = Tanggal baru (milisegundos). toLocaleDateString ("en-UE");

Kenlly Acosta
sumber