js與vbs腳本中的日期時間概念

        最近要寫一個在本地運行的腳本編輯器,要實現對js和vbs兩種腳本的編輯和解釋運行,js我用的是v8引擎,vb找不到又好又快的引擎,就用微軟的Active Scripting技術來實現,在實現過程中,對date類型的解析頗費了一番周折,前面實現了對js的日期類型的解析,單獨提了一個函數出來,用來將js的date類型轉化爲本地的date類型。後面用vb來弄時,發現vb腳本中的日期時間和js有很大的區別,具體如下:

1,js的日期類型最終體現爲一個很大的雙精度數,表示的是從1970年元旦零點到要表示的日期時間所經過的毫秒數。這裏的基準時間是格林尼治時間,而不是你所在地的當地時間,在js中用new Date建立出來的時間則是本地時間,這是一個陷阱。

2,vb腳本中的日期類型是com的日期類型,也是一個雙精度數,根據我的觀察,它表示的是從1900年元旦零點到要表示的時間所經過的天數,小數點後面是天數後面的時間除以一天所得的小數部分。與js不同,這個基準時間表示的是格林尼治時間,而在腳本中建立的時間也是格林尼治時間,所以,以北京爲例,同樣的時間,在vb中表示的數比在js中表示的數多了8個小時的時間。這裏不太好理解,舉個例子,在js中new Date(2012,0,1,8,0,0),表示的是本地時間(北京時間),但實際轉換爲基準時間,是0點0分0秒,這樣,一計算,減去基準0點時間就少了8個小時的時間,而在vb腳本中建立的是實實在在的8點0分0秒的時間,減去基準0點時間,也就比js的要多8個小時間了。

3,在js中,新建一個日期,他的月數是從0開始算的,比如要表示2012年元旦,不能用new Date(2012, 1, 1, 0, 0, 0)來表示,而必須用new Date(2012,0,1,0,0,0)來表示,這是另外一個陷阱,如果不仔細看手冊,99%的人都會陷進去。

4,用vb建立的date類型的數,在C++代碼中,是一個variant,它的類型是VT_BYREF|VT_VARIANT,而不是VT_DATE,它的pvarValue的類型纔是VT_DATE類型,所以要從VBS傳來的variant中取出那個表示日期時間的雙精度數來,得這樣:vDate.pvarValue->date.

5,從1900年到1970年,經過了25569天。在兩種腳本之間轉換時會用得上,當然不要忘了還有本地時間比基準時間多出來的時間,北京時間多出來8個小時。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章