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个小时。