下午在搞MVC和EXTJS的日期格式互相轉換遇到了問題,我們從.NET服務器端序列化一個DateTime對象的結果是一個字符串格式,如 '/Date(1335258540000)/' 這樣的字串。
整數1335258540000實際上是一個1970 年 1 月 1 日 00:00:00至這個DateTime中間間隔的毫秒數。通過javascript用eval函數可以把這個日期字符串轉換為一個帶有時區的Date對象,如下
用var date = eval('new ' + eval('/Date(1335258540000)/').source) 這樣即可得到一個JS對象
通過alert(date)查看比較清楚。
Tue Apr 24 17:09:00 UTC+0800 2012
上面是C# JSON序列化日期自動得到的字符串,也可以通過C#寫一個函數來獲取這個數字,例如
public long MilliTimeStamp(DateTime TheDate) { DateTime d1 = new DateTime(1970, 1, 1); DateTime d2 = TheDate.ToUniversalTime(); TimeSpan ts = new TimeSpan(d2.Ticks - d1.Ticks); return (long)ts.TotalMilliseconds; }
通過上面的函數跟利用JSON序列化獲取到的字符串中的整數是一樣的。
但是,在從客戶端返回服務器端的時候,日期卻遇到了問題,如何將javascript的Date對象傳回服務器端呢?
先通過javascript Date中的getTime()來獲取到這個整數,然後服務器端對這個整數進行解析,‘構造'成一個C#的DateTime對象。思路大概是這樣的,不過在逆向回去的時候卻遇到了點麻煩。
public DateTime ConvertTime(long milliTime) { long timeTricks = new DateTime(1970, 1, 1).Ticks + milliTime * 10000 ; return new DateTime(timeTricks); }
通過ConvertTime得到的結果發現時間少了8個小時,這剛好是服務器的時區,東八區時間,也就是說還要加上8小時的納秒,因為C#的時間戳單位是一千萬分之一秒,一個小時3600秒,即8*3600*10000000
所以修改了ConvertTime函數,正確的如下:
public DateTime ConvertTime(long milliTime) { long timeTricks = new DateTime(1970, 1, 1).Ticks + milliTime * 10000 + TimeZone.CurrentTimeZone.GetUtcOffset(DateTime.Now).Hours * 3600 * (long)10000000; return new DateTime(timeTricks); }
以上這篇js和C# 時間日期格式轉換的簡單實例就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持。