Формат дати ASP.NET MVC JsonResult


248

У мене є дія контролера, яка ефективно просто повертає JsonResult моєї моделі. Отже, у своєму методі я маю щось таке:

return new JsonResult(myModel);

Це добре працює, за винятком однієї проблеми. В моделі є властивість дати, і, здається, вона повертається в результаті Json таким чином:

"\/Date(1239018869048)\/"

Як я маю поводитися з датами, щоб вони повернулися у потрібному мені форматі? Або як я обробляю цей формат вище в сценарії?


Я опублікував свій чистий результат json до тієї ж проблеми, він перетворює дату в формат iso, що полегшує роботу. stackoverflow.com/questions/15778599/…
Kieran

Перегляньте це посилання нижче. Прямо вперед. stackoverflow.com/a/60392503/5962626
Mohamedasiq

Відповіді:


195

Просто для розширення відповіді casperOne .

Специфікація JSON не враховує значення дати. MS повинні були здійснити виклик, і шлях, який вони обрали, - це використати невелику хитрість у представленні javascript рядків: рядковий літерал "/" є таким же, як "\ /", і літеральний рядок ніколи не буде серіалізований до " \ / "(навіть" \ / "має бути відображено у" \\ / ").

Щоб отримати детальне пояснення, перегляньте сторінку http://msdn.microsoft.com/en-us/library/bb299886.aspx#intro_to_json_topic2 (прокрутіть униз до "Від літератури JavaScript до JSON")

Одним із болючих моментів JSON є відсутність прямої дати / часу. Багато людей дивуються і розчаровуються, коли дізнаються про це, коли вперше стикаються з JSON. Просте пояснення (супутнє чи ні) відсутності літералу дати / часу полягає в тому, що у JavaScript ніколи не було: Підтримка значень дати та часу в JavaScript повністю надається через об'єкт Date. Більшість додатків, що використовують JSON як формат даних, тому, як правило, використовують або рядок, або число для вираження значень дати та часу. Якщо використовується рядок, зазвичай можна очікувати, що вона буде у форматі ISO 8601. Якщо замість цього використовується число, то зазвичай це значення означає кількість мілісекунд у Універсальному координованому часі (UTC) з епохи, де епоха визначається як півночі 1 січня 1970 р. (UTC). Знову ж таки, це проста конвенція, а не частина стандарту JSON. Якщо ви обмінюєтесь даними з іншою програмою, вам потрібно буде перевірити її документацію, щоб побачити, як вона кодує значення дати та часу в прямому JSON. Наприклад, Microsoft ASP.NET AJAX Microsoft не використовує жодної з описаних умов. Скоріше, він кодує значення .NET DateTime як рядок JSON, де вміст рядка / Дата (тички) / і де тик - мілісекунди з моменту епохи (UTC). Тож 29 листопада 1989 р., 4:55:30 ранку, у UTC кодується як "\ / Дата (628318530718) \ /". NET AJAX не використовує жодної з описаних умов. Скоріше, він кодує значення .NET DateTime як рядок JSON, де вміст рядка / Дата (тички) / і де тик - мілісекунди з моменту епохи (UTC). Тож 29 листопада 1989 р., 4:55:30 ранку, у UTC кодується як "\ / Дата (628318530718) \ /". NET AJAX не використовує жодної з описаних умов. Скоріше, він кодує значення .NET DateTime як рядок JSON, де вміст рядка / Дата (тички) / і де тик - мілісекунди з моменту епохи (UTC). Тож 29 листопада 1989 р., 4:55:30 ранку, у UTC кодується як "\ / Дата (628318530718) \ /".

Рішенням буде просто розібрати його:

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

Однак я чув, що десь є налаштування, щоб змусити серіалізатор виводити DateTimeоб'єкти з new Date(xxx)синтаксисом. Я спробую це викопати.


Другий параметр JSON.parse()приймає reviverфункцію, де прописується, як значення, створене спочатку, перед поверненням.

Ось приклад дати:

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

Дивіться документи JSON.parse ()


1
Дякую, куди б пішов розбір?
Джон Арквей

Код, який я опублікував, - це JavaScript. Ви введете його у свій клієнтський код.
JPot

6
Ви можете скоротити js до нової дати (parseInt (dateString.replace (/ \ / дата \ ((\ d +) \) \ // gi, "$ 1")))
kͩeͣmͮpͥ ͩ

6
Насправді регулярний вираз є більш правильним, оскільки замінити (/ \ / Дата \ ((-? \ D +) \) \ // gi, "$ 1"), оскільки дата також може бути представлена ​​як -ве число
Dokie

1
@HarshilShah Це другий аргумент для parseInt(). Він повідомляє про функцію вилучення цілого числа в системі числення бази 10. Це радіація. Якщо ви помістите 8туди, це отримає восьмеричне число.
AnalogWeapon

99

Ось моє рішення в Javascript - дуже схоже на JPot, але коротше (і, можливо, крихітний трохи швидше):

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

"value.substr (6)" виймає частину "/ Date ("), а функція parseInt ігнорує символи без числа, які зустрічаються в кінці.

EDIT: Я навмисно пропустив радіус (другий аргумент для розбору); дивіться мій коментар нижче . Також зауважте, що дати ISO-8601 віддають перевагу цьому старому формату, тому цей формат, як правило, не слід використовувати для нових розробок. Дивіться чудову бібліотеку Json.NET, щоб отримати чудову альтернативу, яка серіалізує дати у форматі ISO-8601.

Для дат JSON у форматі ISO-8601 просто переведіть рядок у конструктор Date:

var date = new Date(jsonDate); //no ugly parsing needed; full timezone support

1
+1 Я прийняв ваше просте рішення і ввів його в рекурсивну функцію. Дивіться тут: danielsadventure.info/dotnetdatetime
Вівіан Рівер

7
Ви завжди повинні вказувати радіус при використанні parseInt. [Джерело]: developer.mozilla.org/en-US/docs/JavaScript/Reference/…
Джон Заброскі

6
@JohnZabroski: Кожне правило має свої винятки. Серіалізатор дати .NET ніколи не повертає цілі числа з провідними нулями, тому ми можемо сміливо залишати радіус.
Рой Тінкер

4
У нас було майже те саме. Ми використовували value.substr(6, 13)для видалення інших символів, що не належать до числа. Але якщо ви це зробите, усі дати ДО 26.04.1938 недійсні! Ми не знали, що parseIntбуде ігнорувати символи без числа. Дякую!
Ральф Янсен

2
@ JohnZabroski - parseIntслід ігнорувати провідні нулі станом на ECMAScript ed 5 (2011).
RobG

69

Відповіді на обробку клієнтської сторони досить багато, але ви можете змінити сторону вихідного сервера, якщо бажаєте.

Є кілька способів до цього підійти, я розпочну з основ. Вам доведеться підкласифікувати клас JsonResult і перекрити метод ExecuteResult. Звідти ви можете скористатися декількома різними підходами до зміни серіалізації.

Підхід 1: За замовчуванням реалізація використовує JsonScriptSerializer . Якщо ви подивитесь на документацію, ви можете скористатися методом RegisterConverters, щоб додати користувацькі JavaScriptConverters . Однак з цим є кілька проблем: JavaScriptConverter серіалізується до словника, тобто він бере об’єкт і серіалізується до словника Json. Для того, щоб змусити об'єкт серіалізувати на рядок, потрібно трохи хакерів, див. Пост . Цей конкретний хак також уникне рядку.

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

Підхід 2 (рекомендується): Другий підхід - почати з перекритого JsonResult і перейти з іншим серіалізатором Json, в моєму випадку - серіалізатором Json.NET . Для цього не потрібен хакерський підхід 1. Ось моя реалізація підкласу 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));
        }
    }
}

Приклад використання:

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

Додаткові кредити: Джеймс Ньютон-Кінг


А як щодо інших форматів, таких як грошові кошти, ідентифікаційні номери, телефон тощо? Чи не кращий підхід отримати ці формати від ModelMetadata та використовувати їх для серіалізації моделей до Json? Як?
Лучано

1
Це найкраще рішення (відповідь швидкопсувного Дейва). Сервер відповідає за надання правильного формату дати. Також користувальницький JsonResult дає набагато більше переваг та контролю. Я б запропонував застосувати допоміжний метод "CustomJson (дані)", який створює CustomJsonResult, оскільки існує "Json (дані)", який інстанціює JsonResult зі своїми даними.
спорт

2
Одне виправлення потрібно, якщо ви використовуєте будь-який з цих підходів - перший рядок повинен бути: private const string _dateFormat = "yyyy-MM-ddTHH: mm: ss"; Я додав "T".
Домінік

31

Moment.js - це велика бібліотека дат, яка також підтримує це. http://momentjs.com/docs/#/parsing/asp-net-json-dates/

наприклад: момент ("/ дата (1198908717056-0700) /")

Це може допомогти. вихід плункера


Перший Завантажити файл moment.js. Додайте у свій проект, ніж використовуйте, moment("json_date_string_value").format('appropriate format'); ви можете побачити різні значення формату на сторінці
momet.js

20

Я виявив , що створення нового JsonResultі повернення незадовільно - необхідність замінити всі виклики return Json(obj)з return new MyJsonResult { Data = obj }болем.


Тож я зрозумів, чому б не просто викрасти, JsonResultвикористовуючи 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));
            }
        }
    }
}

Це може бути застосовано до будь-якого методу, який повертає JsonResultна використання JSON.Net:

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

який відповість с

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

за бажанням!


Ви можете, якщо ви не заперечуєте викликати isпорівняння при кожному запиті, додати це до свого FilterConfig:

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

і весь ваш JSON тепер буде серіалізований за допомогою JSON.Net замість вбудованого JavaScriptSerializer.


Це єдина відповідь, яка забезпечує ґрунтовний підхід (може бути встановлений як глобальний або детальний) без дивного вкладеного javascript. Чи можу я внести пропозицію двічі?
T-moty

19

Використання jQuery для автоматичного перетворення дат із $.parseJSON

Примітка : ця відповідь надає розширення jQuery, яке додає автоматичну підтримку формату ISO і .net дати.

Оскільки ви використовуєте Asp.net MVC, я підозрюю, що ви використовуєте jQuery на стороні клієнта. Я пропоную вам прочитати цю публікацію в блозі з кодом, як використовувати $.parseJSONдля автоматичного перетворення дат для вас.

Код підтримує дати, відформатовані Asp.net, як ті, які ви згадали, так і дати, відформатовані ISO. Усі дати будуть автоматично відформатовані для вас, використовуючи $.parseJSON().


2
Спочатку я думав, що цей підхід працює дуже добре. (Див. Коментарі в кінці статті про те, як зареєструвати конвертер у $ .ajaxSetup ()) Однак, великим недоліком цього рішення є те, що він не підтримує дати до Epoc (1970) ..... тому тепер я вирішив просто відмовитися від файлів .asmx і перейти на WebAPI, який краще формати дат (використовуючи JSON.NET) і обійде всю цю проблему.
ClearCloud8

11

Комунікація Ajax між клієнтом і сервером часто включає дані у форматі JSON. Незважаючи на те, що JSON добре працює для рядків, чисел та булевих форматів, це може створювати певні труднощі для дат через те, як ASP.NET їх серіалізує. Оскільки для дат немає спеціального представлення, вони серіалізуються як звичайні рядки. Як рішення, механізм серіалізації за замовчуванням веб-форм ASP.NET і MVC серіалізує дати в спеціальній формі - / дата (тички) / - де тиків - кількість мілісекунд з 1 січня 1970 року.

