jquery - parse - pass date json




Как настроить дату Microsoft JSON? (20)

обновленный

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

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

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) Формат даты синтаксиса:

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 JQuery, поэтому вы получаете объекты 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 во всем мире, используя опцию converters в вызове Ajax.

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

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

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

/Date(1224043200000)/

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

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

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

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


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

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

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


Eval не требуется. Это будет нормально работать:

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

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

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

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

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

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


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

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

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


Вы также можете использовать javascript http://momentjs.com/ , который пригодится, когда вы планируете иметь дело с различными локализованными форматами и выполнять другие операции с значениями дат:

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

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

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

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

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

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


Исходный пример:

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

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

/Date(1224043200000-0600)/

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

Измененное регулярное выражение:

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

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

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

replace(/\/Date\((.*?)\)\//gi, "new Date($1)");

Каждый из этих ответов имеет одну общую черту: все они хранят даты как одно значение (обычно это строка).

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

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

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

Просто думая вне коробки здесь - дата JSON не должна храниться в виде строки.

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


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


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

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

yyyy.MM.ddThh:mm

Это будет 2008.11.20T22:18 .


Проводка в удивительной теме:

var d = new Date(parseInt('/Date(1224043200000)/'.slice(6, -2)));
alert('' + (1 + d.getMonth()) + '/' + d.getDate() + '/' + d.getFullYear().toString().slice(-2));

Чтобы добавить другой подход здесь, подход «тиков», который принимает WCF подвержен проблемам с часовыми поясами, если вы не очень осторожны, как описано here и в других местах. Поэтому я теперь использую формат 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 и т. Д.


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

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

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


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

"/Date(1276290000000+0300)/"

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

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

и т.п.

Поэтому я придумал следующий RegExp:

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

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

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

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

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

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


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

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

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

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

А потом в JavaScript ...

var x = new Date("2013-09-17 15:18:53Z");

var newDate = dateFormat(jsonDate, "mm/dd/yyyy"); 

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







json