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

1817

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

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

  • 25
    Это может быть интересно: hanselman.com/blog/…
  • 6
    Формат /Date(...)/ специфичен для встроенного в Microsoft формата даты JSON - он не является частью какого-либо стандарта, а JSON, происходящий из Javascript, имеет стандарт: в формате ISO Javascript указывает: stackoverflow.com/a / 15952652/176877 Итак, этот вопрос относится к формату Microsoft JSON Date. Я изменил название, чтобы уточнить это.
Показать ещё 4 комментария
Теги:

39 ответов

1508
Лучший ответ

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

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

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

РЕДАКТИРОВАТЬ: Я намеренно упустил основание (второй аргумент parseInt); см. мой комментарий ниже. Кроме того, я полностью согласен с комментарием Rory: даты ISO-8601 предпочтительнее этого старого формата, поэтому этот формат обычно не должен использоваться для новой разработки. См. Отличную библиотеку Json.NET для отличной альтернативы, которая сериализует даты с использованием формата ISO-8601.

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

var date = new Date(jsonDate); //no ugly parsing needed; full timezone support
  • 0
    Функция замены безопаснее, если MS решит изменить формат.
  • 4
    @Broam: оба метода (функция замены и этот ответ) должны были бы измениться, если MS изменяет формат.
Показать ещё 14 комментариев
117

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

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

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

  • 0
    Спасибо за ссылку на библиотеку. Я смог использовать это, чтобы получить мой короткий формат даты.
  • 0
    Я думаю, что-то не так в этой линии JS. Последние две косые черты действуют как комментарии. Я не знаю достаточно регулярных выражений, чтобы это исправить.
Показать ещё 14 комментариев
86

Для тех, кто использует Newtonsoft Json.NET, прочитайте, как это сделать с помощью Встроенный 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);
  • 6
    Конструктор JavaScript Date может проанализировать строку для вас: new Date("2009-04-12T20:44:55")
  • 5
    Предупреждение - форматы конструктора Date () и синтаксический анализ не являются стандартными до ECMAScript 6. Например, IE 9 рассматривает дату, которую вы предоставляете конструктору, как местное время, даже если оно находится в IS0-8601, что подразумевается как UCT везде. Не полагайтесь на конструктор даты, если вы поддерживаете старые браузеры. codeofmatt.com/2013/06/07/...
Показать ещё 1 комментарий
57

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

/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

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

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

replace(/\/Date\((.*?)\)\//gi, "new Date($1)");
  • 10
    это неправильно, новая Дата (1224043200000-0600) только вычтет 600 из даты, в данном случае 600 миллисекунд, а не 6 часов, как должно.
  • 0
    @ariel: Посмотрите на Javascript Date от миллисекунд и часового пояса.
Показать ещё 3 комментария
53

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

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

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

50

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

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

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

  • 2
    Я бы тоже так подумал, за исключением того, что это: var thedate = / Date (1224043200000) /; по крайней мере для меня...
  • 2
    Date () и Date (1224043200000) дают одинаковый результат как в Chrome, так и в Firefox. Не уверен, что это работает в старых браузерах, но этот ответ не работает в браузерах сейчас.
Показать ещё 2 комментария
47

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

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

Результат - "10/15/2008"

  • 0
    Просто улучшение для метода выше. 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); дата возврата;} дата отформатирована в ДДММыыыы. Ура!
31

обновленный

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

Старый ответ

Если вы используете функцию jQuery 1.4 Ajax с 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 анализировать глобально на месте - в противном случае вам нужно преобразовать их в более индивидуальный пост-анализ.

22

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

var d = moment(yourdatestring)

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

21

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

Итак, если у вас есть свойство в С# code-behind, что-то вроде

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

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

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

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

  • 0
    Так же, как примечание: для работы кода необходимо создать метод startWith типа string
17

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

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

вывод:

15 октября 2008 г.

17

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

16

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

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

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

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

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

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

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

Проводка в awesome thread:

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) - см. Мой ответ ниже.
14

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

В WCF/.NET:

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

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

В JavaScript

Сразу после извлечения JSON я приступаю к установке дат для объектов Date JavaSript с использованием конструктора 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 и т.д.

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

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

9
var obj = eval('(' + "{Date: \/Date(1278903921551)\/}".replace(/\/Date\((\d+)\)\//gi, "new Date($1)") + ')');
var dateValue = obj["Date"];
8

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

yyyy.MM.ddThh:mm

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

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

Ниже представлено довольно простое решение для синтаксического анализа дат 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;
}
  • 0
    Вы сделали мой день, спасибо
7

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

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

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

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

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

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

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

"/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 () - см. Мой ответ ниже.
  • 0
    Также посмотрите на Javascript Date от миллисекунд и часового пояса
6

Вы также можете использовать javascript library.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');
6

Решение Mootools:

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

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

6

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

Представьте себе следующее:

    [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");
    }

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

  • 0
    поэтому каждый раз, когда вы добавляете новую роль [Authorize (Roles = "Human Resources")], вам приходится компилировать и развертывать? Вот это да.... :)
  • 1
    Если это служба JSON, то перенаправление кажется неправильным. Я бы вернул 404 Not Found, если ключ ввода настолько недействителен, что его невозможно найти (а также 404, если он действительно не найден). Когда мои пользователи не вошли в систему, я возвращаю 403 Запрещено.
Показать ещё 1 комментарий
5

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

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

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

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

А потом в JavaScript...

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

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

4

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

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

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

Еще один пример регулярного выражения, который вы можете попробовать:

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, чтобы получить правильный номер месяца

1

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

var date = new Date(parseInt(/^\/Date\((.*?)\)\/$/.exec(jsonDate)[1], 10));
1

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

var newDate = kendo.parseDate(jsonDate);
0

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

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.getYear();
            var standardDate = (getMonth<10 ? '0' : '') + getMonth + '/' + (getDay<10 ? '0' : '') + getDay + '/' + getYear;
            return standardDate;
        }
0

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

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

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

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

Применение

var $scope.ReturnDate = getDateValue(result.JSONDateVariable)
0

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

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

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

var expDate = new Date(parseInt(s));
-4

Ваш 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"
    }
);
  • 0
    .NET возвращает это по-другому.
  • 0
    как это вернуть?
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню