2012-07-17 59 views
1

總之,我的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

回答

0

我原先說我會和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); 
    ... 

這個真的很醜陋,但它是一個答案,所以我把它放在這裏。我真的希望有人出現並找到比這更優雅的東西。

0

如何在.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