如何格式化Microsoft JSON日期?

我正在使用jQuery对Ajax进行第一次破解。我正在将我的数据放到我的页面上,但是我在为Date数据类型返回的JSON数据方面遇到了一些问题。基本上,我得到了一个看起来像这样的字符串:

/Date(1224043200000)/

从一个全新的人到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;}

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

792433 次浏览

JSON中没有内置日期类型。这看起来像某个纪元的秒数/毫秒数。如果您知道纪元,您可以通过添加适量的时间来创建日期。

如果你用JavaScript说,

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

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

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

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

然后您可以使用JavaScript日期格式脚本(缩小和gzip压缩时为1.2 KB)按需显示它。

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

检查日期ISO标准;有点像这样:

yyyy.MM.ddThh:mm

它变成了2008.11.20T22:18

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

有没有其他选择不使用jQuery库?

我最终将“”字符添加到Panos的正则表达式中,以摆脱Microsoft序列化器在将对象写入内联脚本时生成的字符:

因此,如果您在C#代码隐藏中有一个属性,则类似于

protected string JsonObject { get { return jsSerialiser.Serialize(_myObject); }}

在你的aspx中你有

<script type="text/javascript">var myObject = '<%= JsonObject %>';</script>

你会得到类似

var myObject = '{"StartDate":"\/Date(1255131630400)\/"}';

注意双引号。

为了将其转换为ava将正确反序列化的形式,我使用了:

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的功能来创建“Auto”泛型。这有点懒,但我喜欢它并且它有效。只是注意:Profile是我为我的Web应用程序项目创建的自定义类。

不要想太多。就像我们几十年来一直做的那样,以秒(或毫秒)的数量传递与实际标准纪元1970年1月1日午夜GMT/UTC/&c的数字偏移。JavaScript喜欢它,Java喜欢它,C喜欢它,互联网喜欢它。

原始示例:

/Date(1224043200000)/

不反映WCF使用内置JSON序列化通过WCF REST发送日期时使用的格式。(至少在. 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)/

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

修改后的regex:

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

它更加急切,并抓取括号之间的所有内容,而不仅仅是第一个数字。生成的time sinze 1970,加上时区偏移量都可以被送入ava以获得日期对象。

替换的JavaScript结果行是:

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

对于那些使用Newtonsoft<强>Json.NET的人,请通过IE8中的本地JSON,Firefox 3.5 plusJson.NET阅读如何做到这一点。

此外,关于更改Json.NET写入的日期格式的留档也很有用:使用Json.NET序列化日期

对于那些太懒的人,这里是快速步骤。由于JSON有一个松散的DateTime实现,您需要使用IsoDateTimeConverter()。请注意,由于Json.NET4.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);

eval()不是必需的。这将正常工作:

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

substr()函数取出/Date(部分,parseInt()函数获取整数并忽略末尾的)/。结果数字传递给Date构造函数。


我故意省略了基数(parseInt的第二个参数);见我在下面的评论

此外,我完全同意Rory的评论:ISO-8601日期优于旧格式-因此这种格式通常不应该用于新开发。

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

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

Moools解决方案:

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

需要mooTools-more。在Firefox 3.6.3和IE 7.0.5730.13上使用mooTools-more测试1.2.3.1

仅供参考,对于任何在服务器端使用Python的人:datetime.datetime(). ctime()返回一个本机可被“new Date()”解析的字符串。也就是说,如果你创建了一个新的datetime.datetime实例(例如datetime.datetime.now),该字符串可以包含在JSON字符串中,然后该字符串可以作为第一个参数传递给Date构造函数。我还没有发现任何异常,但我也没有太严格地测试它。

我得到的日期是这样的:

"/Date(1276290000000+0300)/"

在一些示例中,日期的格式略有不同:

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

所以我想出了以下RegExp:

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

最后的代码是:

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

希望有帮助。

更新:我从微软找到了这个链接:如何使用JSON序列化日期?

这似乎是我们都在寻找的人。

张贴在真棒线程:

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

DateTime的自定义JavaScriptConver?

我必须强调Roy Tinker评论的准确性。这不是合法的JSON。这是服务器上的一个肮脏、肮脏的黑客攻击,旨在在它成为JavaScript问题之前将问题删除。它会窒息JSON解析器。我用它来启动,但我不再使用它了。然而,我仍然觉得最好的答案在于改变服务器格式的方式,例如,其他地方提到的ISO。

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

