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

Я не смог получить доступ к удаленным машинам, если у меня не было UAC .

Это должно быть сделано локально, либо с панели управления, либо с помощью следующего с помощью cmd:

reg.exe ADD HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /v EnableLUA /t REG_DWORD /d 0 /f

Пока включена опция UAC , убедитесь, что вы запустите cmd в качестве администратора.

1920
задан 16 revs, 9 users 40% 14 November 2016 в 20:14
поделиться

26 ответов

eval() не является необходимым. Это будет работать нормально:

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

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


Я намеренно пропустил основание (2-й аргумент parseInt); см. мой комментарий ниже .

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

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

var date = new Date(jsonDate); //no ugly parsing needed; full timezone support
1645
ответ дан 13 revs, 7 users 59% 14 November 2016 в 20:14
поделиться

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

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

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

var expDate = new Date(parseInt(s));
1
ответ дан 2 revs, 2 users 73%user1814380 14 November 2016 в 20:14
поделиться

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

var newDate = kendo.parseDate(jsonDate);
2
ответ дан 3 revs 14 November 2016 в 20:14
поделиться

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

yyyy.MM.ddThh:mm

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

9
ответ дан 2 revs, 2 users 55% 14 November 2016 в 20:14
поделиться

Если Вы скажете в JavaScript,

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

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

60
ответ дан 3 revs, 2 users 79% 14 November 2016 в 20:14
поделиться
var newDate = dateFormat(jsonDate, "mm/dd/yyyy"); 

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

15
ответ дан 4 revs, 4 users 71% 14 November 2016 в 20:14
поделиться

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

 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
ответ дан Ravi Mehta 14 November 2016 в 20:14
поделиться

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

7
ответ дан Kyle Alan Hale 14 November 2016 в 20:14
поделиться

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

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);
5
ответ дан Harun Diluka Heshan 14 November 2016 в 20:14
поделиться

Самым простым способом, который я могу предложить, является использование регулярного выражения в 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] 
2
ответ дан 2 revs 14 November 2016 в 20:14
поделиться

Ваш 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"
    }
);
-5
ответ дан nickf 14 November 2016 в 20:14
поделиться

Ниже приведено довольно простое решение для анализа дат 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
ответ дан 3 revs, 3 users 66% 14 November 2016 в 20:14
поделиться

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

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"

59
ответ дан 6 revs, 2 users 82%user2007801 14 November 2016 в 20:14
поделиться

Я получаю дату следующим образом:

"/Date(1276290000000+0300)/"

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

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

и т. Д.

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

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

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

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

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

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

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

9
ответ дан 2 revs 14 November 2016 в 20:14
поделиться

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

23
ответ дан johnstok 14 November 2016 в 20:14
поделиться

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

Представьте себе:

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

8
ответ дан Ray Linder 14 November 2016 в 20:14
поделиться

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

19
ответ дан 3 revs, 2 users 60% 14 November 2016 в 20:14
поделиться

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

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

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

9
ответ дан 4 revs, 2 users 64% 14 November 2016 в 20:14
поделиться

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

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

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

61
ответ дан 3 revs, 2 users 67% 14 November 2016 в 20:14
поделиться

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

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

Есть ряд проблем с конверсией, которые происходят здесь.

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

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

/Date(1224043200000)/

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

new Date(1224043200000)

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

enter image description here

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

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

Битовый часовой пояс

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

enter image description here

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

Проблема

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

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

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

Что-то, что new 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))));
1
ответ дан 2 revs 14 November 2016 в 20:14
поделиться

Можно использовать это для получения даты от JSON:

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

И затем можно использовать Формат даты JavaScript сценарий (1,2 КБ, когда уменьшено и gzipped) для отображения его, как Вы хотите.

125
ответ дан 2 revs, 2 users 80% 14 November 2016 в 20:14
поделиться

Для тех, кто использует 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);
94
ответ дан 3 revs, 3 users 77% 14 November 2016 в 20:14
поделиться

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

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

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

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

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

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

18
ответ дан 3 revs, 2 users 77% 14 November 2016 в 20:14
поделиться

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

Так что, если у вас есть свойство в C # 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);
}
23
ответ дан 2 revs, 2 users 84% 14 November 2016 в 20:14
поделиться

Первоначальный пример:

/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

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

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

replace(/\/Date\((.*?)\)\//gi, "new Date($1)");
66
ответ дан 22 November 2019 в 20:02
поделиться

Решение 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

8
ответ дан 22 November 2019 в 20:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: