日期转换:从LINQ到JSON为Javascript
总之,我的API控制器和使用结果的JavaScript之间,日期被转换成一个可爱的NaN
日期转换:从LINQ到JSON为Javascript
我的问题是在哪里,也许是怎么样,一个建议我修复了这条长链。
第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对象,然后解析从字符串为int 大大缩短了可读性
var points = JSON.parse(response);
for(i = 0; i < points.length; i++){
var date = Date.parse(points[i].EarnedOn);
此时日期,只有这么多我可以。我已经在第2步结束时将日期转换为字符串,而我定位的浏览器根本不知道如何使用C#的默认格式(我假设这是发送的内容)。在某些浏览器中它可以工作,在其他浏览器中,我可以获得NaN
。
对不起,很长的解释,但如果有人可以指出他们将在何处以及如何应用此修复程序,我会很感激。
====更新====
有问题的浏览器是Android的股票浏览器。我已经在我的手机和BlueStacks模拟器上测试了这一点。两者都是最新的,并且都不起作用。它在Chrome中工作。
的时间(切出的所有其他数据)的JSON输出显示如下:
"EarnedOn":"2012-05-10T00:00:00"
我原先说我会和Date.js去,但有点谷歌搜索表明,它一直没有自2007年提交,并为充满了虫子。另外,它只是不正确。
截至目前,我厌倦了寻找一个合适的解决方案,并得到它与以下Javascript代码在步骤3。
function parseDate(date){
var year = parseInt(date.substring(0,4));
var month = parseInt(date.substring(5,7));
var day = parseInt(date.substring(8,10));
var hour = parseInt(date.substring(11,13));
var minute = parseInt(date.substring(14,16));
var second = parseInt(date.substring(17,19));
return new Date(year, month, day, hour, minute, second);
}
for(i = 0; i < points.length; i++){
var date = Date.parse(points[i].EarnedOn);
...
这个真的很丑陋,但它是一个答案,所以我把它放在这里。我真的希望有人出现并找到比这更优雅的东西。
如何在.net转换日期时间向timestamp /秒。将JavaScript转换为日期对象。我还没有在移动浏览器上测试过它,所以不能100%它会工作。
DateTime myDateTime = new DateTime(2012, 01, 17, 9, 30, 0);
long ticks = (myDateTime - DateTime.Parse("01/01/1970 00:00:00")).Ticks;
ticks /= 10000000; //Convert ticks to seconds
var timestamp = ticks.ToString();
然后在JavaScript中,像
secsToTime = function(theSecs)
{
var date = new Date(theSecs*1000);
// hours part from the timestamp
var hours = date.getHours();
// minutes part from the timestamp
var minutes = date.getMinutes();
// seconds part from the timestamp
var seconds = date.getSeconds();
// will display time in 10:30:23 format
var formattedTime = hours + ':' + minutes + ':' + seconds;
alert(formattedTime);
}
secsToTime(1326792600);
我在技术上喜欢这个解决方案,因为它没有留下任何误解的空间,但是*我会这样做吗?从LINQ获取列表后?我感到很愚蠢,然后再次遍历该列表*,但如果LINQ本身没有办法做到这一点,我想我没有选择 – 2012-07-17 18:22:01
系统的体系结构是什么?它是EntityFramework吗?在将模型返回给客户端之前是否将模型转换为ViewModel? – Phil 2012-07-17 19:16:46
我正在使用实体框架,但我不倾向于将ViewModels用于API JSON请求。这是一种不好的做法吗?您可以在我的原始帖子**步骤2 **中看到我做了什么以发送请求 – 2012-07-17 19:25:28
这看起来很奇怪。您定位的浏览器*是什么,JSON实际上是什么样子?你可以发布吗?至少是日期表示。 – aquinas 2012-07-17 16:48:19
@aquinas更新我的问题以回答你的问题 – 2012-07-17 16:51:07
[此图表](http://dygraphs.com/date-formats.html)显示所讨论的格式只能被较新的浏览器识别,这可能是此处的问题。他忽略在列表中显示移动浏览器 – 2012-07-17 16:54:39