Format daty ASP.NET MVC JsonResult

248

Mam działanie kontrolera, które skutecznie po prostu zwraca JsonResult mojego modelu. Tak więc w mojej metodzie mam coś takiego:

return new JsonResult(myModel);

Działa to dobrze, z wyjątkiem jednego problemu. W modelu znajduje się właściwość date, która wydaje się zwracana w wyniku Jsona w następujący sposób:

"\/Date(1239018869048)\/"

Jak powinienem postępować z datami, aby były one zwracane w wymaganym przeze mnie formacie? Lub jak obsłużyć ten format powyżej w skrypcie?

Jon Archway
źródło
Opublikowałem mój wynik json net z tym samym problemem, konwertuje datę na format ISO, dzięki czemu znacznie łatwiej jest pracować. stackoverflow.com/questions/15778599/…
Kieran
Proszę spojrzeć na poniższy link. Bezpośredni. stackoverflow.com/a/60392503/5962626
Mohamedasiq

Odpowiedzi:

195

Aby rozwinąć odpowiedź casperOne .

Specyfikacja JSON nie uwzględnia wartości daty. MS musiało zadzwonić, a wybraną przez nich ścieżką było wykorzystanie małej sztuczki w javascriptowej reprezentacji ciągów: literał łańcuchowy „/” jest taki sam jak „\ /”, a literał łańcuchowy nigdy nie zostanie zserializowany do „ \ / ”(nawet„ \ / ”należy zmapować na„ \\ / ”).

Aby uzyskać lepsze wyjaśnienie, zobacz http://msdn.microsoft.com/en-us/library/bb299886.aspx#intro_to_json_topic2 (przewiń w dół do „Od literałów JavaScript do JSON”)

Jednym z bolących punktów JSON jest brak literału daty / godziny. Wiele osób jest zaskoczonych i rozczarowanych, gdy dowiadują się o tym, kiedy po raz pierwszy spotykają JSON. Prostym wytłumaczeniem (pocieszającym lub nie) braku literału data / czas jest to, że JavaScript nigdy go nie miał: Obsługa wartości daty i godziny w JavaScript jest w całości zapewniona przez obiekt Date. Dlatego większość aplikacji używających JSON jako formatu danych zazwyczaj używa ciągów lub liczb do wyrażenia wartości daty i godziny. Jeśli zostanie użyty ciąg, ogólnie można oczekiwać, że będzie on w formacie ISO 8601. Jeśli zamiast tego zostanie użyta liczba, wówczas wartość zwykle oznacza liczbę milisekund w uniwersalnym czasie koordynowanym (UTC) od epoki, gdzie epoka jest definiowana jako północ 1 stycznia 1970 r. (UTC). Jeszcze raz, jest to zwykła konwencja i nie jest częścią standardu JSON. Jeśli wymieniasz dane z inną aplikacją, musisz sprawdzić jej dokumentację, aby zobaczyć, jak koduje wartości daty i godziny w literale JSON. Na przykład Microsoft ASP.NET AJAX nie korzysta z żadnej z opisanych konwencji. Zamiast tego koduje wartości .NET DateTime jako ciąg JSON, gdzie treść ciągu to / Date (tiki) / i gdzie tiki reprezentują milisekundy od epoki (UTC). Zatem 29 listopada 1989, 04:55:30 w UTC jest zakodowany jako „\ / Date (628318530718) \ /”. NET AJAX nie stosuje żadnej z opisanych konwencji. Zamiast tego koduje wartości .NET DateTime jako ciąg JSON, gdzie treść ciągu to / Date (tiki) / i gdzie tiki reprezentują milisekundy od epoki (UTC). Zatem 29 listopada 1989, 04:55:30 w UTC jest zakodowany jako „\ / Date (628318530718) \ /”. NET AJAX nie stosuje żadnej z opisanych konwencji. Zamiast tego koduje wartości .NET DateTime jako ciąg JSON, gdzie treść ciągu to / Date (tiki) / i gdzie tiki reprezentują milisekundy od epoki (UTC). Zatem 29 listopada 1989, 04:55:30 w UTC jest zakodowany jako „\ / Date (628318530718) \ /”.

Rozwiązaniem byłoby po prostu przeanalizować:

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

Jednak słyszałem, że istnieje ustawienie, w którym serializator może wypisywać DateTimeobiekty ze new Date(xxx)składnią. Spróbuję to wykopać.


Drugi parametr JSON.parse()akceptuje reviverfunkcję, w której określa, w jaki sposób wartość pierwotnie została wygenerowana, zanim zostanie zwrócona.

