js和C# 時間日期格式轉換


下午在搞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函數,正確的如下:

1 public DateTime ConvertTime(long milliTime)
2         {
3             long timeTricks = new DateTime(1970, 1, 1).Ticks + milliTime * 10000 + TimeZone.CurrentTimeZone.GetUtcOffset(DateTime.Now).Hours * 3600 * (long)10000000;
4             return new DateTime(timeTricks);
5         }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM