Apps Script中setHours日期过滤致原始数据时间丢失问题
问题原因
Date属于引用类型,最初的过滤写法中,在filter回调内直接调用a[0].setHours(0, 0, 0, 0)时,操作的是原始数组中存储的原日期对象本身,会直接修改原对象的时间值,并非生成独立副本做比较。这一副作用和filter方法本身无关,是回调逻辑直接操作了引用指向的原始数据,最终导致所有记录的原始时分秒信息被覆盖为零点值。
解决方案
无修改直接比较(推荐)
不在原始日期对象上调用任何修改方法,直接用时间戳做范围判断,完全不会改动原始数据。
如果只需要筛选当日零点之后的记录,可以直接使用验证过的写法:
const today = new Date().setHours(0, 0, 0, 0); const todayReports = formData.filter(a => a[0] >= today);
如果需要严格匹配当日所有记录(排除次日及之后的条目),可以补充次日零点作为上界,逻辑更严谨:
const todayStart = new Date().setHours(0, 0, 0, 0); const tomorrowStart = new Date().setHours(24, 0, 0, 0); const todayReports = formData.filter(a => a[0] >= todayStart && a[0] < tomorrowStart);
创建副本比较
如果需要通过修改日期属性做等值比较、又不想改动原始数据,可以先基于原日期创建新的副本对象,所有修改操作只作用在副本上:
const today = new Date().setHours(0, 0, 0, 0); const todayReports = formData.filter(a => { const dateCopy = new Date(a[0]); return dateCopy.setHours(0, 0, 0, 0) === today; });
内容的提问来源于stack exchange,提问作者Chris Ash
相关产品推荐
相关产品推荐