Oto przykład daty:

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;
});

Zobacz dokumentację JSON.parse ()

JPot
źródło
1
Dzięki, dokąd poszedłby parsowanie?
Jon Archway,
Kod, który opublikowałem, to JavaScript. Umieściłbyś to w kodzie klienta.
JPot
6
Możesz skrócić js do nowej daty (parseInt (dateString.replace (/ \ / Date \ ((\ d +) \) \ // gi, "$ 1")))
kͩeͣmͮpͥ ͩ
6
W rzeczywistości wyrażenie regularne jest bardziej poprawne, ponieważ zamień (/ \ / Date \ ((-? \ D +) \) \ // gi, „$ 1”), ponieważ data może być również reprezentowana przez liczbę -ve
Dokie
1
@HarshilShah To jest drugi argument za parseInt(). Mówi funkcji, aby wyodrębnić liczbę całkowitą w systemie liczbowym base 10. To podstawa. Jeśli 8tam wstawisz , wyodrębni to liczbę ósemkową.
AnalogWeapon
99

Oto moje rozwiązanie w Javascripcie - bardzo podobne do JPota, ale krótsze (i być może trochę szybsze):

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

„value.substr (6)” usuwa część „/ Date (”), a funkcja parseInt ignoruje znaki nienumeryczne występujące na końcu.

EDYCJA: Celowo pominąłem podstawkę (drugi argument do analizy); zobacz mój komentarz poniżej . Należy również pamiętać, że daty ISO-8601 są preferowane w stosunku do tego starego formatu - dlatego ten format zasadniczo nie powinien być używany do nowego programowania. Zobacz doskonałą bibliotekę Json.NET, która stanowi doskonałą alternatywę szeregowania dat przy użyciu formatu ISO-8601.

W przypadku dat JSON sformatowanych według ISO-8601 wystarczy przekazać ciąg do konstruktora daty:

var date = new Date(jsonDate); //no ugly parsing needed; full timezone support
Roy Tinker
źródło
1
+1 Wziąłem twoje proste rozwiązanie i wprowadziłem je w funkcję rekurencyjną. Zobacz tutaj: danielsadventure.info/dotnetdatetime
Vivian River
7
Zawsze powinieneś określać podstawę, gdy używasz parseInt. [Źródło]: developer.mozilla.org/en-US/docs/JavaScript/Reference/…
John Zabroski
6
@JohnZabroski: Każda reguła ma swoje wyjątki. Serializator dat .NET nigdy nie zwraca liczb całkowitych z wiodącymi zerami, więc możemy bezpiecznie pominąć podstawkę.
Roy Tinker
4
Mieliśmy prawie to samo. Używaliśmy value.substr(6, 13)do usuwania innych znaków nieliczbowych. Ale jeśli to zrobisz, wszystkie daty PRZED 26.04.1938 są nieprawidłowe! Nie wiedzieliśmy, parseIntże zignorujemy znaki nienumeryczne. Dzięki!
Ralph Jansen
2
@ JohnZabroski— parseIntpowinien ignorować wiodące zera od ECMAScript ed 5 (2011).
RobG
69

Istnieje wiele odpowiedzi, aby poradzić sobie z tym po stronie klienta, ale możesz zmienić stronę serwera wyjściowego, jeśli chcesz.

Można podejść do tego na kilka sposobów, zacznę od podstaw. Będziesz musiał podklasować klasę JsonResult i zastąpić metodę ExecuteResult. Następnie możesz zastosować kilka różnych metod zmiany serializacji.

Podejście 1: Domyślna implementacja używa JsonScriptSerializer . Jeśli spojrzysz na dokumentację, możesz użyć metody RegisterConverters, aby dodać niestandardowe JavaScriptConverters . Jest jednak kilka problemów: JavaScriptConverter serializuje do słownika, to znaczy, że pobiera obiekt i serializuje do słownika Json. Aby obiekt został przekształcony do postaci szeregowej w ciąg, wymaga nieco hakowania, patrz post . Ten konkretny hack również ucieknie od łańcucha.

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));
        }
    }
}

Podejście 2 (zalecane): Drugim podejściem jest rozpoczęcie od zastąpionego JsonResult i przejście do innego serializatora Json, w moim przypadku serializatora Json.NET . To nie wymaga hackery podejścia 1. Oto moja implementacja podklasy 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));
        }
    }
}

Przykład użycia:

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

Dodatkowe kredyty: James Newton-King

