日期转换:从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" 
+0

这看起来很奇怪。您定位的浏览器*是什么,JSON实际上是什么样子?你可以发布吗?至少是日期表示。 – aquinas 2012-07-17 16:48:19

+0

@aquinas更新我的问题以回答你的问题 – 2012-07-17 16:51:07

+1

[此图表](http://dygraphs.com/date-formats.html)显示所讨论的格式只能被较新的浏览器识别,这可能是此处的问题。他忽略在列表中显示移动浏览器 – 2012-07-17 16:54:39

我原先说我会和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); 
+0

我在技术上喜欢这个解决方案,因为它没有留下任何误解的空间,但是*我会这样做吗?从LINQ获取列表后?我感到很愚蠢,然后再次遍历该列表*,但如果LINQ本身没有办法做到这一点,我想我没有选择 – 2012-07-17 18:22:01

+0

系统的体系结构是什么?它是EntityFramework吗?在将模型返回给客户端之前是否将模型转换为ViewModel? – Phil 2012-07-17 19:16:46

+0

我正在使用实体框架,但我不倾向于将ViewModels用于API JSON请求。这是一种不好的做法吗?您可以在我的原始帖子**步骤2 **中看到我做了什么以发送请求 – 2012-07-17 19:25:28