Дата Данные не отображаются правильно [dублировать]

Это вызов operator = (char ch) - мой отладчик вступил в это. И мой MS VS 2005 компилируется следующим образом без ошибок.

  std :: string my_string ("");  unsigned int my_number = 1234;  my_string = my_number;  my_string.operator = (my_number);   
202
задан JustinStolle 13 March 2011 в 08:18
поделиться

19 ответов

Раздражает, не так ли?

Мое решение состояло в том, чтобы изменить мою службу WCF, чтобы вернуть DateTimes в более читаемый (не Microsoft) формат. Обратите внимание, что « UpdateDateOriginal », который является форматом дат по умолчанию для WCF, и моим « UpdateDate », который отформатирован на что-то более читаемое.

]

Вот как это сделать:

Изменение формата даты WCF

Надеюсь, это поможет.

174
ответ дан Community 15 August 2018 в 23:28
поделиться
  • 1
    Спасибо, где бы прошел синтаксический анализ? – Jon Archway 8 April 2009 в 16:44
  • 2
  • 3
    На самом деле регулярное выражение является более правильным в качестве замены (/ \ / Date \ ((-? \ D +) \) \ // gi, "$ 1"), так как дата может быть представлена ​​как a -ve number too – Dokie 8 December 2009 в 17:47
  • 4
    Выглядит уродливо, но нет лучшего способа. – RredCat 29 March 2011 в 08:44
  • 5
    +1 Я принял ваше простое решение и поставил его в рекурсивную функцию. См. Здесь: danielsadventure.info/dotnetdatetime – Daniel Allen Langdon 28 July 2012 в 04:17
  • 6
    При использовании parseInt вы всегда должны указывать радиус. [Источник]: developer.mozilla.org/en-US/docs/JavaScript/Reference/… – John Zabroski 28 April 2013 в 03:10
  • 7
    @JohnZabroski: У каждого правила есть свои исключения. Сериализатор .NET date never возвращает целые числа с ведущими нулями, поэтому мы можем спокойно исключить основание. – Roy Tinker 29 April 2013 в 19:40
  • 8
    У нас было почти то же самое. Мы использовали value.substr (6, 13) для удаления других несимвольных символов. Но если вы это сделаете, все даты до 26.04.1938 недействительны! Мы не знали, что parseInt игнорирует символы с номерами. Благодаря! – Ralph Jansen 24 June 2014 в 14:20
  • 9
    @HarshilShah Это второй аргумент для parseInt () . Он сообщает функции для извлечения целого числа в системе счисления в базе 10. Это радикс. Если вы поместите 8 туда, он будет извлекать восьмеричное число. – AnalogWeapon 4 January 2017 в 21:20
  • 10
    @ JohnZabroski- parseInt должен игнорировать ведущие нули на ECMAScript ed 5 (2011). – RobG 28 April 2017 в 22:46

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

  function jsonToDate (дата, формат) {return moment (date) .format (format);  }  

использовать его как

  var formattedDate = jsonToDate (дата, 'MM / DD / YYYY')  

] momentjs поддерживает множество форматов дат и функций полезности в датах.

2
ответ дан Ajay Kelkar 15 August 2018 в 23:28
поделиться

Moment.js - обширная библиотека datetime, которая также поддерживает это. http://momentjs.com/docs/#/parsing/asp-net-json-dates/

ex: moment ("/ Date (1198908717056-0700) /" )

Это может помочь. вывод plunker

28
ответ дан Anil Singh 15 August 2018 в 23:28
поделиться
  • 1
    Это был лучший ответ для меня. Я уже использую момент. – Sergio Flores 29 October 2015 в 20:21
  • 2
    Сначала загрузите файл moment.js. Добавьте в свой проект, чем используйте момент («json_date_string_value»). Format («соответствующий формат»); вы можете видеть разные значения формата на странице momet.js – Harshil Shah 26 May 2016 в 06:55

См. эту тему:

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

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

4
ответ дан casperOne 15 August 2018 в 23:28
поделиться
  • 1
    Думайте, что вы имели в виду & quot;, в то время как новый формат Date () действителен javascript & quot; [отметить "новый" ключевое слово]? – JPot 7 April 2009 в 18:22