Nietrwały Dave
źródło
A co z innymi formatami, takimi jak pieniężne, numery identyfikacyjne, telefon i tak dalej? Czy nie jest lepszym podejściem do pobierania tych formatów z ModelMetadata i używania ich do serializacji modeli do Jsona? W jaki sposób ?
Luciano,
1
To najlepsze rozwiązanie (odpowiedź Perishable Dave). Serwer odpowiada za podanie prawidłowego formatu daty. Posiadanie niestandardowego JsonResult daje wiele więcej korzyści i kontroli. Proponuję zaimplementować metodę pomocniczą „CustomJson (dane)”, która tworzy instancję CustomJsonResult, ponieważ istnieje „Json (dane)”, która tworzy instancję JsonResult z jego danymi.
sport
2
Jeśli zastosujesz jedno z tych podejść, konieczna jest jedna korekta - pierwszy wiersz powinien brzmieć: private const string _dateFormat = "rrrr-MM-ddTHH: mm: ss"; Dodałem „T”.
Dominick
31

Moment.js to obszerna biblioteka datetime, która również to obsługuje. http://momentjs.com/docs/#/parsing/asp-net-json-dates/

np .: moment („/ Date (1198908717056-0700) /”)

To może pomóc. wyjście plunkera

Eric
źródło
Najpierw pobierz plik moment.js. Dodaj do projektu, niż użyj moment("json_date_string_value").format('appropriate format'); , możesz zobaczyć różne wartości formatu na stronie
momet.js
20

Okazało się, że tworząc nowy JsonResulti powrocie, że jest niezadowalająca - konieczności wymiany wszystkich połączeń do return Json(obj)z return new MyJsonResult { Data = obj }jest ból.


Pomyślałem więc, dlaczego nie po prostu porwać JsonResultużycie 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));
            }
        }
    }
}

Można to zastosować do dowolnej metody zwracającej JsonResultzamiast niej JSON.Net:

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

który odpowie

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

zgodnie z życzeniem!


Możesz, jeśli nie masz nic przeciwko wywoływaniu isporównania przy każdym żądaniu, dodaj to do FilterConfig:

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

a cały JSON będzie teraz serializowany za pomocą JSON.Net zamiast wbudowanego JavaScriptSerializer.

dav_i
źródło
Jest to jedyna odpowiedź, która zapewnia solidne podejście (może być ustawiona jako globalna lub szczegółowa) bez dziwnego wbudowanego javascript. Czy mogę głosować dwukrotnie?
T-moty
19

Używanie jQuery do automatycznego konwertowania dat za pomocą $.parseJSON

Uwaga : ta odpowiedź zawiera rozszerzenie jQuery, które dodaje automatyczną obsługę formatu daty ISO i .net.

Ponieważ używasz Asp.net MVC, podejrzewam, że używasz jQuery po stronie klienta. Sugeruję przeczytanie tego posta na blogu, który zawiera kod $.parseJSONumożliwiający automatyczne konwertowanie dat.

Kod obsługuje daty w formacie Asp.net, takie jak te, o których wspomniałeś, a także daty w formacie ISO. Wszystkie daty zostaną automatycznie sformatowane za pomocą $.parseJSON().

Robert Koritnik
źródło
2
Na początku myślałem, że to podejście działa bardzo dobrze. (Zobacz komentarze na końcu artykułu, jak zarejestrować konwerter w $ .ajaxSetup ()) Jednak dużym minusem tego rozwiązania jest to, że nie obsługuje on dat wcześniejszych niż Epoc (1970) ..... więc teraz mam postanowiłem po prostu zrezygnować z plików .asmx i przejść do interfejsu WebAPI, który lepiej formatuje daty (używając JSON.NET) i obejdzie wszystkie te problemy.
ClearCloud8
11

Komunikacja Ajax między klientem a serwerem często obejmuje dane w formacie JSON. Chociaż JSON działa dobrze dla ciągów, liczb i boolanów, może powodować pewne trudności dla dat ze względu na sposób serializacji ich przez ASP.NET. Ponieważ nie ma żadnej specjalnej reprezentacji dat, są one serializowane jako ciągi zwykłe. Jako rozwiązanie domyślny mechanizm serializacji ASP.NET Web Forms i MVC serializuje daty w specjalnej formie - / Date (tiki) / - gdzie tiki to liczba milisekund od 1 stycznia 1970 roku.

Ten problem można rozwiązać na 2 sposoby:

Strona klienta

Konwertuj otrzymany ciąg daty na liczbę i utwórz obiekt daty za pomocą konstruktora klasy daty z paskami jako parametrem.

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();
}

po stronie serwera

Poprzednie rozwiązanie używa skryptu po stronie klienta do konwersji daty na obiekt Date JavaScript. Można również użyć kodu po stronie serwera, który serializuje instancje .NET DateTime w wybranym formacie. Aby wykonać to zadanie, musisz utworzyć swój własny ActionResult, a następnie serializować dane tak, jak chcesz.

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

Mischa
źródło
7

Miałem ten sam problem i zamiast zwrócić rzeczywistą wartość daty, użyłem na nim ToString („dd MMM rrrr”). Następnie w moim javascript użyłem nowej daty (datevalue), gdzie wartością daty może być „01 stycznia 2009”.

Joe
źródło
1
To powinno mieć o wiele więcej pozytywnych opinii. Jest co najmniej tak dobry, jak te najbardziej uprzywilejowane. Nieco bardziej elegancki niż krojenie sznurków. Osobiście użyłem tego, ale nie odtworzyłem obiektu daty na interfejsie, ponieważ musiałem go tylko wyświetlić, więc po prostu wyświetliłem (nieco inaczej) sformatowany ciąg. Dzięki za wskazówkę, @Joe!
vbullinger
1
Przełamuje rozróżnienie między obawami, tj. Umieszcza troskę o to, jak data jest wyświetlana na przednim końcu z tyłu. Ale meh, to jest jeszcze bardziej eleganckie.
A. Murray,
1
Dlaczego nie użyć czegoś mniej delikatnego ToString("o")?
binki
„dd MMM rrrr” nie jest obsługiwany przez ECMA-262, więc nie należy oczekiwać, że wbudowany parser go przeanalizuje
RobG
3

Zobacz ten wątek:

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

Zasadniczo, chociaż Date()format jest prawidłowym skryptem javascript, NIE JEST to poprawny JSON (istnieje różnica). Jeśli chcesz mieć stary format, prawdopodobnie będziesz musiał stworzyć fasadę i samodzielnie przekształcić wartość lub znaleźć sposób na uzyskanie serializatora dla swojego typu w JsonResulti użycie niestandardowego formatu dat.

casperOne
źródło
Myślisz, że miałeś na myśli „gdy nowy format Date () jest prawidłowy javascript” [zwróć uwagę na „nowe” słowo kluczowe]?
JPot
2

Nie jest to najbardziej elegancki sposób, ale działało to dla mnie:

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
źródło
2

Pracowałem nad rozwiązaniem tego problemu, ponieważ żadna z powyższych odpowiedzi mi nie pomogła. Pracuję z kalendarzem tygodnia jquery i potrzebowałem, aby moje daty zawierały informacje o strefie czasowej na serwerze i lokalnie na stronie. Po dłuższym przekopaniu się wymyśliłem rozwiązanie, które może pomóc innym.

Korzystam z asp.net 3.5, vs 2008, asp.net MVC 2 i kalendarza tygodnia jquery,

Po pierwsze, korzystam z biblioteki napisanej przez Stevena Levithana, która pomaga radzić sobie z datami po stronie klienta, biblioteki dat Stevena Levithana . Format isoUtcDateTime jest idealny do tego, czego potrzebowałem. W moim wywołaniu AJAX jquery korzystam z funkcji formatowania dostarczonej z biblioteką w formacie isoUtcDateTime, a gdy wywołanie ajax trafia w moją metodę akcji, rodzaj datetime jest ustawiony na lokalny i odzwierciedla czas serwera.

Kiedy wysyłam daty na moją stronę za pośrednictwem AJAX, wysyłam je jako ciągi tekstowe, formatując daty przy użyciu „ddd, dd MMM rrrr GG:„ mm ”:„ ss ”GMT'zzzz”. Ten format można łatwo przekonwertować po stronie klienta

var myDate = new Date(myReceivedDate);

Oto moje kompletne rozwiązanie bez źródła Steve'a Levithana, które można pobrać:

Kontroler:

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>

Mam nadzieję, że ten szybki przykład pomoże innym w tej samej sytuacji, w której byłem. Wydaje się, że obecnie działa bardzo dobrze z serializacją JSON firmy Microsoft i utrzymuje prawidłowe daty w różnych strefach czasowych.

Jesse
źródło
Jeśli możesz określić format daty, powinieneś użyć rozszerzonej normy ISO 8601, ponieważ jest to jedyny format, którego wymaga obsługa ECMA-262.
RobG
2

Lepszym sposobem obsługi dat w knockoutjs jest użycie biblioteki momentów i obsługa dat takich jak boss. Możesz łatwo poradzić sobie z datami takimi jak / Date (-62135578800000) /. Nie musisz się martwić, w jaki sposób szeregujesz datę w kontrolerze.

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

użyj tego jak

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

momentjs obsługuje wiele formatów daty i funkcji narzędziowych w datach.

Ajay Kelkar
źródło
1

Sformatuj datę w zapytaniu.

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

Jedynym problemem związanym z tym rozwiązaniem jest to, że nie uzyskasz żadnych wyników, jeśli ŻADNA z wartości daty będzie zerowa. Aby obejść ten problem, możesz albo umieścić w zapytaniu instrukcje warunkowe, ZANIM wybierzesz datę, która ignoruje daty zerowe, lub możesz ustawić zapytanie, aby uzyskać wszystkie wyniki, a następnie przejrzeć wszystkie te informacje za pomocą pętli foreach i przypisać wartość do wszystkich dat, które są zerowe PRZED wykonaniem SELECT nowego.

Przykład obu:

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

Druga opcja wymaga całkowicie innego zapytania, aby można było przypisać wartości do wszystkich wartości null. Ta i pętla foreach musiałyby być PRZED zapytaniem, które wybiera wartości.

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");
                }
            }

Po prostu pomysł, który znalazłem łatwiejszy niż wszystkie przykłady javascript.

Czad
źródło
1

Możesz użyć tej metody:

String.prototype.jsonToDate = function(){
    try{
        var date;
        eval(("date = new " + this).replace(/\//g,''));
        return date;
    } 
    catch(e){
        return new Date(0);
    }
};
eladmat
źródło
1

0

W twoim cshtml

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

W twoim pliku JS, może app.js,

Poza app.controller dodaj poniższy filtr.

Tutaj „moja data” to funkcja, którą wywołujesz w celu analizy daty. Tutaj „aplikacja” jest zmienną zawierającą moduł kątowy

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
źródło
Jest to bardzo specyficzne dla angularjs, nie wszyscy go używają, ale to zadziałało dla mnie, dziękuję.
Lauro182
0

dodaj wtyczkę jquery ui na swojej stronie.

function JsonDateFormate(dateFormate, jsonDateTime) {
    return $.datepicker.formatDate(dateFormate, eval('new ' + jsonDateTime.slice(1, -1)));
};
Thulasiram
źródło
0

Nie na darmo, ale jest inny sposób. Najpierw zbuduj zapytanie LINQ. Następnie skonstruuj zapytanie Wyliczony wynik i zastosuj dowolny rodzaj formatowania, który działa dla Ciebie.

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") };

Muszę powiedzieć, że dodatkowy krok jest denerwujący, ale działa dobrze.

skrile
źródło
0

To, co zadziałało, to stworzenie viewmodel, który zawierałby właściwość date jako ciąg znaków. Przypisywanie właściwości DateTime z modelu domeny i wywoływanie funkcji .ToString () we właściwości date podczas przypisywania wartości do viewmodel.

Wynik JSON z metody akcji MVC zwróci datę w formacie zgodnym z widokiem.

Zobacz model

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

Model domeny

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

Metoda działania kontrolera

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
źródło
0

Irytujące, prawda?

Moim rozwiązaniem była zmiana usługi WCF, aby zwracała DateTimes w bardziej czytelnym (innym niż Microsoft) formacie. Zauważ poniżej „ UpdateDateOriginal”, który jest domyślnym formatem dat WCF, i mój „ UpdateDate”, który jest sformatowany na coś bardziej czytelnego.

wprowadź opis zdjęcia tutaj

Oto jak to zrobić:

Zmiana formatu daty WCF

Mam nadzieję że to pomoże.

Mike Gledhill
źródło
0

Uważam, że jest to najłatwiejszy sposób na zmianę tego po stronie serwera.

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
źródło
0

Miałem wiele problemów związanych z datami JSON i postanowiłem po prostu pozbyć się problemu, rozwiązując problem daty w SQL. Zmień format daty na ciąg znaków

select flddate from tblName

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

Używając fldDateStr problem zniknął i nadal mogłem używać pola daty do sortowania lub innych celów.

Harry Binnendyk
źródło
0

Zwraca format daty serwera. Musisz zdefiniować własną funkcję.

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

Oto kod JavaScript, który napisałem, który ustawia <input type="date">wartość z daty przekazanej z 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);
  }
};

Nazywasz tę funkcję tak:

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

Gdzie commissionStartDatejest data JSON przekazana przez MVC.

Tribal Coder
źródło
-1

Najłatwiejszy:

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

Kenlly Acosta
źródło