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

2001

Я беру свой первый кряк в 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;
}

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

Peter Mortensen
источник
26
Это может быть интересно: hanselman.com/blog/…
citronas
6
Формат /Date(...)/ специфичен для встроенного в Microsoft формата даты JSON - он не является частью какого-либо стандарта, а JSON, происходящий из Javascript, имеет стандарт: в формате ISO Javascript указывает: stackoverflow.com/a / 15952652/176877 Итак, этот вопрос относится к формату Microsoft JSON Date. Я изменил название, чтобы уточнить это.
Крис Москини
15
Ты шутишь! Microsoft сделала свой собственный штамп на JSON! и на свиданиях !! Когда они будут учиться!
Nick.McDermaid
Используйте Newtonsoft JSON на стороне .NET и, чтобы иметь хорошие типизированные значения на стороне JS, просто используйте: github.com/RickStrahl/json.date-extensions
baHI
Вы можете использовать JSON ++ вместо JSON. JSON ++ такой же, как JSON, но с поддержкой таких типов JavaScript, как Date.
Brillout

Ответы:

1688

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
Рой Тинкер
источник
4
@Broam: оба метода (функция замены и этот ответ) должны были бы измениться, если MS изменяет формат.
Рой Тинкер
23
Не могли бы вы обновить его с помощью radix var date = new Date (parseInt (jsonDate.substr (6), 10));
Джеймс Кибурз
6
@JamesKyburz: Каждое правило имеет исключения, и я думаю, что это когда исключение применяется. Числа даты JSON из .NET никогда не имеют начального «0», поэтому мы можем смело пропустить основную часть.
Рой Тинкер
22
Стоит отметить, что этот формат даты довольно плохой, и общий переход - это даты в формате JSON в формате ISO-8601. См. Hanselman.com/blog/…
Рори
4
Этот подход не учитывает часовой пояс, поэтому может вызвать серьезные проблемы, когда ваш сервер и пользователи находятся в разных часовых поясах. Ниже я опубликовал ответ, который объясняет очень быстрый и простой способ справиться с ним на сторонах WCF и Javascript: stackoverflow.com/a/10743718/51061
Скотт Виллек,
135

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

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

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

Panos
источник
7
Там нет ничего плохого в строке, последовательность \ //. Первый слэш экранируется, поэтому он не считается комментарием. Это ваш редактор обманывает вас, строка будет работать нормально.
andreialecu
152
@rball, ерунда:jsonDate = new Date(+jsonDate.replace(/\/Date\((\d+)\)\//, '$1'));
век
39
pst был верен, это можно сделать разными способами без 'eval'. Крокфорд говорит, что «eval Is Evil», потому что он менее читабелен и менее безопасен, более того, он может также предположить, что он менее эффективен и более опасен, потому что попадает в компилятор javascript.
Марк Роджерс
13
@Edy: new Functionпочти так же плохо, как eval: dev.opera.com/articles/view/efficient-javascript/…
Марсель Корпель
5
@Edy: Это еще одна форма eval, и она такая же «злая». Вместо этого разберите строку (см. Мой ответ ниже)
Рой Тинкер
98

Для тех, кто использует 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);
Jason Jong
источник
6
Конструктор JavaScript Date может проанализировать для вас строку:new Date("2009-04-12T20:44:55")
David Hogue
5
Предупреждение - форматы конструктора Date () и синтаксический анализ не являются стандартными до ECMAScript 6. Например, IE 9 рассматривает дату, которую вы предоставляете конструктору, как местное время, даже если оно находится в IS0-8601, что подразумевается как UCT везде. Не полагайтесь на конструктор даты, если вы поддерживаете старые браузеры. codeofmatt.com/2013/06/07/…
DanO
Отправка даты не в формате UTC рано или поздно доставит вам неприятности.
тымтам
Немного опоздал на вечеринку здесь, но что бы (+ a [1], + a [2] - 1, + a [3], + a [4], + a [5], + a [6]) ; представлять в этом контексте?
Янв
@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
67

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

/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)");
Аарон
источник
10
это неправильно, новая Дата (1224043200000-0600) только вычтет 600 из даты, в данном случае 600 миллисекунд, а не 6 часов, как должно.
Ариэль
Я думаю, что смещение часового пояса включено, только если у вас есть часовой пояс для объекта DateTime в .NET (это поведение по умолчанию). Если ваша дата указана в формате UTC, используйте DateTime.SpecifyKind (date, DateTimeKind.UTC), и вы получите правильное значение UTC при сериализации, без смещения, которое затем можно будет преобразовать обратно в часовой пояс пользователя при необходимости. Если это по местному времени, используйте .ToUniversalTime (), и он преобразуется в UTC, и для вас уже будет указан «Вид».
Jvenema
в javascript -0100 будет двоичная строка, так что будьте осторожны!
verbedr
как только вы конвертируете дату из WCF в JS, как насчет обратного. Вы должны указать дату как целое число (используя date.getTime ()), которую хотите передать в тот же WCF?
NitinSingh
65

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

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

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