您的帖子的答案提供了将日期手动转换为JavaScript日期的功能。我对jQuery的$.parseJSON()进行了一点扩展,因此它能够在您指示它时自动解析日期。它处理ASP.NET格式化日期(/Date(12348721342)/)以及浏览器(以及json2.js等库)中原生JSON函数支持的ISO格式化日期(2010-01-01T12.34.56.789Z)。

无论如何。如果您不想一遍又一遍地重复您的日期转换代码,我建议您阅读这篇博客文章并获取使您的生活更轻松的代码。

更新中

我们有一个内部UI库,它必须处理微软的ASP.NET内置JSON格式,比如/Date(msecs)/,最初在这里询问,以及大多数JSON的日期格式,包括JSON.NET,比如2014-06-22T00:00:00.0。此外,我们需要处理oldIE无法处理除了小数点后3位以外的任何事情

我们首先检测我们正在使用的日期类型,将其解析为一个普通的JavaScriptDate对象,然后将其格式化。

1)检测Microsoft Date格式

// 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)解析MS日期格式:

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

4)解析ISO日期格式。

我们至少有一种方法可以确保我们正在处理标准的ISO日期或修改为始终具有三毫秒位置(见上文)的ISO日期,因此代码因环境而异。

4a)解析标准ISO Date格式,应对旧IE的问题:

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 8m[7].charAt(0) != '.' ||    // ms portion, no tz offset, or no ms portion, Z!m[8] ||                    // ms portion, no tz offsetm[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 {// localvar 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);elsereturn null;
return formatDate(d);}

下面的旧答案对于将此日期格式绑定到jQuery自己的JSON解析中很有用,因此您可以获得Date对象而不是字符串,或者如果您仍然停留在jQuery<1.5中。

旧答案

如果您将jQuery 1.4的Ajax函数与ASP.NETMVC一起使用,您可以使用以下命令将所有DateTime属性转换为Date对象:

// OncejQuery.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/

不幸的是,您必须切换到较旧的ava路由,以便让Dates就地进行全局解析-否则您需要在解析后根据具体情况进行转换。

在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(您应该这样做)的逻辑;然后消费者会获得一个JavaScriptDate对象,该对象具有适当的滴答值来反映这一点。也就是说,在日期上调用getUTCHours()等将返回与在服务器上相同的值,调用getHours()将返回用户本地时区中由浏览器确定的值。

这没有考虑带时区偏移的WCF格式,尽管这相对容易添加。

这些答案都有一个共同点:它们都将日期存储为单个值(通常是字符串)。

另一种选择是利用JSON的固有结构,并将日期表示为数字列表:

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

当然,你必须确保对话的两端都同意格式(年、月、日),以及哪些字段是日期……但它的优点是完全避免了日期到字符串的转换问题。它都是数字——根本没有字符串。此外,使用顺序:年、月、日还可以按日期进行正确排序。

只是在这里跳出盒子思考——JSON日期不必存储为字符串。

这样做的另一个好处是,您可以通过利用CouchDB处理数组值查询的方式轻松(有效)选择给定年份或月份的所有记录。

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

使用jQuery UI datepicker-只有当你已经包含jQuery UI时才有意义:

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

输出:

2008年10月15日

只是为了在这里添加另一种方法,WCF采用的“滴答方法”很容易出现时区问题,如果你不非常小心,例如这里和其他地方所描述的。所以我现在使用ISO 8601格式,. NET和JavaScript都适当支持,包括时区偏移。以下是详细信息:

在WCF/. NET中:

其中CreationDate是System. DateTime;ToString("o")正在使用. NET的往返格式说明符生成符合ISO 8601的日期字符串

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

在javascript

在检索JSON之后,我使用接受ISO 8601日期字符串的Date构造函数将日期修复为JavaSript Date对象…

$.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方法,比如toDateStringtoLocaleString等。

在您的页面中添加jQueryUI插件:

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

下面是一个解析JSON日期的非常简单的解决方案。根据您的要求使用以下函数。您只需要将获取的JSON格式Date作为参数传递给以下函数:

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' + mif (d.getDate() < 10)day = '0' + d.getDate()elseday = 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' + mif (d.getDate() < 10)day = '0' + d.getDate()elseday = 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;}

