Вопрос по javascript, json – Преобразование .NET DateTime в JSON [дубликат]

230

Possible Duplicate:
How to format a JSON date?

Мой веб-сервис возвращает DateTime для вызова jQuery. Служба возвращает данные в следующем формате:

/Date(1245398693390)/

Как я могу преобразовать это в удобную для JavaScript дату?

Ваш Ответ

10   ответов
11

преобразование из 1970,1,1 нуждается в двойном округлении до нуля десятичных знаков, я думаю

DateTime d1 = new DateTime(1970, 1, 1);
DateTime d2 = dt.ToUniversalTime();
TimeSpan ts = new TimeSpan(d2.Ticks - d1.Ticks);
return Math.Round( ts.TotalMilliseconds,0);

на стороне клиента я использую

new Date(+data.replace(/\D/g, ''));
Error: User Rate Limit Exceedednew Date(+data.replace(/\D/g, ''));
242

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

var d = new Date();
d.setTime(1245398693390);
document.write(d);

О том, как отформатировать дату именно так, как вы хотите, смотрите в полном объемеDate ссылка наhttp://www.w3schools.com/jsref/jsref_obj_date.asp

Вы можете удалить нецифровые числа, проанализировав целое число (как предложено здесь):

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

Или применяя следующее регулярное выражение (от Tominator в комментариях):

var jsonDate = jqueryCall();  // returns "/Date(1245398693390)/"; 
var re = /-?\d+/; 
var m = re.exec(jsonDate); 
var d = new Date(parseInt(m[0]));
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
4

Думаю, я добавлю свое решение, которое я использовал.

Если вы используетеSystem.Web.Script.Serialization.JavaScriptSerializer() затем возвращенное время не будет зависеть от вашего часового пояса. Чтобы это исправить, вы также захотите использоватьdte.getTimezoneOffset() чтобы вернуть его в нужное время.

String.prototype.toDateFromAspNet = function() {
    var dte = eval("new " + this.replace(/\//g, '') + ";");
    dte.setMinutes(dte.getMinutes() - dte.getTimezoneOffset());
    return dte;
}

теперь вы просто позвоните

"/Date(1245398693390)/".toDateFromAspNet();

Fri Jun 19 2009 00:04:53 GMT-0400 (Eastern Daylight Time) {}

Error: User Rate Limit Exceeded
evalError: User Rate Limit Exceeded
Error: User Rate Limit ExceededevalError: User Rate Limit ExceededevalError: User Rate Limit Exceeded
17

Если вы передаетеDateTime из кода .Net в код JavaScript, C #:

DateTime net_datetime = DateTime.Now;

JavaScript обрабатывает его как строку, как"/Date(1245398693390)/":

Вы можете преобразовать это как fllowing:

// convert the string to date correctly
var d = eval(net_datetime.slice(1, -1))

или же:

// convert the string to date correctly
va,r d = eval("/Date(1245398693390)/".slice(1, -1))
evalError: User Rate Limit Exceeded
6

Вы можете попробовать стороннюю библиотеку, какjson.net  На сайте проекта есть документация. Это говорит, что требует .net 3.5.

В противном случае есть еще один, называемый Nii.json, который, как я считаю, является портом из Java. Я нашел ссылку на него наэтот блог

77

Я использовал этот метод некоторое время:

using System;

public static class ExtensionMethods {
  // returns the number of milliseconds since Jan 1, 1970 (useful for converting C# dates to JS dates)
  public static double UnixTicks(this DateTime dt)
  {
    DateTime d1 = new DateTime(1970, 1, 1);
    DateTime d2 = dt.ToUniversalTime();
    TimeSpan ts = new TimeSpan(d2.Ticks - d1.Ticks);
    return ts.TotalMilliseconds;
  }
}

Предполагая, что вы разрабатываете против .NET 3.5, это прямое копирование / вставка. Вы можете иначе портировать это.

Вы можете инкапсулировать это в объект JSON или просто записать его в поток ответов.

На стороне Javascript / JSON вы конвертируете это в дату, просто передавая галочки в новый объект Date:

jQuery.ajax({
  ...
  success: function(msg) {
    var d = new Date(msg);
  }
}
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
33

Чтобы проанализировать строку даты, используя String.replace с обратной ссылкой:

var milli = "/Date(1245398693390)/".replace(/\/Date\((-?\d+)\)\//, '$1');
var d = new Date(parseInt(milli));
Error: User Rate Limit Exceedednew Date(parseInt(milli.substr(6)));Error: User Rate Limit Exceeded
7

http://stevenlevithan.com/assets/misc/date.format.js

var date = eval(data.Data.Entity.Slrq.replace(/\/Date\((\d )\)\//gi, "new Date($1)"));  
alert(date.format("yyyy-MM-dd HH:mm:ss"));  
alert(dateFormat(date, "yyyy-MM-dd HH:mm:ss"));  
5

Все предыдущие ответы утверждают, что вы можете сделать следующее:

var d = eval(net_datetime.slice(1, -1));

Однако это не работает ни в Chrome, ни в FF, потому что то, что оценивается буквально, таково:

// returns the current timestamp instead of the specified epoch timestamp
var d = Date([epoch timestamp]);

Правильный способ сделать это:

var d = eval("new " + net_datetime.slice(1, -1)); // which parses to

var d = new Date([epoch timestamp]); 
evalError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
16

Если у вас возникли проблемы с получением информации о времени, вы можете попробовать что-то вроде этого:

    d.date = d.date.replace('/Date(', '');
    d.date = d.date.replace(')/', '');  
    var expDate = new Date(parseInt(d.date));
Error: User Rate Limit ExceededparseInt('1234abcd') returns 1234Error: User Rate Limit Exceeded

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