Как мне отформатировать дату 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 ]

5 голосов
/ 09 марта 2018

В следующем коде. У меня

1. Получена метка времени из строки даты.

2. И проанализировал его в Int

3. Наконец создан Date с его использованием.

var dateString = "/Date(1224043200000)/";
var seconds = parseInt(dateString.replace(/\/Date\(([0-9]+)[^+]\//i, "$1"));
var date = new Date(seconds);
console.log(date);
2 голосов
/ 25 августа 2014

Используется регулярное выражение , и оно также работает:

var date = new Date(parseInt(/^\/Date\((.*?)\)\/$/.exec(jsonDate)[1], 10));
2 голосов
/ 06 августа 2015

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

var mydate = json.date
var date = new Date(parseInt(mydate.replace(/\/Date\((-?\d+)\)\//, '$1');
mydate = date.getMonth() + 1 + '/' + date.getDate() + '/' + date.getFullYear();

date.getMonth() возвращает целое число 0 - 11, поэтому мы должны добавить 1, чтобы получить правильное число месяцев

2 голосов
/ 27 ноября 2013

Как примечание, KendoUI поддерживает преобразование даты Microsoft JSON. Итак, если ваш проект имеет ссылку на «KendoUI», вы можете просто использовать

var newDate = kendo.parseDate(jsonDate);
2 голосов
/ 06 июля 2018

Попробуйте это ...

function formatJSONDate(jsonDate) {
            var date = jsonDate;
            var parsedDate = new Date(parseInt(date.toString().substring(6)));
            var newDate = new Date(parsedDate);
            var getMonth = newDate.getMonth() + 1;
            var getDay = newDate.getDay();
            var getYear = newDate.getFullYear(); 

            var standardDate = (getMonth<10 ? '0' : '') + getMonth + '/' + (getDay<10 ? '0' : '') + getDay + '/' + getYear;
            return standardDate;
        }

getYear () возвращает год - 1900, это уже давно устарело, лучше использовать getFullYear ()

2 голосов
/ 05 декабря 2017

Самый простой способ, который я могу предложить, это использовать регулярное выражение для JS как:

//Only use [0] if you are sure that the string matches the pattern
//Otherwise, verify if 'match' returns something
"/Date(1512488018202)/".match(/\d+/)[0] 
1 голос
/ 11 мая 2018

Я использую эту простую функцию для получения даты из Microsoft JSON Date

function getDateValue(dateVal) {
    return new Date(parseInt(dateVal.replace(/\D+/g, '')));
};

replace(/\D+/g, '') удалит все символы, кроме цифр

parseInt преобразует строку в число

Использование

$scope.ReturnDate = getDateValue(result.JSONDateVariable)
1 голос
/ 10 декабря 2012

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

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

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

var expDate = new Date(parseInt(s));
0 голосов
/ 31 мая 2019

TLDR: Вы не можете надежно преобразовать это значение только для даты, вместо этого отправьте строку ...

... или, по крайней мере, так должны начинаться почти все ответы.

Здесь возникает ряд проблем с конверсией.

Это дата без времени

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

/Date(1224043200000)/

При выполнении этого из консоли javascript в качестве новой даты (на основе многих ответов)

new Date(1224043200000)

Вы получаете:

enter image description here

Исходный запрос был, вероятно, в EST и имел чистую дату (sql) или DateTime (не DateTimeOffset) с полночью.

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

Бит по часовому поясу

Но, если вы выполнили приведенный выше код на машине с другим часовым поясом (например, PST):

enter image description here

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

Проблема

Date (sql) и DateTime (.net) не имеют часового пояса, но как только вы конвертируете их во что-то, что делает (javascript выводит через json в этом случае), действие по умолчанию в .net предполагает текущий часовой пояс.

Число, которое создает сериализация, составляет миллисекунды с начала эпохи Unix или:

(DateTimeOffset.Parse("10/15/2008 00:00:00Z") - DateTimeOffset.Parse("1/1/1970 00:00:00Z")).TotalMilliseconds;

Это то, что новый Date () в javascript принимает в качестве параметра. Epoch от UTC, так что теперь у вас есть информация о часовом поясе, хотите вы этого или нет.

Возможные решения:

Возможно, безопаснее создать строковое свойство для вашего сериализованного объекта, который будет представлять ТОЛЬКО дату - строка с "15.10.2008" вряд ли кого-нибудь еще спутает с этим беспорядком. Хотя даже там вы должны быть осторожны при разборе: https://stackoverflow.com/a/31732581

Однако, в духе предоставления ответа на заданный вопрос, как:

function adjustToLocalMidnight(serverMidnight){ 
  var serverOffset=-240; //injected from model? <-- DateTimeOffset.Now.Offset.TotalMinutes
  var localOffset=-(new Date()).getTimezoneOffset(); 
  return new Date(date.getTime() + (serverOffset-localOffset) * 60 * 1000)
}

var localMidnightDate = adjustToLocalMidnight(new Date(parseInt(jsonDate.substr(6))));
0 голосов
/ 16 октября 2008

Ваш 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"
    }
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...