【发布时间】:2012-07-17 16:36:57
【问题描述】:
简而言之,在我的 API 控制器和使用结果的 Javascript 之间,一个 Date 被转换成一个可爱的NaN
我的问题是,有人建议我在哪里以及如何修复这条长链。
第 1 步:使用 LINQ 从数据库中检索对象
return _dbContext.Points.Where(
point => point.AccountId == account.AccountId)
.OrderBy(point => point.EarnedOn).ToList();
在这里进行任何更改似乎都不合理。模型指定了一个 DateTime 字段,所以我们这里真的没有与字符串进行任何交互。
第 2 步:API 控制器发送响应
var points = _pointRepository.GetByUserName(userName);
return Request.CreateResponse(HttpStatusCode.OK, points);
我可以在这里指定如何解析日期吗?即使在服务器端处理也有意义吗?我想我可以遍历所有对象并手动设置它们,如下所示:
for (var i = 0; i < points.Count(); i++ )
{
points.ElementAt(i).EarnedOn = points.ElementAt(i).EarnedOn.ToUniversalTime();
}
但是谈论多个枚举!
第 3 步:客户端将 JSON 数据解析为 JS 对象,然后将字符串中的 Date 解析为 int 大大缩短了可读性
var points = JSON.parse(response);
for(i = 0; i < points.length; i++){
var date = Date.parse(points[i].EarnedOn);
在这一点上,我能做的只有这么多。我已经在第 2 步结束时将日期转换为字符串,而我的目标浏览器根本不知道如何使用 C# 的默认 DateTime.toString 格式(我假设这是正在发送的内容)。在某些浏览器中它可以工作,在其他浏览器中我得到NaN。
抱歉,解释太长了,但如果有人能指出他们将在何处以及如何应用修复程序,我将不胜感激。
====更新====
有问题的浏览器是 Android 的普通浏览器。我已经在我的手机和 BlueStacks 模拟器上对此进行了测试。两者都是最新的,并且两者都不起作用。它在 Chrome 中确实有效。
当时的JSON输出(切掉所有其他数据)如下:
"EarnedOn":"2012-05-10T00:00:00"
【问题讨论】:
-
这看起来很奇怪。您的目标是什么浏览器,JSON 的实际外观是什么样的?你能把那个贴出来吗?至少是日期表示。
-
@aquinas 更新了我的问题来回答你的问题
-
This chart 表明有问题的格式只能被较新的浏览器识别,这可能是这里的问题。他忽略了在列表中显示移动浏览器
-
可能要检查hanselman.com/blog/… - 请注意日期“literal”末尾的尾随“Z”。看来您可能也必须这样做。
标签: c# javascript json datetime formatting