昨天在學習asp.net的時候,視頻里面提到一個問題,那就是Json時間和C#時間的轉換。之所以需要進行這種轉換,是由於C#起算時間是從1年1月1日 0:00:00開始,而js則是從1970年1月1日0:00:00開始,這導致在兩種語言在時間的轉換上差異。再加上將DateTime類型的數據轉換成Json的時候會帶有“/Date(.......)”這樣的標記,所以對數據進行轉換成為了必然。
轉換的方式無非兩種,一種在后台通過C#裝換成數字字符串然后Request給瀏覽器再進行進一步的解析。另一種則是將全部數據都直接發給瀏覽器通過js處理獲得。
一、C#預處理
在翻查網上的資料后,發現C#的最小計時單位為Tick=100ns,而js則為1ms,兩者相差了10000倍。轉換時需要注意。而js返回的時間戳傳到C#時是不帶時區的,所以js轉換成C#時間的時候還需要注意本地化。
如下為代碼:
private static Int64 dt = new DateTime(1970, 1 , 1).Ticks; /// <summary> /// 傳入一個DateTime,將其轉換為子1970年1月1日起的Int64的數字 /// </summary> /// <param name="time">需要轉換的時間</param> /// <returns>Int64的數字時間</returns> public static Int64 Csharp2Json(DateTime time) { return Convert.ToInt64((time.Ticks - dt) / 10000); } /// <summary> /// 將Js/Java時間轉換成C#時間 /// </summary> /// <param name="jsTime">js/Java時間</param> /// <example>"1335258540000"</example> /// <returns></returns> public static DateTime Json2Csharp(string jsTime) { Int64 longTime = Convert.ToInt64(jsTime) * 10000; return new DateTime(longTime+=dt).ToLocalTime(); }
上面的代碼已包含C# to Js和Js to C#兩部分。在前端,我面只需通過下的代碼就可以將C#的時間戳轉換成具體的時間:
var date=new Date(CsharpTimeTick);
二、直接通過js處理
C#的DateTime被轉換成json后,默認格式是這樣的: "/Date(1294499956278+0800)/",要轉換這種格式的時間,我只要取回中間的“1294499956278”然后直接調用Date() 函數轉換即可。
<script type="text/javascriopt> var patt=/\d{13}/; var timeNum=paresInt(Tick.match(patt));//Tick為從C#獲得的Json時間戳。這里是將獲得的字符串轉換成數字。 var d=new Date(timeNum); </script>