Как мне отформатировать дату Microsoft JSON? - PullRequest
1907 голосов
/ 16 октября 2008

Я беру свою первую трещину в 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;
}

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

Ответы [ 40 ]

23 голосов
/ 16 октября 2008

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

21 голосов
/ 08 апреля 2011

В 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 (что вам следует); Затем потребитель получает объект JavaScript Date, который имеет правильное значение тиков, чтобы отразить это. То есть, вызов getUTCHours() и т. Д. В дату вернет то же значение, что и на сервере, а вызов getHours() вернет значение в местном часовом поясе пользователя, как определено его браузером.

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

19 голосов
/ 30 октября 2009

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

19 голосов
/ 30 августа 2011

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

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

вывод:

15 октября 2008 г.

18 голосов
/ 17 июня 2011

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

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

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

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

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

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

16 голосов
/ 26 сентября 2010

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

var d = new Date(parseInt('/Date(1224043200000)/'.slice(6, -2)));
alert('' + (1 + d.getMonth()) + '/' + d.getDate() + '/' + d.getFullYear().toString().slice(-2));
15 голосов
/ 24 сентября 2009
var newDate = dateFormat(jsonDate, "mm/dd/yyyy"); 

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

15 голосов
/ 24 мая 2012

Просто чтобы добавить еще один подход, «подход тиков», который принимает 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 и т. Д.

9 голосов
/ 09 августа 2012

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

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;
}
9 голосов
/ 26 сентября 2010

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

"/Date(1276290000000+0300)/"

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

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

и т.д.

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

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

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

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

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

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

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

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