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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值