Jquery 如何格式化Microsoft JSON日期?
我第一次尝试jQuery。我正在将数据放到我的页面上,但是对于日期数据类型返回的JSON数据,我遇到了一些问题。基本上,我得到了一个字符串,看起来像这样:Jquery 如何格式化Microsoft JSON日期?,jquery,asp.net,ajax,json,Jquery,Asp.net,Ajax,Json,我第一次尝试jQuery。我正在将数据放到我的页面上,但是对于日期数据类型返回的JSON数据,我遇到了一些问题。基本上,我得到了一个字符串,看起来像这样: /Date(1224043200000)/ yyyy.MM.ddThh:mm 从一个对JSON完全陌生的人-我如何将其格式化为短日期格式?这应该在jQuery代码中的某个地方处理吗?我使用$.datepicker.formatDate()尝试了jQuery.UI.datepicker插件,但没有成功 仅供参考:以下是我结合以下答案提出的解
/Date(1224043200000)/
yyyy.MM.ddThh:mm
从一个对JSON完全陌生的人-我如何将其格式化为短日期格式?这应该在jQuery代码中的某个地方处理吗?我使用$.datepicker.formatDate()
尝试了jQuery.UI.datepicker
插件,但没有成功
仅供参考:以下是我结合以下答案提出的解决方案:
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;
}
此解决方案从回调方法获取我的对象,并使用日期格式库在页面上正确显示日期。中没有内置日期类型。这看起来像是某个历元的秒/毫秒数。如果您知道纪元,您可以通过添加适当的时间来创建日期。如果您使用JavaScript
var thedate = new Date(1224043200000);
alert(thedate);
您将看到它是正确的日期,您可以在JavaScript代码中的任何地方将其用于任何框架。您可以使用它从JSON获取日期:
var date = eval(jsonDate.replace(/\/Date\((\d+)\)\//gi, "new Date($1)"));
然后,您可以使用脚本(缩小和压缩时为1.2kb)根据需要显示它。检查ISO标准的日期;有点像这样:
/Date(1224043200000)/
yyyy.MM.ddThh:mm
它变为2008.11.20T22:18
var newDate = dateFormat(jsonDate, "mm/dd/yyyy");
如果不使用jQuery库,还有其他选项吗?我最后将“字符”添加到Panos的正则表达式中,以消除Microsoft serializer在将对象写入内联脚本时生成的字符:
所以如果你的C#中有一个属性
protected string JsonObject { get { return jsSerialiser.Serialize(_myObject); }}
var myObject = '{"StartDate":"\/Date(1255131630400)\/"}';
在你的aspx里你有
<script type="text/javascript">
var myObject = '<%= JsonObject %>';
</script>
注意双引号
为了将其转换为eval将正确反序列化的表单,我使用了:
myObject = myObject.replace(/"\/Date\((\d+)\)\/"/g, 'new Date($1)');
我使用它,为了使用它,我补充道
String.prototype.evalJSONWithDates = function() {
var jsonWithDates = this.replace(/"\/Date\((\d+)\)\/"/g, 'new Date($1)');
return jsonWithDates.evalJSON(true);
}
一篇迟到的帖子,但是对于那些搜索过这篇帖子的人来说 想象一下:
[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是我为我的web应用程序项目创建的自定义类。不要想太多。就像我们几十年来所做的那样,以秒(或毫秒)为单位传递一个从事实上的标准纪元1970年1月1日午夜GMT/UTC/&c的数字偏移量从这个时代开始。JavaScript喜欢它,Java喜欢它,C喜欢它,互联网也喜欢它。原始示例:
/Date(1224043200000)/
使用内置JSON序列化通过WCF REST发送日期时,不反映WCF使用的格式。(至少在.NET 3.5,SP1上)
我发现这里的答案很有用,但需要对正则表达式稍加修改,因为时区GMT偏移量似乎被附加到WCF JSON中返回的数字(自1970年以来)上
在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)");
对于使用Newtonsoft的用户,请阅读如何通过 另外,Json.NET编写的关于更改日期格式的文档也很有用: 对于那些太懒惰的人,这里有一些快速的步骤。由于JSON有一个松散的日期时间实现,您需要使用
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);
$(“”).text(isodaterevivier(item.fieldName).toLocaleString()).appendTo(“#”+divName);
eval()
不是必需的。这可以正常工作:
var date = new Date(parseInt(jsonDate.substr(6)));
substr()
函数取出/Date(
部分,parseInt()
函数获取整数,并忽略结尾处的)/
。生成的数字被传递到日期
构造函数中
我故意省略了基数(parseInt的第二个参数);请参阅 此外,我完全同意:ISO-8601日期优先于此旧格式-因此此格式通常不应用于新开发 对于ISO-8601格式的JSON日期,只需将字符串传递到
Date
构造函数:
var date = new Date(jsonDate); //no ugly parsing needed; full timezone support
Mootools解决方案:
new Date(Date(result.AppendDts)).format('%x')
需要更多mootools。在Firefox 3.6.3和IE 7.0.5730.13上使用mootools-1.2.3.1-more进行测试,供任何在服务器端使用Python的人参考:datetime.datetime().ctime()返回一个本机可由“new Date()”解析的字符串。也就是说,如果您创建了一个新的datetime.datetime实例(例如使用datetime.datetime.now),该字符串可以包含在JSON字符串中,然后该字符串可以作为第一个参数传递给日期构造函数。我还没有发现任何异常,但我也没有对其进行过严格的测试。我得到的日期如下所示:
"/Date(1276290000000+0300)/"
在某些示例中,日期的格式略有不同:
"/Date(12762900000000300)/"
"Date(1276290000000-0300)"
等等
因此,我提出了以下RegExp:
/\/+Date\(([\d+]+)\)\/+/
最后的代码是:
var myDate = new Date(parseInt(jsonWcfDate.replace(/\/+Date\(([\d+-]+)\)\/+/, '$1')));
希望能有帮助
更新:
我从Microsoft找到此链接:
这似乎是我们所有人都在寻找的主题。在Aweasome thread中发布:
var d = new Date(parseInt('/Date(1224043200000)/'.slice(6, -2)));
alert('' + (1 + d.getMonth()) + '/' + d.getDate() + '/' + d.getFullYear().toString().slice(-2));
这是令人沮丧的。我的解决方案是从ASP.NET的JavaScriptSerializer生成的值中解析出“/和/”,这样,尽管JSON可能没有日期文字,但它仍然被浏览器解释为日期,这正是我真正想要的:
{“myDate”:date(123456789)}
我必须强调Roy Tinker评论的准确性。这不是合法的JSON。这是对ser的肮脏、肮脏的攻击
function parseMSDate(s) {
// Jump forward past the /Date(, parseInt handles the rest
return new Date(parseInt(s.substr(6)));
}
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;
}
function parseIsoDate(s) {
return new Date(s);
}
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;
}
function parseDate(s) {
var d;
if (looksLikeMSDate(s))
d = parseMSDate(s);
else if (looksLikeIsoDate(s))
d = parseIsoDate(s);
else
return null;
return formatDate(d);
}
// Once
jQuery.parseJSON = function(d) {return eval('(' + d + ')');};
$.ajax({
...
dataFilter: function(d) {
return d.replace(/"\\\/(Date\(-?\d+\))\\\/"/g, 'new $1');
},
...
});
(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);
}
}
});
}());
{ "name":"Nick",
"birthdate":[1968,6,9] }
var obj = eval('(' + "{Date: \/Date(1278903921551)\/}".replace(/\/Date\((\d+)\)\//gi, "new Date($1)") + ')');
var dateValue = obj["Date"];
$.datepicker.formatDate('MM d, yy', new Date(parseInt('/Date(1224043200000)/'.substr(6))));
new MyInfo {
CreationDate = r.CreationDate.ToString("o"),
};
$.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());
}
)
function DateFormate(dateConvert) {
return $.datepicker.formatDate("dd/MM/yyyy", eval('new ' + dateConvert.slice(1, -1)));
};
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;
}
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();
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;
}
moment.lang('de');
var d = moment(yourdatestring)
return DateTime.Now.ToString("u"); //"2013-09-17 15:18:53Z"
var x = new Date("2013-09-17 15:18:53Z");
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();
}