jquery - 格式化Microsoft JSon日期?

  显示原文与译文双语对照的内容

我在使用jQuery第一次破解 Ajax 。 我将数据放到我的页面上,但对于日期数据类型返回的JSON数据,我遇到了一些问题。 基本上,我得到了一个类似这样的字符串:


/Date(1224043200000)/

从一个完全新的JSON - 如何将它的格式化为短日期格式? 是否应该在jQuery代码的某个地方处理? 使用 $.datepicker.formatDate() 没有任何success,我试过了 jQuery.UI.datepicker plugin.

注意:这里是我使用的答案组合的解决方案:


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

这里解决方案从回调方法获取了我的对象,并使用日期格式库正确地在页面上显示了日期。

时间:

不需要 Eval 。这将正常工作:


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

substr函数取出"/date ( )"部分,parseInt函数获取整数并忽略")/"位于末尾。 生成的数字被传递到日期构造函数。

编辑:我故意省略了基数(的钕 2参数设置为 parseInt ) ;参见下面的评论。 rory的以注释,另外,我完全 agree: ISO-8601日期优于旧格式 --,因此这种格式通常不应用于新的开发。 查看优秀的Json.NET 库,使用ISO-8601格式来序列化日期。

对于ISO-8601格式化的JSON日期,只需将字符串传递到日期构造函数:


var date = new Date(jsonDate);//no ugly parsing needed; full timezone support

你可以使用它从JSON获取日期:


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

然后你可以使用一个JavaScript日期格式脚本( 缩小和压缩时 1.2 KB ) 来显示它。

对于那些使用 Newtonsoft Json.NET,认真研读如何做到通过 原生JSON在 ie 8 测试版 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);

原始示例:


/Date(1224043200000)/

不反映WCF使用内置的JSON序列化通过 WCF REST发送日期时所用的格式。 ( 至少在. NET 3.5,SP1 )

在WCF中json,我找到该问题的答案有所帮助,不过稍有编辑到 正规表达式 是必需的,因为似乎时区GMT偏移会依次被附加到返回的数值是

在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; }
. . .
}

当"编写脚本脚本"从服务返回为Json时,该值是:


/Date(1224043200000-0600)/

注意作为值的一部分包含的时区偏移量。

修改后的正规表达式:


//Date((.*?))//gi

难度比急切,并抓取parens之间的所有内容,而不仅仅是第一个数字。 结果时间 sinze 1970,加上时区偏移量都可以输入eval来获取日期对象。

替换的JavaScript结果行是:


replace(//Date((.*?))//gi,"new Date($1)");

不要重复- 使用 $.parseJSON() 自动执行日期转换

对你的帖子的答复将手动日期转换为JavaScript日期。 我已经扩展了jquery的$.parseJSON() 一点点,所以它可以在你指示它的时候自动分析日期。 它处理 ASP.NET 格式化的日期日期( /Date(12348721342)/ ) 以及ISO格式的日期( 2010-01-01T12.34.56.789Z ),它们是浏览器( 和像 json2.js 这样的库) 中的原生JSON函数所支持的。

无论如何,如果你不想重复你的日期转换代码,我建议你阅读这个博客文章,并获得代码,让你的生活变得更加简单。

如果你用JavaScript说的话


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

你将看到它是正确的日期,你可以在任何JavaScript代码中使用任何框架。

Click单击这里查看演示

磅的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"

已经更新

我们有一个内部的用户界面库,它必须同时应付 ASP.NET 微软内置的JSON格式,像 /Date(msecs)/,问到了这里原本的,并且大多数日期JSON格式包括 JSON.NET's, 像 2014-06-22T00:00:00.0 。 另外我们需要应付 oldie 无能力,以应付它,其中只包含小数位 3

我们首先检测我们消耗的日期,将它解析为普通的JavaScript Date 对象,然后格式化。

1 ) 检测Microsoft日期格式


//Handling of Microsoft AJAX Dates, formatted like '/Date(01238329348239)/'
function looksLikeMSDate(s) {
 return/^/Date(/.test(s);
}

2 ) 检测ISO日期格式


var isoDateRegex =/^(dddd)-(dd)-(dd)T(dd):(dd):(dd)(.dd?d?)?([+-]dd:dd|Z)?$/;

function looksLikeIsoDate(s) {
 return isoDateRegex.test(s);
}

3 ) 分析MS日期格式:


function parseMSDate(s) {
//Jump forward past the/Date(, parseInt handles the rest
 return new Date(parseInt(s.substr(6)));
}

4 ) 分析ISO日期格式。

我们至少有一个方法来确定我们正在处理标准的ISO日期或者ISO日期修改为总是有3 毫秒的地方,所以代码不同于环境。

分析标准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's 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 ) 使用固定的3 毫秒小数位来解析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);
}

在jQuery中 <1.5 somehow,以下旧答案是有用等成品这个日期的格式引入到自己的这次新的JSON解析,以便你获取日期对象而不是字符串,或者如果你仍然继续卡住

旧答案

如果你使用的是jQuery的函数与 ASP.NET 1.4 Ajax MVC,你可以将所有日期时间属性变成日期对象与:


//Once
jQuery.parseJSON = function(d) {return eval('(' + d + ')');};

$.ajax({
. . .
 dataFilter: function(d) {
 return d.replace(/"/(Date(-?d+))/"/g, 'new $1');
 },
. . .
});

在 jQuery 1.5中,你可以避免使用Ajax调用中的转换器选项全局覆盖 parseJSON 方法。

http://api.jquery.com/jQuery.ajax/

在一个更逐个解决不幸的是你必须 switch 到原先的eval路线为了得到日期选项可以用来剖析全球 in-place - 不然你就得转换。

于在编写相关对象转换为内联 script, panos的我最终决定将"添加字符转换为正则表达式来摆脱由微软serializer:生成的那些

因此,如果你的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);
}

...