Цю проблему можна вирішити двома способами:

сторона клієнта

Перетворіть отриманий рядок дати в число і створіть об’єкт дати, використовуючи конструктор класу дати з параметром галочки.

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

сторона сервера

У попередньому рішенні використовується сценарій на стороні клієнта для перетворення дати в об’єкт дати JavaScript. Ви також можете використовувати код на стороні сервера, який серіалізує екземпляри .NET DateTime у вибраному вами форматі. Для виконання цього завдання вам потрібно створити власний ActionResult, а потім серіалізувати дані так, як вам потрібно.

довідка: http://www.developer.com/net/dealing-with-json-dates-in-asp.net-mvc.html


7

У мене була така ж проблема, і замість повернення фактичного значення дати я просто використав на ній ToString ("dd MMM yyyy"). Потім у своєму JavaScript я використав новий Date (datevalue), де datevalue може бути "01 січня 2009".


1
Це повинно мати набагато більше результатів. Це принаймні так добре, як і найбільш прихильні. Трохи елегантніше, ніж рубати струни. Особисто я використовував це, але не відтворив об'єкт дати на передньому кінці, як мені просто потрібно було його відобразити, тому я просто відображав (трохи інакше) відформатовану рядок. Дякую за пораду, @Joe!
vbullinger

1
Це розриває розділення проблем, тобто ставить занепокоєння тим, як дата відображається на передньому кінці на задньому кінці. Але мені, це все-таки елегантніше.
А. Мюррей

1
Чому б не використати щось менш тендітне, як ToString("o")?
бінкі

"dd MMM yyyy" не підтримується ECMA-262, тому не слід очікувати, що вбудований аналізатор
розбере

3

Дивіться цю тему:

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

В основному, хоча Date()формат дійсний JavaScript, він НЕ дійсний JSON (є різниця). Якщо ви хочете старого формату, вам, ймовірно, доведеться створити фасад і трансформувати значення самостійно, або знайти спосіб отримати серіалізатор для вашого типу в JsonResultі використовувати його у власному форматі для дат.


Думаєте, ви мали на увазі "поки новий формат Date () дійсний JavaScript" [зверніть увагу на "нове" ключове слово]?
JPot

2

Не найвишуканіший спосіб, але це працювало для мене:

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

2

Я працюю над вирішенням цього питання, тому що жоден із вищезазначених відповідей мені не допоміг. Я працюю з календарем jquery тижня і мені потрібні мої дати, щоб мати інформацію про часовий пояс на сервері та локально на сторінці. Після трохи копання, я зрозумів рішення, яке може допомогти іншим.

Я використовую asp.net 3.5, порівняно з 2008 роком, asp.net MVC 2 та календар тижневих тижнів jquery,

По-перше, я використовую бібліотеку, написану Стівеном Левітаном, яка допомагає мати справу з датами на стороні клієнта, бібліотекою побачень Стівена Левітана . Формат isoUtcDateTime ідеально підходить для того, що мені потрібно. У своєму виклику jquery AJAX я використовую функцію форматування, надану бібліотеці з форматом isoUtcDateTime, і коли виклик ajax потрапляє на мій метод дії, тип часу date встановлюється на локальний і відображає час сервера.

Коли я надсилаю дати на свою сторінку через AJAX, я надсилаю їх у вигляді текстових рядків, форматуючи дати, використовуючи "ddd, dd MMM yyyy HH ':' mm ':' ss 'GMT'zzzz". Цей формат легко конвертується на стороні клієнта за допомогою

var myDate = new Date(myReceivedDate);

Ось моє повне рішення мінус джерело Стіва Левітана, яке ви можете завантажити:

Контролер:

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>

Я сподіваюся, що цей швидкий приклад допомагає іншим у тій же ситуації, в якій я був. Зараз, здається, це дуже добре працює з серіалізацією Microsoft JSON і підтримує правильність моїх дат у часових поясах.


Якщо ви можете вказати формат дати, то слід використовувати розширений ISO 8601, оскільки це єдиний формат, для якого потрібна підтримка ECMA-262.
RobG

2

Кращий спосіб обробляти дати в knockoutjs - це використовувати бібліотеку моментів і обробляти дати, як бос. Ви можете легко впоратися з датами на кшталт / дата (-62135578800000) /. Не потрібно турбуватися, як ваша серіалізація дати в контролері.

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

використовувати його як

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

momentjs підтримує безліч форматів часу дати та корисні функції на дати.


1

Відформатуйте дату в запиті.

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

Єдина проблема з цим рішенням полягає в тому, що ви не отримаєте жодних результатів, якщо БУДЬ-ЯКІ значення значень дати недійсні. Щоб обійти це, ви можете або помістити умовні висловлювання у свій запит ПЕРЕД, ніж ви виберете дату, яка ігнорує нульові дати, або ви можете встановити запит, щоб отримати всі результати, а потім перегляньте всю цю інформацію, використовуючи цикл foreach та призначте значення до всіх дат, які є НУЖИМИ, перш ніж ви зробите свій SELECT новий.

Приклад обох:

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

Другий варіант вимагає цілком іншого запиту, щоб ви могли призначити значення всім нулям. Це і цикл foreach повинен бути ПЕРЕД вашим запитом, який вибирає значення.

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

Просто ідея, яку я знайшов простіше, ніж усі приклади javascript.


1

Ви можете використовувати цей метод:

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

1

0

У вашому cshtml,

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

У вашому файлі JS, можливо, app.js,

Поза межами програми app.controller додайте наведений нижче фільтр.

Тут "mydate" - це функція, яку ви викликаєте для розбору дати. Тут "додаток" - це змінна, яка містить 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;
    };
});

Це дуже специфічно для angularjs, не всі люди його використовують, але це працювало для мене, дякую.
Lauro182

0

додати плагін jquery ui на свою сторінку.

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

0

Не дарма, але є інший шлях. Спочатку побудуйте свій LINQ-запит. Потім побудуйте запит перерахованого результату та застосуйте будь-який тип форматування для вас.

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

Треба сказати, зайвий крок дратує, але це працює чудово.


0

Що для мене працювало, це створити модель перегляду, яка містила б властивість дати у вигляді рядка. Призначення властивості DateTime з моделі домену та виклик .ToString () властивості date, призначаючи значення перегляду моделі.

Результат JSON методу дії MVC поверне дату у форматі, сумісному з представленням даних.

Переглянути модель

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

Модель домену

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

Метод дії контролера

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


0

Дратівливо, чи не так?

Моїм рішенням було змінити мій сервіс WCF, щоб він міг повернути DateTimes у більш читаному (не для Microsoft) форматі. Зауважте нижче, " UpdateDateOriginal", що є типовим форматом WCF дат, і моє " UpdateDate", яке відформатоване на щось більш читабельне.

введіть тут опис зображення

Ось як це зробити:

Зміна формату дати WCF

Сподіваюсь, це допомагає.


0

Я вважав, що це найпростіший спосіб змінити його сторону сервера.

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

0

У мене виникла низка проблем з датами JSON і я вирішив просто позбутися проблеми, вирішивши проблему дати в SQL. Змініть формат дати на строковий формат

select flddate from tblName

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

Використовуючи fldDateStr, проблема усунулася, і я все ще можу використовувати поле дати для сортування чи інших цілей.


0

Він повертає формат дати сервера. Потрібно визначити власну функцію.

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

0

Ось я написав код JavaScript, який встановлює <input type="date">значення з дати, переданої з 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);
  }
};

Ви називаєте цю функцію так:

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

Де commissionStartDateдата JSON, передана MVC.


-1

Найпростіший:

var milisegundos = parseInt (data.replace ("/ дата (", "") .replace (") /", ""));
Var newDate = нова дата (мілісегундо). toLocaleDateString ("en-UE");

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.