WPS-JSA中的日期天坑,我给你们踩平了!
WPS函数专家
今天我们聊聊WPS的JSA对于日期的处理有点小坑,我们来给大家踩踩!
我们来看看问题,在JSA中Value属性变成了方法,所以一般我们使用Value2来获取单元格的内容,但是这里的内容是真单元格中的实际内容
看一下下图,dte变量的结果是45055,为什么呢?我们都知道日期的本质是数值,这里的数字从1900/1/1 到这个日期的天数
好了,上面大概了解,那按照案例中的筛选条件,我们要获取日期的月份,现在这个数字,在JS中直接没有直接方法处理,那么是否有其他处理方法呢?
可以试试比较少用的Text属性,Text属性是获取显示的内容
总算有点样子了,似乎取出了日期,那么我们要如何根据这个文本型日期提取月份呢?
其实你可以直接当字符处理,分隔符提取第二段即可!
又或者转成日期再提取也可以!new Date 实例化一个日期对象,使用getMonth()方法提取月份,需要注意结果是从0开始的,也就是1月是0,所以要+1。
到这里,应该问题就解决了吧,但是并没有,因为,我们处理这个数据,经常是整体写入数组,但是Text不支持单元格区域,给区域,结果为null
那我们只能使用Value2了,回到了起点,那就没有办法了吗?当然有,JSA是可以直接调用工作表函数,我们可以调用工作表函数Text来处理,更简单!
条条大路通罗马,此路不同,换一条就是!但是你可能不甘心,难道JS就没办法处理这种情况吗?
肯定也能,就是麻烦点!
普通思路,我们可以使用数字除以365,取数,得到年份。1970+45055/365 取整得到的就是2023,然后再算出月份……天……
是不是非常麻烦,还有一种,我们按照时间戳来处理,时间戳是从1970/1/1 到指定日期的毫秒数,13位,在WPS中!
那么我们就可以用日期的数字减掉 1970/1/1 对应的数字 *86400*1000即可得到时间戳!当然这样的算法是基于WPS临时想出来,不知道是否有bug,如有问题,欢迎交流,大佬轻拍~
这样,问题就解决了吧!但是上面处理的方案太坑了……
大家忽略了一点,Value虽然变成了方法,但是还是可以使用的呀,只是你当方法调用即可!
关键他会返回日期对象,我们可以直接使用日期的方法,直接提取月份…… 这下真的绕回来了
这里我们也说一下,获取单元格内容的Text、Value()和Value2区别
所以虽然变成了方法,我们还是更推荐大家使用Value()!
▍小结一下:
1、JSA中单元格中的日期使用Value2读取的是日期对应的数字,从1900/1/1到指定日期的天数,Value()方法返回日期对象,可以直接解析
2、Text属性获取的是单元格的显示内容,所见即所得,但是不支持单元格区域。
3、getMonth()方法获取的月份是从0开始的,所以需要+1!
4、时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数,10位,wps中是13位,也就是到毫秒!
WPS函数专家
WPS函数专家
创作者俱乐部成员
WPS函数专家