将JSON日期转换为JavaScript日期很容易:

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

点击这里查看演示

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"

您还可以使用JavaScript库moment.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');

我还不得不寻找这个问题的解决方案,最终我遇到了moment.js这是一个很好的库,可以解析这种日期格式等等。

var d = moment(yourdatestring)

它救了我一些头痛,所以我想我会与你分享。:)
你可以在这里找到更多关于它的信息:http://momentjs.com/

如果. NET返回…

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

然后在JavaScript中…

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

作为旁注,KendoUI支持转换Microsoft JSON日期。所以,如果你的项目有“KendoUI”的引用,你可以简单地使用

var newDate = kendo.parseDate(jsonDate);

这使用正则表达式,它也可以工作:

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

您可以尝试使用的另一个regex示例:

var mydate = json.datevar date = new Date(parseInt(mydate.replace(/\/Date\((-?\d+)\)\//, '$1');mydate = date.getMonth() + 1 + '/' + date.getDate() + '/' + date.getFullYear();

date.getMonth()返回一个整数0-11,所以我们必须加1才能得到正确的月份数字

这也可以帮助你。

 function ToJavaScriptDate(value) { //To Parse Date from the Returned Parsed Datevar pattern = /Date\(([^)]+)\)/;var results = pattern.exec(value);var dt = new Date(parseFloat(results[1]));return (dt.getMonth() + 1) + "/" + dt.getDate() + "/" + dt.getFullYear();}

我可以建议的最简单的方法是在JS上使用regex:

//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.从日期字符串中检索时间戳。

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

我使用这个简单的函数从Microsoft JSON Date获取日期

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

replace(/\D+/g, '')将删除除数字以外的所有字符

parseInt将字符串转换为数字

用法

$scope.ReturnDate = getDateValue(result.JSONDateVariable)

试试这个…

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

getyear()返回年份-1900,这已经被弃用了一段时间,最好使用getFullyear()

TLDR:您无法可靠地转换该仅限日期的值,请发送字符串代替…

或者至少这是几乎所有这些答案应该如何开始。

这里正在发生许多转换问题。

这是一个没有时间的约会

每个人似乎都忽略了这个问题中有多少个尾随零——它几乎肯定是从一个没有时间的日期开始的:

/Date(1224043200000)/

当从javascript控制台作为新的Date执行时(许多答案的基础)

new Date(1224043200000)

你得到:

输入图片描述

最初的asker可能在EST中,并且有一个纯日期(sql)或一个带有午夜的DateTime(不是DateTimeOffset)。

换句话说,这里的意图是时间部分毫无意义。然而,如果浏览器在与生成它的服务器相同的时区执行此操作,则无关紧要,并且大多数答案都有效。

位时区

但是,如果您在具有不同时区(例如PST)的机器上执行上述代码:

输入图片描述

您会注意到我们现在是另一个时区的天后。这不会通过更改序列化程序来修复(它仍然会以iso格式包含时区)

问题

Date(sql)和DateTime(. net)没有时区,但是一旦你将它们转换为时区(在这种情况下,javascript通过json推断),. net中的默认操作是假设当前时区。

序列化创建的数字是自Unix纪元以来的毫秒或:

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

这是javascript中new Date()作为参数的东西。Epoch来自UTC,所以现在无论你是否愿意,你都可以在那里获得时区信息。

可能的解决方案:

在序列化对象上创建一个只代表日期的字符串属性可能更安全——带有“10/15/2008”的字符串不太可能让其他人对这种混乱感到困惑。尽管即使在那里,你也必须在解析方面小心:https://stackoverflow.com/a/31732581

然而,本着对所提问题提供答案的精神,如下所示:

function adjustToLocalMidnight(serverMidnight){var serverOffset=-240; //injected from model? <-- DateTimeOffset.Now.Offset.TotalMinutesvar localOffset=-(new Date()).getTimezoneOffset();return new Date(date.getTime() + (serverOffset-localOffset) * 60 * 1000)}
var localMidnightDate = adjustToLocalMidnight(new Date(parseInt(jsonDate.substr(6))));

如果您使用静态编程语言,那么这将解决您的问题。

val dataString = "/Date(1586583441106)/"val date = Date(Long.parseLong(dataString.substring(6, dataString.length - 2)))