Отформатируйте дату в запросе.

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

Единственная проблема с этим решением заключается в том, что вы не получите никаких результатов, если ANY из значений даты равно null. Чтобы обойти это, вы можете либо поставить условные операторы в свой запрос, прежде чем вы выбираете дату, которая игнорирует дату null, или вы можете настроить запрос для получения всех результатов, а затем пропустить всю эту информацию с помощью цикла foreach и присвоить значение ко всем датам, которые являются нулевыми до того, как вы сделаете свой новый SELECT.

Пример обоих:

  var _test = from _t в adc.ItemSearchTest (слово), где _t.Date! = null select new {date = ((DateTime) _t  .Date) .ToShortDateString ()};   

Второй вариант требует другого запроса, поэтому вы можете назначать значения для всех нулей. Это и цикл foreach должны быть перед вашим запросом, который выбирает значения.

  var _testA = from _t в adc.ItemSearchTest (word) select _i;  foreach (var detail in _testA) {if (detail.Date == null) {detail.Date = Convert.ToDateTime ("1/1/0001");  }}  

Просто идея, которую я нашел легче, чем все примеры javascript.

1
ответ дан Chad 15 August 2018 в 23:28
поделиться

Я обнаружил, что создание нового JsonResult и возвращение неудовлетворительного - замена всех вызовов на возвращает Json (obj) с возвратом нового MyJsonResult {Data = obj} - боль.


