WPS-JSA中的日期天坑,我给你们踩平了!

E精精
E精精

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位,也就是到毫秒!

江苏省
浏览 3216
6
12
分享
12 +1
9
6 +1
全部评论 9
 
帅爷
这个问题让我头疼了许久,总算有人补上了
· 广西
回复
 
亂雲飛渡
· 广东省
回复
 
空空如野
这个我也是用了好久 ,最后直接在表格里加了一个辅助栏 用text函数 ,再用value() 读取 好用
· 湖南省
1
回复
E精精
E精精

WPS函数专家

直接 value()
· 江苏省
回复
 
朝阳
惊喜,正好遇到这个问题,查了一天多资料才查到这里找到答案,特别是Value函数的用法
· 山东省
回复
E精精
E精精

WPS函数专家

· 江苏省
回复
 
Mr Chen
Mr Chen

创作者俱乐部成员

学习
· 甘肃省
1
回复
E精精
E精精

WPS函数专家

7级 你是真前辈了
· 江苏省
回复
 
祥子
打卡
· 新疆
回复