MVC Json方法裏的一個坑

MVC Controller類下面有這樣一個方法數據庫

      //
        // Summary:
        //     Creates a System.Web.Mvc.JsonResult object that serializes the specified object
        //     to JavaScript Object Notation (JSON).
        //
        // Parameters:
        //   data:
        //     The JavaScript object graph to serialize.
        //
        // Returns:
        //     The JSON result object that serializes the specified object to JSON format. The
        //     result object that is prepared by this method is written to the response by the
        //     ASP.NET MVC framework when the object is executed.
        protected internal JsonResult Json(object data);

通常用在Action中返回一個JSON與客戶端JS(JQuery)交互。json

public JsonResult getRepChangeTest()
        {
            return Json(myobj);
        }

當你的對像裏有日期時間字段時,這個Json方法會把它序列化成這種格式app

"rec_dt": "/Date(1498466813000)/",

在客戶端JS裏,咱們把它看成字符串處理一下,而後轉成js的日期格式,好比ide

function dt2(tm)
        {
            

            var time = tm.replace(/[\'\"\\\/\b\f\n\r\t)]/g, '').substring(5); console.log(time); //取得時間戳數值
            var date = new Date(parseInt(time)); //轉成日期格式
            //console.log(date);
       
            // 下面根據須要轉換成你要的格式
            var month = date.getMonth() + 1 < 10 ? "0" + (date.getMonth() + 1) : date.getMonth() + 1; var currentDate = date.getDate() < 10 ? "0" + date.getDate() : date.getDate(); var hh = date.getHours() < 10 ? "0" + date.getHours() : date.getHours(); var mm = date.getMinutes() < 10 ? "0" + date.getMinutes() : date.getMinutes(); var dt= date.getFullYear() + "-" + month + "-" + currentDate + " " + hh + ":" + mm; alert(dt); }
View Code

能夠還原成日期格式,如 2017-06-26 16:46,這一切看上去都很完美,然而,坑就在這裏。測試

Json方法返回的時間戳(毫秒數)是基於UTC時間的(GMT 0),而個人時區是GMT+8,因此這就有了8個小時的時差。this

可是 js裏的var date = new Date(xxxxx); 這個是基於UTC時間的(測試所得,沒深究),因此客戶端獲得的時間也是正確的。若是你用C#代碼這樣手動驗證一下spa

DateTime.Parse("1970-1-1").AddSeconds(1498466813)

獲得的日期恰好差8個小時。3d

MySQL中的日期類型有datetime, timestamp,若是使用datetime,如上沒有問題(雖然差個時區,但客戶端也是基於UTC還原的,因此能獲得正確值),但當你使用timestamp時,Json方法序列化後的值是基於當前時區的,這樣js客戶端用上面的方法還原後就錯了,加了8個小時,由於客戶端是基於UTC的,對不上。 這是真正的坑所在。從數據庫裏讀出來,C#裏調試兩個類型的值沒差異,都正確,可是把實體對像(定義的類型均爲datetime)經Jons方法轉換後結果就不一樣,具體原來待研究……。調試

 

解決方法code

1. 不使用Json轉換,用其它的,好比Newtonsoft.Json,通過JsonConvert.SerializeObject(obj)轉換後日期已經變成日期樣式的字符串格式,直接顯示便可。

public ContentResult getRepChangeTest2()
        {
            var obj = rptdal.ReportChangeList();
            string json=JsonConvert.SerializeObject(obj);
            return Content(json, "application/json");
        }

2. 數據庫中不使用timestamp, 改用datetime類型

相關文章
相關標籤/搜索