Роберт Коритник
источник
61

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

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

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

John Boker
источник
3
Я бы тоже так подумал, за исключением того, что это: var thedate = / Date (1224043200000) /; по крайней мере для меня ...
rball
2
Date () и Date (1224043200000) дают одинаковый результат как в Chrome, так и в Firefox. Не уверен, что это работает в старых браузерах, но этот ответ не работает в браузерах сейчас.
Джеймс
@James, да это даёт браузеру текущую дату. :(
vissu
9
Вам нужно написать это как «новая дата (1224043200000)».
BrainSlugs83
60

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

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"

user2007801
источник
Просто улучшение для метода выше. 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. Приветствия!
Матиас
38

обновленный

У нас есть внутренняя библиотека пользовательского интерфейса, которая должна работать как со встроенным форматом 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 мог анализироваться глобально, иначе вам нужно конвертировать их в более индивидуальном порядке после анализа.

Крис Москини
источник
27

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

johnstok
источник
Это неправильно, JSON использует даты Javascript с добавленной информацией о часовом поясе - эпоха совпадает с эпохой класса Date в JavaScript (по понятным причинам).
BrainSlugs83
3
@ BrainSlug83 - этот ответ содержит ссылку на утверждение, что JSON не имеет встроенного типа даты. Если вы не согласны, пожалуйста, предоставьте альтернативную ссылку. (Вы не думаете о конкретной платформе, которая определила строковый формат для представления дат, не так ли? Это не является частью стандарта JSON, на самом деле это не может быть, потому что это сделает невозможным включение строки, которая не является предполагается, что это дата, но в ней есть набор символов, соответствующих шаблону даты.)
nnnnnn
25

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

var d = moment(yourdatestring)

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

Venemo
источник
24

В итоге я добавил символы "в регулярное выражение 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);
}
Chris Woodward
источник
22

В 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 со смещением часового пояса, хотя это было бы относительно легко добавить.

Domenic
источник
Как примечание: чтобы код работал, вы должны создать метод startWith типа string
Hugo Zapata
21

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

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

вывод:

15 октября 2008 г.

доминируют
источник
20

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

Xepoch
источник
2
И очень жаль, что есть более 20 эпох на выбор. en.wikipedia.org/wiki/Epoch_(reference_date)
Джертер
18

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

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

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

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

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

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

Ник Перкинс
источник
Там является стандартным форматом даты в формате JSON, который является формат RFC 3339.
gnasher729
@gnasher, это было бы хорошо, но это не так. Нет ссылок от RFC 7159 до 3339 или наоборот. Там нет де - юре стандартного формата даты в формате JSON. Все, что осталось, это стандарты де-факто , каждый из которых имеет свои плюсы и минусы. Это хорошая вещь о стандартах.
Марк Л.
17

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

var d = new Date(parseInt('/Date(1224043200000)/'.slice(6, -2)));
alert('' + (1 + d.getMonth()) + '/' + d.getDate() + '/' + d.getFullYear().toString().slice(-2));
Дэн Бим
источник
1
Хорошая идея, но что, если смещение часового пояса включено? В этом случае лучше использовать substr (6) вместо slice (6, -2) - см. Мой ответ ниже.
Рой Тинкер
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 и т. Д.

activescott
источник
16
var newDate = dateFormat(jsonDate, "mm/dd/yyyy"); 

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

blgnklc
источник
Это новый вопрос, и его следует задавать как отдельный вопрос, а не как здесь.
Спенсер Салливан
11

Это может также помочь вам.

 function ToJavaScriptDate(value) { //To Parse Date from the Returned Parsed Date
        var pattern = /Date\(([^)]+)\)/;
        var results = pattern.exec(value);
        var dt = new Date(parseFloat(results[1]));
        return (dt.getMonth() + 1) + "/" + dt.getDate() + "/" + dt.getFullYear();
    }
Рави Мехта
источник
10

Ниже приведено довольно простое решение для анализа дат 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

Вы также можете использовать библиотеку 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');
martinoss
источник
9

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

"/Date(1276290000000+0300)/"

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

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

и т.п.

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

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

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

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

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

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

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

Михаил Ващинский
источник
1
Замены регулярного выражения медленные ... Намного быстрее захватить целую часть с помощью substr (6) и передать ее parseInt () - см. Мой ответ ниже.
Рой Тинкер
9

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

yyyy.MM.ddThh:mm

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

Thomas Hansen
источник
Согласно схеме JSON, формат «дата-время» соответствует RFC 3339, раздел 5.6. Таким образом, вы должны написать «гггг-ММ-ддТЧч: мм: ссЗ» для дат в GMT или Z, замененный на часовой пояс, например + чч: мм.
gnasher729
Проблема в том, что WCF и другие «старые» сериализации MS JSON не используют этот формат, и это необходимо учитывать.
Марк Л.
9

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

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

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

StarTrekRedneck
источник
2
Это не законно JSON. Это будет работать только при вычислении с интерпретатором Javascript. Но если вы используете JSON-декодер, он захлебнется.
Рой Тинкер
1
Согласовано. И если бы я просто имел дело с этим одним фрагментом данных, я бы не стал его рассматривать. Но если я имею дело с объектом с несколькими датами и другими свойствами, проще выполнить eval () целиком, чем выбирать свойства по одному. В конце концов, основной проблемой является отсутствие (легальной) даты JSON. Пока это не существует, мы оставлены для наших творческих взломов.
StarTrekRedneck
8

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

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

    [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. Это немного лениво, но мне это нравится, и это работает. Просто примечание: Профиль - это пользовательский класс, который я создал для своего проекта веб-приложения.

Рэй Линдер
источник
поэтому каждый раз, когда вы добавляете новую роль [Authorize (Roles = "Human Resources")], вам приходится компилировать и развертывать? вау .... :)
Алекс Ноласко
1
Если это служба JSON, то перенаправление кажется неправильным. Я бы вернул 404 Not Found, если ключ ввода настолько недействителен, что его невозможно найти (а также 404, если он действительно не найден). Когда мои пользователи не вошли в систему, я возвращаю 403 Запрещено.
Ричард Корфилд
Это «многоразовый» метод. Например, если я хочу получить пользовательские данные из другого представления, я могу получить их, пока я предоставляю идентификатор. Однако, если идентификатор не указан, страница перенаправляется в список пользователей (индекс) для выбора пользователя. Простое решение, необходимое для приложения, просто то, как мой мозг готовил его в то время.
Рэй Линдер
8

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

Кайл Алан Хейл
источник
8

Mootools решение:

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

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

Midhat
источник
8
var obj = eval('(' + "{Date: \/Date(1278903921551)\/}".replace(/\/Date\((\d+)\)\//gi, "new Date($1)") + ')');
var dateValue = obj["Date"];
在 路上
источник
8

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

function DateFormate(dateConvert) {
    return $.datepicker.formatDate("dd/MM/yyyy", eval('new ' + dateConvert.slice(1, -1)));
};
ThulasiRam
источник
8

Что делать, если .NET возвращает ...

return DateTime.Now.ToString("u"); //"2013-09-17 15:18:53Z"

А потом в JavaScript ...

var x = new Date("2013-09-17 15:18:53Z");
Хуан Карлос Пуэрто
источник