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


248

У меня есть действие контроллера, которое фактически просто возвращает JsonResult моей модели. Итак, в моем методе у меня есть что-то вроде следующего:

return new JsonResult(myModel);

Это работает хорошо, за исключением одной проблемы. В модели есть свойство date, и это, похоже, возвращается в результате Json следующим образом:

"\/Date(1239018869048)\/"

Как мне обращаться с датами, чтобы они возвращались в том формате, который мне нужен? Или как мне обработать этот формат выше в сценарии?


Я опубликовал свой результат в json net для той же проблемы, он конвертирует дату в формат iso, что облегчает работу с ним. stackoverflow.com/questions/15778599/…
Киран

Пожалуйста, посмотрите на эту ссылку ниже. Прямо вперед. stackoverflow.com/a/60392503/5962626
Мохамедасик

Ответы:


195

Просто чтобы расширить ответ КасперОна .

Спецификация 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 не использует ни одно из описанных соглашений. Скорее, он кодирует значения .NET DateTime в виде строки JSON, где содержимое строки равно / Date (ticks) / и где ticks представляет миллисекунды с начала эпохи (UTC). Поэтому 29 ноября 1989 года, 4:55:30 утра, в UTC кодируется как \ \ Date (628318530718) \ /. NET AJAX не использует ни одно из описанных соглашений. Скорее, он кодирует значения .NET DateTime в виде строки JSON, где содержимое строки равно / Date (ticks) / и где ticks представляет миллисекунды с начала эпохи (UTC). Поэтому 29 ноября 1989 года, 4:55:30 утра, в UTC кодируется как \ \ Date (628318530718) \ /. NET AJAX не использует ни одно из описанных соглашений. Скорее, он кодирует значения .NET DateTime в виде строки JSON, где содержимое строки равно / Date (ticks) / и где ticks представляет миллисекунды с начала эпохи (UTC). Поэтому 29 ноября 1989 года, 4:55:30 утра, в UTC кодируется как \ \ Date (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 (/ \ / Date \ ((\ d +) \) \ // gi, "$ 1")))
kͩeͣmͮpͥ ͩ

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

1
@HarshilShah Это второй аргумент в пользу parseInt(). Он говорит функции, чтобы извлечь целое число в базовой системе счисления 10. Это основа. Если вы вставите 8туда, он извлечет восьмеричное число.
AnalogWeapon

99

Вот мое решение в Javascript - очень похожее на JPot, но более короткое (и, возможно, чуть-чуть быстрее):

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

«value.substr (6)» убирает часть «/ Date (»), а функция parseInt игнорирует нечисловые символы, встречающиеся в конце.

РЕДАКТИРОВАТЬ: я намеренно пропустил основание (2-й аргумент для parseInt); см. мой комментарий ниже . Кроме того, обратите внимание, что даты 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"; Я добавил «Т».
Доминик

31

Moment.js - обширная библиотека datetime, которая также поддерживает это. 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 Web Forms и MVC сериализует даты в специальной форме - / Date (ticks) / - где ticks - это количество миллисекунд с 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 Date. Вы также можете использовать код на стороне сервера, который сериализует экземпляры .NET DateTime в выбранном вами формате. Для выполнения этой задачи вам нужно создать собственный ActionResult, а затем сериализовать данные так, как вы хотите.

ссылка: http://www.developer.com/net/dealing-with-json-dates-in-asp.net-mvc.html


7

У меня была та же проблема, и вместо того, чтобы возвращать фактическое значение даты, я просто использовал ToString ("dd MMM yyyy") для него. Затем в моем javascript я использовал новую дату (datevalue), где datevalue может быть «01 января 2009».


1
Это должно иметь гораздо больше голосов. Это по крайней мере так же хорошо, как большинство проголосовавших. Чуть более элегантно, чем рубить струны. Лично я использовал это, но не воссоздал объект даты во внешнем интерфейсе, поскольку мне просто нужно было отобразить его, поэтому я просто отобразил (немного иначе) отформатированную строку. Спасибо за совет, @Joe!
vbullinger

1
Это нарушает разделение задач, т. Е. Ставит вопрос о том, как дата отображается на переднем конце в конце. Но это еще элегантнее.
А. Мюррей

1
Почему бы не использовать что-то менее хрупкое, как ToString("o")?
Бинки

"dd MMM yyyy" не поддерживается ECMA-262, поэтому не стоит ожидать, что встроенный синтаксический анализатор его проанализирует
RobG

3

Смотрите эту тему:

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

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


Думаете, вы имели в виду «в то время как новый формат Date () является действительным javascript» [обратите внимание на ключевое слово «new»]?
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 затрагивает мой метод действия, тип datetime устанавливается на local и отражает время сервера.

Когда я отправляю даты на свою страницу через AJAX, я отправляю их в виде текстовых строк, форматируя даты с использованием «ddd, dd MMM гггг ЧЧ ':' мм ':' 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 - использовать библиотеку моментов и обрабатывать даты, как boss. Вы можете легко иметь дело с датами, такими как / Дата (-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» - это функция, которую вы вызываете для анализа даты. Здесь «app» - это переменная, которая содержит 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. Затем создайте запрос результата Enumerated и примените любой тип форматирования, который вам подходит.

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 ("/ Date (", "") .replace (") /", ""));
Var newDate = new Date (milisegundos). toLocaleDateString ("en-UE");

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.