Итак, я понял, почему бы не просто захватить JsonResult с помощью ActionFilter : [ ! d14]

  public class JsonNetFilterAttribute: ActionFilterAttribute {public override void OnActionExecuted (ActionExecutedContext filterContext) {if (filterContext.Result - JsonResult == false) {return;  } filterContext.Result = новый фильтр JsonNetResult ((JsonResult )Context.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) {if (context == null) {throw new ArgumentNullException ("context");  } var isMethodGet = string.Equals (context.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase);  if (this.JsonRequestBehavior == JsonRequestBehavior.DenyGet & amp; isMethodGet) {throw new InvalidOperationException ("GET не разрешено! Изменить JsonRequestBehavior для 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)}  

, который будет отвечать [ ! d16]

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

по желанию!


Вы можете, если не возражать, что сравнивает при каждом запросе, добавьте это в свой FilterConfig :

  // ... filters.Add (новый JsonNetFilterAttribute ());   

, и все ваши JSON теперь будут сериализованы с помощью JSON.Net вместо встроенного JavaScript-скрипта .

11
ответ дан dav_i 15 August 2018 в 23:28
поделиться

Вы можете использовать этот метод:

  String.prototype.jsonToDate = function () {try {var date;  eval (("date = new" + this) .replace (/ \ // g, ''));  Дата возврата;  } catch (e) {return new Date (0);  }};   
1
ответ дан eladmat 15 August 2018 в 23:28
поделиться

Не самый элегантный способ, но это сработало для меня:

  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";  // находим время, если (час & gt; = 12) {time = "PM";  } // фиксирует формат часов, если (час & gt; 12) {hour - = 12;  } else if (hour == 0) {hour = 12;  } // фиксирует формат минут if (mins.length == 1) {mins = "0" + mins;  } // return formatted date time string return date.getMonth () + 1 + "/" + date.getDate () + "/" + date.getFullYear () + "" + hour + ":" + mins + ""  + время;  }  
2
ответ дан Gabe 15 August 2018 в 23:28
поделиться

Для обработки клиентской части существует довольно много ответов, но вы можете изменить выходную серверную сторону, если хотите.

Есть несколько способов приблизиться к этому, я начну с основы. Вам придется подклассифицировать класс JsonResult и переопределить метод ExecuteResult. Оттуда вы можете использовать несколько разных подходов для изменения сериализации.

Подход 1: Реализация по умолчанию использует JsonScriptSerializer . Если вы посмотрите на документацию, вы можете использовать метод RegisterConverters для добавления пользовательских JavaScriptConverters . Есть несколько проблем с этим: JavaScriptConverter сериализуется в словаре, то есть он берет объект и сериализуется в Json-словаре. Чтобы сделать сериализацию объекта строкой, он требует немного хакерства, см. [D2] post .

  public class CustomJsonResult: JsonResult {private const string _dateFormat = "yyyy-MM-dd HH: mm: ss";  public override void ExecuteResult (Контекст ControllerContext) {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 = новый JavaScriptSerializer ();  // Используйте свой подклассу JavaScriptConverter здесь.  serializer.RegisterConverters (новый JavascriptConverter [] {новый CustomConverter});  Response.Write (serializer.Serialize (данные));  }}}  

Подход 2 (рекомендуется): Второй подход - начать с переопределенного JsonResult и перейти с другим сериализатором Json, в моем случае Json.NET сериализатор. Это не требует взлома подхода 1. Вот моя реализация подкласса JsonResult:

  public class CustomJsonResult: JsonResult {private const string _dateFormat = "yyyy-MM-dd HH: mm  : сс ";  public override void ExecuteResult (Контекст ControllerContext) {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) {// Использование сериализатора Json.NET var isoConvert = new IsoDateTimeConverter ();  isoConvert.DateTimeFormat = _dateFormat;  response.Write (JsonConvert.SerializeObject (данные, isoConvert));  }}}  

Пример использования:

  [HttpGet] public ActionResult Index () {return new CustomJsonResult {Data = new {users = db.Users.  К списку();  }};  }  

Дополнительные кредиты: Джеймс Ньютон-Кинг

55
ответ дан JJS 15 August 2018 в 23:28
поделиться
  • 1
    А как насчет других форматов, таких как денежные, идентификационные номера, телефон и т. Д.? Не лучше ли получить эти форматы из ModelMetadata и использовать их для сериализации моделей для Json? Как ? – Luciano 13 April 2012 в 23:10
  • 2
    Это лучшее решение (ответ скоропортящихся Дейв). Сервер отвечает за предоставление правильного формата даты. Также наличие пользовательского JsonResult дает больше преимуществ и контроля. Я бы предложил реализовать вспомогательный метод «CustomJson (data)», который создает экземпляр CustomJsonResult, поскольку существует «Json (data)», который создает JsonResult с его данными. – sports 5 June 2014 в 19:07
  • 3
    Одна коррекция необходима, если вы используете любой из этих подходов - первая строка должна быть: private const string _dateFormat = & quot; yyyy-MM-ddTHH: mm: ss "; Я добавил «T». – Dominick 2 February 2016 в 21:33
7
ответ дан Joe 15 August 2018 в 23:28
поделиться

Самый простой:

var milisegundos = parseInt (data.replace ("/ Date (", "") .replace (") /", "")); Var newDate = новая дата (milisegundos) .toLocaleDateString ("en-UE");

-1
ответ дан Kenlly Acosta 15 August 2018 в 23:28
поделиться

Он возвращает формат даты сервера. Вы должны определить свою собственную функцию.

  function jsonDateFormat (jsonDate) {// Изменен формат данных;  return (новая дата (parseInt (jsonDate.substr (6)))). format ("mm-dd-yyyy / h: MM tt");   

};

0
ответ дан Manish Kundu 15 August 2018 в 23:28
поделиться

Связь Ajax между клиентом и сервером часто включает данные в формате JSON. В то время как JSON хорошо работает для строк, чисел и логических значений, он может создавать определенные трудности для дат из-за того, как они преобразуются в ASP.NET. Поскольку у них нет специального представления для дат, они сериализуются как простые строки. В качестве решения механизм сериализации по умолчанию ASP.NET Web Forms и MVC сериализует даты в специальной форме - / Date (ticks) / - где тики - это количество миллисекунд с 1 января 1970 года.

Эта проблема может быть решена двумя способами:

клиентская сторона

Преобразование полученной строки даты в число и создание объекта даты с использованием конструктора класса даты с параметрами тиков как параметр. [ ! d5]

  function ToJavaScriptDate (значение) {var pattern = / Date \ (([^)] +) \) /;  var results = pattern.exec (значение);  var dt = new Date (parseFloat (результаты [1]));  return (dt.getMonth () + 1) + "/" + dt.getDate () + "/" + dt.getFullYear ();   

}

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

В предыдущем решении используется сценарий на стороне клиента для преобразования даты в объект JavaScript Date. Вы также можете использовать код на стороне сервера, который сериализует экземпляры .NET DateTime в выбранном вами формате. Для выполнения этой задачи вам необходимо создать свой собственный ActionResult и затем сериализовать данные так, как вы хотите.

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

11
ответ дан Mischa 15 August 2018 в 23:28
поделиться
  • 1
    Хотя эта ссылка может ответить на вопрос, лучше включить здесь основные части ответа и предоставить ссылку для справки. Ответные ссылки могут стать недействительными, если связанная страница изменится. – Taifun 10 October 2014 в 16:10
  • 2
    Спасибо за информацию, я сделаю это. – Mischa 10 October 2014 в 16:20

Что для меня работало, так это создать модель представления, содержащую свойство date в виде строки. Присвоение свойства DateTime из модели домена и вызов .ToString () в свойстве date при назначении значения в viewmodel.

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

Просмотреть модель

  public class TransactionsViewModel {public string DateInitiated {get;  задавать;  } public string DateCompleted {get;  задавать;  }}  

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

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

Метод действия контроллера

  public JsonResult GetTransactions () {var transaction = _transactionsRepository.All;  var model = new List & lt; TransactionsViewModel & gt; ();  foreach (транзакция var в транзакциях) {var item = new TransactionsViewModel {............... DateInitiated = transaction.DateInitiated.ToString (), DateCompleted = transaction.DateCompleted.ToString (),}  ;  model.Add (пункт);  } return Json (модель, JsonRequestBehavior.AllowGet);  }  
0
ответ дан Oladipo Olasemo 15 August 2018 в 23:28
поделиться

Использование jQuery для автоматического преобразования дат с помощью $. parseJSON

Примечание : этот ответ предоставляет расширение jQuery, которое добавляет автоматический ISO и .net.

Поскольку вы используете Asp.net MVC, я подозреваю, что вы используете jQuery на стороне клиента. Я предлагаю вам прочитать это сообщение в блоге , в котором есть код, как использовать $. ParseJSON для автоматического преобразования дат для вас.

Код поддерживает формат Asp.net даты, подобные тем, которые вы упомянули, а также даты в формате ISO. Все даты будут автоматически отформатированы для вас с помощью $. ParseJSON () .

19
ответ дан Robert Koritnik 15 August 2018 в 23:28
поделиться
  • 1
    Сначала я подумал, что этот подход работает очень хорошо. (См. Комментарии в конце статьи о том, как зарегистрировать конвертер в $ .ajaxSetup ()) Однако большой недостаток этого решения заключается в том, что он не поддерживает даты до Epoc (1970) ..... так что теперь я решил просто отказаться от .asmx-файлов и переключиться на WebAPI, который лучше форматирует даты (используя JSON.NET) и обойдет все эти проблемы. – ClearCloud8 30 January 2014 в 00:10
  • 2
    Это должен быть комментарий, это не ответ. – RobG 27 April 2017 в 22:36
2
ответ дан roryf 15 August 2018 в 23:28
поделиться
0
ответ дан skrile 15 August 2018 в 23:28
поделиться

добавить jquery ui плагин на вашей странице.

  function JsonDateFormate (dateFormate, jsonDateTime) {return $ .datepicker.formatDate (dateFormate, eval ('new' + jsonDateTime.slice (1,  -1)));  };   
0
ответ дан Thulasiram 15 August 2018 в 23:28
поделиться

Вот код JavaScript, который я написал, который устанавливает значение & lt; input type = "date" & gt; из даты, переданной из ASP.NET MVC.

   var setDate = function (id, d) {if (d! == undefined & amp; & amp; d! == null) {var date = new Date (parseInt (d.replace ("/ Date (", "").  заменить (") /", ""), 10));  var day = ('0' + date.getDate ()). slice (-2);  var month = ('0' + (date.getMonth () + 1)). slice (-2);  var parsedDate = date.getFullYear () + "-" + (месяц) + "-" + (день);  $ (Идентификатор) .val (parsedDate);  }};   

Вы вызываете эту функцию следующим образом:

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

Где CommissionStartDate - дата JSON, переданная MVC.

0
ответ дан Tribal Coder 15 August 2018 в 23:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: