Как мне отформатировать дату Microsoft JSON?

Я беру свой первый кряк в Ajax с помощью jQuery. Я получаю свои данные на свою страницу, но у меня возникают проблемы с данными JSON, которые возвращаются для типов данных Date. По сути, я получаю строку, которая выглядит следующим образом:

/Date(1224043200000)/

От кого-то совершенно нового для JSON - Как мне отформатировать это в короткий формат даты? Должно ли это быть обработано где-то в коде jQuery? Я пытался использовать jQuery.UI.datepickerплагин $.datepicker.formatDate()без какого-либо успеха.

К вашему сведению: вот решение, которое я придумал, используя комбинацию ответов здесь:

function getMismatch(id) {
  $.getJSON("Main.aspx?Callback=GetMismatch",
    { MismatchId: id },

    function (result) {
      $("#AuthMerchId").text(result.AuthorizationMerchantId);
      $("#SttlMerchId").text(result.SettlementMerchantId);
      $("#CreateDate").text(formatJSONDate(Date(result.AppendDts)));
      $("#ExpireDate").text(formatJSONDate(Date(result.ExpiresDts)));
      $("#LastUpdate").text(formatJSONDate(Date(result.LastUpdateDts)));
      $("#LastUpdatedBy").text(result.LastUpdateNt);
      $("#ProcessIn").text(result.ProcessIn);
    }
  );

  return false;
}

function formatJSONDate(jsonDate) {
  var newDate = dateFormat(jsonDate, "mm/dd/yyyy");
  return newDate;
}

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

15.10.2008 20:43:41
Это может быть интересно: hanselman.com/blog/…
citronas 16.03.2012 10:32:01
Формат /Date(...)/ специфичен для встроенного в Microsoft формата даты JSON - он не является частью какого-либо стандарта, а JSON, происходящий из Javascript, имеет стандарт: в формате ISO Javascript указывает: stackoverflow.com/a / 15952652/176877 Итак, этот вопрос относится к формату Microsoft JSON Date. Я изменил название, чтобы уточнить это.
Chris Moschini 23.06.2014 07:48:42
Ты шутишь! Microsoft сделала свой собственный штамп на JSON! и на свиданиях !! Когда они будут учиться!
Nick.McDermaid 2.02.2016 12:31:45
Используйте Newtonsoft JSON на стороне .NET и, чтобы иметь хорошие типизированные значения на стороне JS, просто используйте: github.com/RickStrahl/json.date-extensions
baHI 11.05.2017 16:54:01
Вы можете использовать JSON ++ вместо JSON. JSON ++ такой же, как JSON, но с поддержкой таких типов JavaScript, как Date.
brillout 14.11.2018 11:06:40
30 ОТВЕТОВ
РЕШЕНИЕ

eval()не обязательно. Это будет хорошо работать:

var date = new Date(parseInt(jsonDate.substr(6)));

substr()Функция вынимает /Date(часть, а parseInt()функция получает целое число и игнорирует )/в конце. Полученный номер передается в Dateконструктор.


Я намеренно пропустил основание (второй аргумент parseInt); см. мой комментарий ниже .

Кроме того, я полностью согласен с комментарием Рори : даты ISO-8601 предпочтительнее этого старого формата, поэтому этот формат обычно не следует использовать для новых разработок. Посмотрите превосходную библиотеку Json.NET для отличной альтернативы, которая сериализует даты, используя формат ISO-8601.

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

var date = new Date(jsonDate); //no ugly parsing needed; full timezone support
1677
29.05.2019 17:40:28
@Broam: оба метода (функция замены и этот ответ) должны были бы измениться, если MS изменяет формат.
Roy Tinker 25.08.2010 16:11:52
Не могли бы вы обновить его с помощью radix var date = new Date (parseInt (jsonDate.substr (6), 10));
James Kyburz 25.04.2012 05:25:21
@JamesKyburz: Каждое правило имеет исключения, и я думаю, что это когда исключение применяется. Числа даты JSON из .NET никогда не имеют начального «0», поэтому мы можем смело опускать основание.
Roy Tinker 20.12.2012 17:49:53
Стоит отметить, что этот формат даты довольно плохой, и общий переход - это даты в формате JSON в формате ISO-8601. См. Hanselman.com/blog/…
Rory 28.01.2013 11:20:40
Этот подход не учитывает часовой пояс, поэтому может вызвать серьезные проблемы, когда ваш сервер и пользователи находятся в разных часовых поясах. Ниже я опубликовал ответ, который объясняет очень быстрый и простой способ справиться с ним на сторонах WCF и Javascript: stackoverflow.com/a/10743718/51061
Scott Willeke 8.05.2013 17:45:54

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

26
15.10.2008 20:46:51
Это неправильно, JSON использует даты Javascript с добавленной информацией о часовом поясе - эпоха совпадает с эпохой класса Date в JavaScript (по понятным причинам).
BrainSlugs83 13.07.2012 04:48:24
@ BrainSlug83 - этот ответ содержит ссылку на утверждение о том, что JSON не имеет встроенного типа даты. Если вы не согласны, пожалуйста, предоставьте альтернативную ссылку. (Вы не думаете о конкретной среде, которая определила строковый формат для представления дат, не так ли? Это не является частью стандарта JSON, на самом деле это не может быть, потому что это сделает невозможным включение строки, которая не является предполагается, что это дата, но в ней есть набор символов, соответствующих шаблону даты.)
nnnnnn 11.04.2013 11:07:32

Если вы говорите в JavaScript,

var thedate = new Date(1224043200000);
alert(thedate);

вы увидите, что это правильная дата, и вы можете использовать ее в любом месте кода JavaScript с любым фреймворком.

62
16.05.2016 13:55:45
Я бы тоже так подумал, за исключением того, что это: var thedate = / Date (1224043200000) /; по крайней мере для меня ...
rball 3.12.2009 03:38:35
Date () и Date (1224043200000) дают одинаковый результат как в Chrome, так и в Firefox. Не уверен, что это работает в старых браузерах, но этот ответ не работает в браузерах сейчас.
James 12.09.2011 19:21:52
@James, да это даёт браузеру текущую дату. :(
vissu 7.03.2012 08:24:24
Вам нужно написать это как «новая дата (1224043200000)».
BrainSlugs83 13.07.2012 04:38:57

Вы можете использовать это, чтобы получить дату из JSON:

var date = eval(jsonDate.replace(/\/Date\((\d+)\)\//gi, "new Date($1)"));

И затем вы можете использовать сценарий формата даты JavaScript (1,2 КБ при минимизации и сжатии), чтобы отобразить его, как вы хотите.

132
9.11.2014 10:16:37
В строке нет ничего плохого, последовательность \ //. Первый слеш экранируется, поэтому он не считается комментарием. Это ваш редактор обманывает вас, строка будет работать нормально.
andreialecu 27.08.2009 15:19:12
@rball, ерунда:jsonDate = new Date(+jsonDate.replace(/\/Date\((\d+)\)\//, '$1'));
eyelidlessness 19.01.2010 05:02:03
pst был верен, это можно сделать разными способами без 'eval'. Крокфорд говорит, что «eval Is Evil», потому что он менее читабелен и менее безопасен, более того, он может также предположить, что он менее эффективен и более опасен, потому что попадает в компилятор javascript.
Mark Rogers 25.02.2010 15:43:58
@Edy: new Functionпочти так же плохо, как eval: dev.opera.com/articles/view/efficient-javascript/…
Marcel Korpel 21.09.2010 11:55:12
@Edy: Это еще одна форма eval, и она такая же «злая». Вместо этого разберите строку (см. Мой ответ ниже)
Roy Tinker 23.06.2011 21:15:59

Ваш JSON, вероятно, должен возвращать какой-либо объект (ну, его строковое представление).

"{ myDate : Date(1224043200000) }"

Используя jQuery, вы можете получить доступ к вашему объекту данных следующим образом:

$.get(
    "myJSONFile.php",
    function (data) {
        // data.myDate will be a date object.

        // to show in a short date format (eg: dd/mm/yyyy)
        alert (
            data.myDate.getDate() + "/"
            + (data.myDate.getMonth() + 1) + "/"
            + data.myDate.getFullYear()
        ); // alerts: "15/10/2008"
    }
);
-5
16.10.2008 03:47:12

Проверьте дату стандарта ISO; вроде как это:

yyyy.MM.ddThh:mm

Это становится 2008.11.20T22:18.

9
9.11.2014 10:17:34
Согласно схеме JSON, формат «дата-время» соответствует RFC 3339, раздел 5.6. Таким образом, вы должны написать «гггг-ММ-ддТЧЧ: мм: ссЗ» для дат в GMT или Z, замененный на часовой пояс, такой как + чч: мм.
gnasher729 11.04.2014 15:53:14
Проблема в том, что WCF и другие «старые» сериализации MS JSON не используют этот формат, и это необходимо учитывать.
Marc L. 19.10.2018 14:50:11
var newDate = dateFormat(jsonDate, "mm/dd/yyyy"); 

Есть ли другой вариант без использования библиотеки jQuery?

16
9.11.2014 10:18:12
Это новый вопрос, и его следует задавать как отдельный вопрос, а не здесь.
Spencer Sullivan 4.06.2019 17:59:10

В итоге я добавил символы "в регулярное выражение Panos, чтобы избавиться от символов, сгенерированных сериализатором Microsoft для записи объектов во встроенный скрипт:

Так что если у вас есть свойство в вашем коде C # это что-то вроде

protected string JsonObject { get { return jsSerialiser.Serialize(_myObject); }}

И в вашем aspx у вас есть

<script type="text/javascript">
    var myObject = '<%= JsonObject %>';
</script>

Вы получите что-то вроде

var myObject = '{"StartDate":"\/Date(1255131630400)\/"}';

Обратите внимание на двойные кавычки.

Чтобы получить это в форме, которую eval будет правильно десериализовать, я использовал:

myObject = myObject.replace(/"\/Date\((\d+)\)\/"/g, 'new Date($1)');

Я использую Prototype и для его добавления я добавил

String.prototype.evalJSONWithDates = function() {
    var jsonWithDates = this.replace(/"\/Date\((\d+)\)\/"/g, 'new Date($1)');
    return jsonWithDates.evalJSON(true);
}
24
9.11.2014 10:20:25

Поздний пост, но для тех, кто искал этот пост.

Вообразите это:

    [Authorize(Roles = "Administrator")]
    [Authorize(Roles = "Director")]
    [Authorize(Roles = "Human Resources")]
    [HttpGet]
    public ActionResult GetUserData(string UserIdGuidKey)
    {
        if (UserIdGuidKey!= null)
        {
            var guidUserId = new Guid(UserIdGuidKey);
            var memuser = Membership.GetUser(guidUserId);
            var profileuser = Profile.GetUserProfile(memuser.UserName);
            var list = new {
                              UserName = memuser.UserName,
                              Email = memuser.Email ,
                              IsApproved = memuser.IsApproved.ToString() ,
                              IsLockedOut = memuser.IsLockedOut.ToString() ,
                              LastLockoutDate = memuser.LastLockoutDate.ToString() ,
                              CreationDate = memuser.CreationDate.ToString() ,
                              LastLoginDate = memuser.LastLoginDate.ToString() ,
                              LastActivityDate = memuser.LastActivityDate.ToString() ,
                              LastPasswordChangedDate = memuser.LastPasswordChangedDate.ToString() ,
                              IsOnline = memuser.IsOnline.ToString() ,
                              FirstName = profileuser.FirstName ,
                              LastName = profileuser.LastName ,
                              NickName = profileuser.NickName ,
                              BirthDate = profileuser.BirthDate.ToString() ,
            };
            return Json(list, JsonRequestBehavior.AllowGet);
        }
        return Redirect("Index");
    }

Как вы можете видеть, я использую функцию C # 3.0 для создания «авто» Generics. Это немного лениво, но мне это нравится, и это работает. Просто примечание: Профиль - это пользовательский класс, который я создал для своего проекта веб-приложения.

8
23.10.2009 06:39:45
поэтому каждый раз, когда вы добавляете новую роль [Authorize (Roles = "Human Resources")], вам приходится компилировать и развертывать? вау .... :)
Alex Nolasco 2.06.2010 14:16:04
Если это служба JSON, то перенаправление кажется неправильным. Я бы вернул 404 Not Found, если ключ ввода настолько недействителен, что его невозможно найти (а также 404, если он действительно не найден). Когда мои пользователи не вошли в систему, я возвращаю 403 Запрещено.
Richard Corfield 21.12.2011 21:42:38
Это «многоразовый» метод. Например, если я хочу получить пользовательские данные из другого представления, я могу получить их, пока я предоставляю идентификатор. Однако, если идентификатор не указан, страница перенаправляется в список пользователей (индекс) для выбора пользователя. Простое решение, необходимое для приложения, просто то, как мой мозг готовил его в то время.
Ray Linder 25.12.2011 09:26:54

Не думай об этом. Как и в течение десятилетий, передайте числовое смещение от стандартной фактической эпохи 1 января 1970 года по полуночи GMT / UTC / & c в секундах (или миллисекундах) с этой эпохи. JavaScript нравится, Java нравится, C нравится, а Интернету нравится.

20
9.11.2014 10:21:40
И очень жаль, что есть более 20 эпох на выбор. en.wikipedia.org/wiki/Epoch_(reference_date)
Jerther 30.10.2014 19:22:56
Marc L. 19.10.2018 15:03:00

Оригинальный пример:

/Date(1224043200000)/  

не отражает форматирование, используемое WCF при отправке дат через WCF REST с использованием встроенной сериализации JSON. (по крайней мере, на .NET 3.5, SP1)

Я нашел ответ здесь полезным, но требуется небольшое редактирование регулярного выражения, так как кажется, что смещение часового пояса GMT добавляется к числу, возвращенному (с 1970 года) в WCF JSON.

В службе WCF у меня есть:

[OperationContract]
[WebInvoke(
    RequestFormat = WebMessageFormat.Json,
    ResponseFormat = WebMessageFormat.Json,
    BodyStyle = WebMessageBodyStyle.WrappedRequest
    )]
ApptVisitLinkInfo GetCurrentLinkInfo( int appointmentsId );

ApptVisitLinkInfo определяется просто:

public class ApptVisitLinkInfo {
    string Field1 { get; set; }
    DateTime Field2 { get; set; }
    ...
}

Когда «Field2» возвращается как Json из службы, значение равно:

/Date(1224043200000-0600)/

Обратите внимание на смещение часового пояса, включенное как часть значения.

Модифицированное регулярное выражение:

/\/Date\((.*?)\)\//gi

Это немного более нетерпеливо и захватывает все между паренами, а не только первый номер. Полученное время sinze 1970, плюс смещение часового пояса, все могут быть переданы в eval для получения объекта даты.

Результирующая строка JavaScript для замены:

replace(/\/Date\((.*?)\)\//gi, "new Date($1)");
67
30.12.2009 01:21:28
это неправильно, новая Дата (1224043200000-0600) только вычтет 600 из даты, в данном случае 600 миллисекунд, а не 6 часов, как должно.
ariel 26.04.2011 06:47:58
Bergi 28.11.2012 22:20:03
Я думаю, что смещение часового пояса включено, только если у вас есть часовой пояс для объекта DateTime в .NET (это поведение по умолчанию). Если ваша дата указана в формате UTC, используйте DateTime.SpecifyKind (date, DateTimeKind.UTC), и вы получите правильное значение UTC при сериализации, без смещения, которое затем можно будет преобразовать обратно в часовой пояс пользователя при необходимости. Если это по местному времени, используйте .ToUniversalTime (), и он преобразуется в UTC, и для вас уже будет указан «Вид».
jvenema 15.08.2013 01:45:46
в javascript -0100 будет двоичная строка, так что будьте осторожны!
verbedr 11.08.2015 13:54:09
как только вы конвертируете дату из WCF в JS, как насчет обратной. Вы должны указать дату как целое число (используя date.getTime ()), которую хотите передать в тот же WCF?
NitinSingh 21.06.2017 09:39:29

Для тех, кто использует Newtonsoft Json.NET , читайте о том, как сделать это через Native JSON в IE8, Firefox 3.5 плюс Json.NET .

Также полезна документация по изменению формата дат, написанных Json.NET: Сериализация дат с помощью Json.NET

Для тех, кто слишком ленив, вот быстрые шаги. Поскольку JSON имеет свободную реализацию DateTime, вам нужно использовать IsoDateTimeConverter(). Обратите внимание, что начиная с Json.NET 4.5 формат даты по умолчанию - ISO, поэтому приведенный ниже код не требуется.

string jsonText = JsonConvert.SerializeObject(p, new IsoDateTimeConverter());

JSON будет проходить как

"fieldName": "2009-04-12T20:44:55"

Наконец, немного JavaScript для преобразования даты ISO в дату JavaScript:

function isoDateReviver(value) {
  if (typeof value === 'string') {
    var a = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)(?:([\+-])(\d{2})\:(\d{2}))?Z?$/.exec(value);
      if (a) {
        var utcMilliseconds = Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], +a[5], +a[6]);
        return new Date(utcMilliseconds);
      }
  }
  return value;
}

Я использовал это так

$("<span />").text(isoDateReviver(item.fieldName).toLocaleString()).appendTo("#" + divName);
97
1.08.2012 23:23:11
Конструктор JavaScript Date может проанализировать строку для вас:new Date("2009-04-12T20:44:55")
David Hogue 19.06.2013 18:00:48
Предупреждение - форматы конструктора Date () и синтаксический анализ не являются стандартными до ECMAScript 6. Например, IE 9 обрабатывает дату, которую вы предоставляете конструктору, как местное время, даже если оно находится в IS0-8601, что подразумевается как UCT везде. Не полагайтесь на конструктор даты, если вы поддерживаете старые браузеры. codeofmatt.com/2013/06/07/…
DanO 22.09.2014 17:56:29
Отправка даты не в формате UTC рано или поздно доставит вам неприятности.
tymtam 17.07.2016 22:59:59
Немного опоздал на вечеринку здесь, но что бы (+ a [1], + a [2] - 1, + a [3], + a [4], + a [5], + a [6]) ; представлять в этом контексте?
yanant 4.03.2020 18:04:01
@yanant - +a[1]etc представляет части массива регулярного выражения, и +он будет приводить его к числу, +a[1]равному 2009и т. д. Вот разбивка массива: 0: "2009-04-12T20:44:55" 1: "2009" 2: "04" 3: "12" 4: "20" 5: "44" 6: "55"
Jason Jong 25.03.2020 11:57:45

Mootools решение:

new Date(Date(result.AppendDts)).format('%x')

Требует mootools-больше. Протестировано с использованием mootools-1.2.3.1-more на Firefox 3.6.3 и IE 7.0.5730.13

8
21.09.2010 12:18:50

К вашему сведению, для тех, кто использует Python на стороне сервера: datetime.datetime (). Ctime () возвращает строку, которая изначально анализируется с помощью «new Date ()». То есть, если вы создаете новый экземпляр datetime.datetime (например, с datetime.datetime.now), строка может быть включена в строку JSON, а затем эта строка может быть передана в качестве первого аргумента конструктору Date. Я еще не нашел каких-либо исключений, но я не проверял это слишком строго.

8
8.07.2010 01:19:36

Я получаю дату как это:

"/Date(1276290000000+0300)/"

В некоторых примерах дата имеет несколько разные форматы:

"/Date(12762900000000300)/"
"Date(1276290000000-0300)"

и т.п.

Итак, я придумал следующий RegExp:

/\/+Date\(([\d+]+)\)\/+/

и окончательный код:

var myDate = new Date(parseInt(jsonWcfDate.replace(/\/+Date\(([\d+-]+)\)\/+/, '$1')));

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

Обновление: Я нашел эту ссылку от Microsoft: Как мне сериализовать даты с помощью JSON?

Это похоже на то, что мы все ищем.

9
3.10.2010 07:34:40
Замены регулярного выражения медленные ... Намного быстрее захватить целую часть с помощью substr (6) и передать ее parseInt () - см. Мой ответ ниже.
Roy Tinker 22.10.2010 19:25:59
Bergi 28.11.2012 22:23:04

Публикация в отличной теме:

var d = new Date(parseInt('/Date(1224043200000)/'.slice(6, -2)));
alert('' + (1 + d.getMonth()) + '/' + d.getDate() + '/' + d.getFullYear().toString().slice(-2));
17
26.09.2010 11:20:11
Хорошая идея, но что, если смещение часового пояса включено? В этом случае лучше использовать substr (6) вместо slice (6, -2) - см. Мой ответ ниже.
Roy Tinker 22.10.2010 19:21:12

Это расстраивает. Мое решение состояло в том, чтобы разобрать «/ и /» из значения, сгенерированного JavaScriptSerializer ASP.NET, так что, хотя JSON может не иметь литерала даты, он все равно будет интерпретироваться браузером как дата, и это все, что я на самом деле хотеть:{"myDate":Date(123456789)}

Пользовательский JavaScriptConverter для DateTime?

Я должен подчеркнуть точность комментария Роя Тинкера. Это не законный JSON. Это грязный, грязный хак на сервере, чтобы удалить проблему, прежде чем она станет проблемой для JavaScript. Он захлебнется парсером JSON. Я использовал это для того, чтобы оторваться от земли, но я больше не использую это. Тем не менее, я все еще чувствую, что лучший ответ заключается в изменении того, как сервер форматирует дату, например, ISO, как упоминалось в другом месте.

9
23.05.2017 10:31:37
Это не законно JSON. Это будет работать только при вычислении с интерпретатором Javascript. Но если вы используете JSON-декодер, он захлебнется.
Roy Tinker 22.10.2010 19:18:28
Согласовано. И если бы я просто имел дело с этим одним фрагментом данных, я бы не стал его рассматривать. Но если я имею дело с объектом с несколькими датами и другими свойствами, проще выполнить eval () целиком, чем выбирать свойства по одному. В конце концов, основной проблемой является отсутствие (легальной) даты JSON. Пока это не существует, мы оставлены для наших творческих взломов.
StarTrekRedneck 25.10.2010 18:27:08

Не повторяйте себя - автоматизируйте преобразование даты с помощью $.parseJSON()

Ответы на ваш пост обеспечивают ручное преобразование дат в даты JavaScript. Я $.parseJSON()немного расширил jQuery , поэтому он может автоматически разбирать даты, когда вы указываете это. Он обрабатывает даты в формате ASP.NET ( /Date(12348721342)/), а также даты в формате ISO ( 2010-01-01T12.34.56.789Z), которые поддерживаются встроенными функциями JSON в браузерах (и библиотеках, таких как json2.js).

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

65
9.11.2014 10:25:31

обновленный

У нас есть внутренняя библиотека пользовательского интерфейса, которая должна справляться как со встроенным форматом JSON Microsoft ASP.NET, например /Date(msecs)/, о котором мы спрашивали здесь изначально, так и с большинством форматов дат JSON, включая JSON.NET 2014-06-22T00:00:00.0. Кроме того, нам нужно справиться с неспособностью oldIE справиться с чем-либо, кроме трех знаков после запятой .

Сначала мы определяем, какую дату мы потребляем, анализируем ее в обычный Dateобъект JavaScript , а затем форматируем ее.

1) Определить формат даты Microsoft

// Handling of Microsoft AJAX Dates, formatted like '/Date(01238329348239)/'
function looksLikeMSDate(s) {
    return /^\/Date\(/.test(s);
}

2) Определить формат даты ISO

var isoDateRegex = /^(\d\d\d\d)-(\d\d)-(\d\d)T(\d\d):(\d\d):(\d\d)(\.\d\d?\d?)?([\+-]\d\d:\d\d|Z)?$/;

function looksLikeIsoDate(s) {
    return isoDateRegex.test(s);
}

3) Парс MS формат даты:

function parseMSDate(s) {
    // Jump forward past the /Date(, parseInt handles the rest
    return new Date(parseInt(s.substr(6)));
}

4) Разобрать формат даты ISO.

По крайней мере, у нас есть способ быть уверенным, что мы имеем дело со стандартными датами ISO или датами ISO, измененными так, чтобы они всегда имели три миллисекунды ( см. Выше ), поэтому код отличается в зависимости от среды.

4a) Разобрать стандартный формат даты ISO, справиться с проблемами oldIE:

function parseIsoDate(s) {
    var m = isoDateRegex.exec(s);

    // Is this UTC, offset, or undefined? Treat undefined as UTC.
    if (m.length == 7 ||                // Just the y-m-dTh:m:s, no ms, no tz offset - assume UTC
        (m.length > 7 && (
            !m[7] ||                    // Array came back length 9 with undefined for 7 and 8
            m[7].charAt(0) != '.' ||    // ms portion, no tz offset, or no ms portion, Z
            !m[8] ||                    // ms portion, no tz offset
            m[8] == 'Z'))) {            // ms portion and Z
        // JavaScript's weirdo date handling expects just the months to be 0-based, as in 0-11, not 1-12 - the rest are as you expect in dates.
        var d = new Date(Date.UTC(m[1], m[2]-1, m[3], m[4], m[5], m[6]));
    } else {
        // local
        var d = new Date(m[1], m[2]-1, m[3], m[4], m[5], m[6]);
    }

    return d;
}

4b) Разобрать формат ISO с фиксированным трех миллисекундным десятичным знаком - намного проще:

function parseIsoDate(s) {
    return new Date(s);
}

5) Отформатируйте это:

function hasTime(d) {
    return !!(d.getUTCHours() || d.getUTCMinutes() || d.getUTCSeconds());
}

function zeroFill(n) {
    if ((n + '').length == 1)
        return '0' + n;

    return n;
}

function formatDate(d) {
    if (hasTime(d)) {
        var s = (d.getMonth() + 1) + '/' + d.getDate() + '/' + d.getFullYear();
        s += ' ' + d.getHours() + ':' + zeroFill(d.getMinutes()) + ':' + zeroFill(d.getSeconds());
    } else {
        var s = (d.getMonth() + 1) + '/' + d.getDate() + '/' + d.getFullYear();
    }

    return s;
}

6) Свяжите все это вместе:

function parseDate(s) {
    var d;
    if (looksLikeMSDate(s))
        d = parseMSDate(s);
    else if (looksLikeIsoDate(s))
        d = parseIsoDate(s);
    else
        return null;

    return formatDate(d);
}

Приведенный ниже старый ответ полезен для того, чтобы связать это форматирование даты с собственным JSON-анализом JSON, чтобы вы получали объекты Date вместо строк, или если вы все равно застряли в jQuery <1.5.

Старый ответ

Если вы используете функцию Ajax jQuery 1.4 с ASP.NET MVC, вы можете превратить все свойства DateTime в объекты Date с помощью:

// Once
jQuery.parseJSON = function(d) {return eval('(' + d + ')');};

$.ajax({
    ...
    dataFilter: function(d) {
        return d.replace(/"\\\/(Date\(-?\d+\))\\\/"/g, 'new $1');
    },
    ...
});

В jQuery 1.5 вы можете избежать parseJSONглобального переопределения метода, используя опцию преобразователей в вызове Ajax.

http://api.jquery.com/jQuery.ajax/

К сожалению, вам нужно переключиться на более старый маршрут eval, чтобы Dates мог анализироваться глобально, иначе вам нужно конвертировать их в более индивидуальном порядке после анализа.

38
23.05.2017 12:34:53

В jQuery 1.5, если у вас есть json2.js для старых браузеров, вы можете десериализовать все даты из Ajax следующим образом:

(function () {
    var DATE_START = "/Date(";
    var DATE_START_LENGTH = DATE_START.length;

    function isDateString(x) {
        return typeof x === "string" && x.startsWith(DATE_START);
    }

    function deserializeDateString(dateString) {
        var dateOffsetByLocalTime = new Date(parseInt(dateString.substr(DATE_START_LENGTH)));
        var utcDate = new Date(dateOffsetByLocalTime.getTime() - dateOffsetByLocalTime.getTimezoneOffset() * 60 * 1000);
        return utcDate;
    }

    function convertJSONDates(key, value) {
      if (isDateString(value)) {
        return deserializeDateString(value);
      }
      return value;
    }

    window.jQuery.ajaxSetup({
      converters: {
        "text json": function(data) {
          return window.JSON.parse(data, convertJSONDates);
        }
      }
    });
}());

Я включил логику, которая предполагает, что вы отправляете все даты с сервера в формате UTC (что вам следует); Затем потребитель получает Dateобъект JavaScript, который имеет правильное значение ticks, чтобы отразить это. То есть, вызов getUTCHours()и т. Д. В дату вернет то же значение, что и на сервере, а вызов getHours()вернет значение в местном часовом поясе пользователя, как определено его браузером.

Это не учитывает формат WCF со смещением часового пояса, хотя это было бы относительно легко добавить.

22
9.11.2014 10:55:30
Как примечание: чтобы код работал, вы должны создать метод startWith типа string
Hugo Zapata 17.09.2011 00:05:35

У каждого из этих ответов есть одна общая черта: все они хранят даты как одно значение (обычно строку).

Другой вариант - воспользоваться преимуществами внутренней структуры JSON и представить дату в виде списка чисел:

{ "name":"Nick",
  "birthdate":[1968,6,9] }

Конечно, вам нужно убедиться, что оба конца беседы согласуются с форматом (год, месяц, день) и полями, которые должны быть датами, но у него есть преимущество, заключающееся в том, что он полностью избегает вопроса о дате. Преобразование в строку. Это все числа - никаких строк. Кроме того, использование порядка: год, месяц, день также позволяет правильно сортировать по дате.

Просто подумайте нестандартно - дату в формате JSON не нужно хранить в виде строки.

Другим преимуществом этого является то, что вы можете легко (и эффективно) выбирать все записи за определенный год или месяц, используя способ, которым CouchDB обрабатывает запросы к значениям массива.

18
9.11.2014 10:57:08
Там является стандартным форматом даты в формате JSON, который является формат RFC 3339.
gnasher729 8.03.2016 16:34:29
@gnasher, это было бы хорошо, но это не так. Нет ссылок от RFC 7159 до 3339 или наоборот. Там нет де - юре стандартного формата даты в формате JSON. Все, что осталось, - это стандарты де-факто , каждый из которых имеет свои плюсы и минусы. Это хорошая вещь о стандартах.
Marc L. 19.10.2018 17:02:37
var obj = eval('(' + "{Date: \/Date(1278903921551)\/}".replace(/\/Date\((\d+)\)\//gi, "new Date($1)") + ')');
var dateValue = obj["Date"];
8
1.07.2011 09:08:10

Использование средства выбора даты jQuery UI - действительно имеет смысл, только если вы уже включили jQuery UI:

$.datepicker.formatDate('MM d, yy', new Date(parseInt('/Date(1224043200000)/'.substr(6)))); 

вывод:

15 октября 2008 г.

21
26.10.2015 21:26:17

Просто чтобы добавить еще один подход, «тиковый подход», который использует WCF, подвержен проблемам с часовыми поясами, если вы не слишком осторожны, как описано здесь и в других местах. Поэтому сейчас я использую формат ISO 8601, который должным образом поддерживает и .NET, и JavaScript, включая смещения часовых поясов. Ниже приведены подробности:

В WCF / .NET:

Где CreationDate - это System.DateTime; ToString ("o") использует спецификатор формата туда и обратно .NET, который генерирует строку даты, совместимую с ISO 8601

new MyInfo {
    CreationDate = r.CreationDate.ToString("o"),
};

В JavaScript

Сразу после получения JSON я исправляю даты, чтобы они были объектами JavaSript Date, используя конструктор Date, который принимает строку даты ISO 8601 ...

$.getJSON(
    "MyRestService.svc/myinfo",
    function (data) {
        $.each(data.myinfos, function (r) {
            this.CreatedOn = new Date(this.CreationDate);
        });
        // Now each myinfo object in the myinfos collection has a CreatedOn field that is a real JavaScript date (with timezone intact).
       alert(data.myinfos[0].CreationDate.toLocaleString());
    }
)

Если у вас есть дата JavaScript, вы можете использовать все удобные и надежные методы Date, такие как toDateString , toLocaleString и т. Д.

17
9.11.2014 10:58:48

Добавьте плагин jQuery UI на свою страницу:

function DateFormate(dateConvert) {
    return $.datepicker.formatDate("dd/MM/yyyy", eval('new ' + dateConvert.slice(1, -1)));
};
8
9.11.2014 10:59:22

Ниже приведено довольно простое решение для анализа дат JSON. Используйте следующие функции согласно вашему требованию. Вам просто нужно передать формат даты JSON, выбранный в качестве параметра для функций ниже:

function JSONDate(dateStr) {
    var m, day;
    jsonDate = dateStr;
    var d = new Date(parseInt(jsonDate.substr(6)));
    m = d.getMonth() + 1;
    if (m < 10)
        m = '0' + m
    if (d.getDate() < 10)
        day = '0' + d.getDate()
    else
        day = d.getDate();
    return (m + '/' + day + '/' + d.getFullYear())
}

function JSONDateWithTime(dateStr) {
    jsonDate = dateStr;
    var d = new Date(parseInt(jsonDate.substr(6)));
    var m, day;
    m = d.getMonth() + 1;
    if (m < 10)
        m = '0' + m
    if (d.getDate() < 10)
        day = '0' + d.getDate()
    else
        day = d.getDate();
    var formattedDate = m + "/" + day + "/" + d.getFullYear();
    var hours = (d.getHours() < 10) ? "0" + d.getHours() : d.getHours();
    var minutes = (d.getMinutes() < 10) ? "0" + d.getMinutes() : d.getMinutes();
    var formattedTime = hours + ":" + minutes + ":" + d.getSeconds();
    formattedDate = formattedDate + " " + formattedTime;
    return formattedDate;
}
10
9.11.2014 11:00:49

Дата JSON легко преобразовать в дату JavaScript:

var s = Response.StartDate;     
s = s.replace('/Date(', '');

s = s.replace(')/', '');

var expDate = new Date(parseInt(s));
2
14.05.2014 20:13:58

Нажмите здесь, чтобы проверить демо

JavaScript / JQuery

var = MyDate_String_Value = "/Date(1224043200000)/"
var value = new Date
            (
                 parseInt(MyDate_String_Value.replace(/(^.*\()|([+-].*$)/g, ''))
            );
var dat = value.getMonth() +
                         1 +
                       "/" +
           value.getDate() +
                       "/" +
       value.getFullYear();

Результат - "15.10.2008"

60
9.11.2014 11:01:26
Просто улучшение для метода выше. function formatearFecha (fec) {var value = new Date (parseInt (fec.replace (/ (^. * () | ([+ -]. * $) / g, ''))); var mes = value.getMonth (); var dia = value.getDate (); var date = dia + "/" + mes + "/" + value.getFullYear (); if (dia <10) date = date.substr (0, 0) + '0' + dia + date.substr (1); if (mes <10) date = date.substr (0, 3) + '0' + mes + date.substr (4); дата возвращения;} дата отформатирована в ddMMyyyy. Приветствия!
Matias 26.06.2015 12:42:08

Вы также можете использовать библиотеку JavaScript moment.js , которая пригодится, когда вы планируете работать с различными локализованными форматами и выполнять другие операции со значениями дат:

function getMismatch(id) {
    $.getJSON("Main.aspx?Callback=GetMismatch",
    { MismatchId: id },

    function (result) {
        $("#AuthMerchId").text(result.AuthorizationMerchantId);
        $("#SttlMerchId").text(result.SettlementMerchantId);
        $("#CreateDate").text(moment(result.AppendDts).format("L"));
        $("#ExpireDate").text(moment(result.ExpiresDts).format("L"));
        $("#LastUpdate").text(moment(result.LastUpdateDts).format("L"));
        $("#LastUpdatedBy").text(result.LastUpdateNt);
        $("#ProcessIn").text(result.ProcessIn);
    }
    );
    return false;
}

Настроить локализацию так же просто, как добавить файлы конфигурации (вы можете получить их на momentjs.com) в свой проект и настроить язык:

moment.lang('de');
10
9.11.2014 11:04:43

Мне также пришлось искать решение этой проблемы, и в конце концов я наткнулся на moment.js, отличную библиотеку, которая может анализировать этот формат даты и многое другое.

var d = moment(yourdatestring)

Это избавило меня от головной боли, поэтому я решил поделиться этим с вами. :)
Вы можете найти больше информации об этом здесь: http://momentjs.com/

25
15.05.2013 06:36:24