原生JS如何无第三方库校验share_end是否在share_start的7天范围内
问题解答
核心疑问解答
JS原生就支持类似PHP strtotime的日期解析能力:
new Date()构造函数可以直接解析yyyy-mm-dd格式的标准ISO日期字符串,得到Date类型实例后就可以做时间加减操作- 也可以用
Date.parse()方法直接把标准日期字符串转成毫秒级时间戳,和strtotime的行为非常接近,只是返回单位是毫秒,计算时按需换算即可,完全不需要第三方库。
你现有代码的问题
你直接对字符串类型的share_start调用setDate方法,字符串原型没有这个方法,自然会报错。需要先把两个日期字符串转成Date类型或者时间戳再做计算。
修正后的校验逻辑
// 表单提交校验 function validateForm() { // 实际场景下这两个值从表单输入获取,这里保留你的示例值 var share_start_str = '2021-05-07'; var share_end_str = '2021-05-15'; // 1. 将字符串转成Date对象 var share_start = new Date(share_start_str); var share_end = new Date(share_end_str); // 可选校验:结束日期不能早于开始日期 if (share_end < share_start) { alert("分享结束日期不能早于分享开始日期"); return false; } // 2. 计算最大允许的结束日期:开始日期往后加6天(包含开始当天共7天) // 注意要重新创建Date实例,不要修改原始的share_start对象 var share_max = new Date(share_start); share_max.setDate(share_max.getDate() + 6); // 3. 比较结束日期是否超出范围 if (share_end > share_max) { alert("分享结束日期与开始日期的间隔不能超过7天"); return false; } // 校验通过后续逻辑 return true; }
注意事项
yyyy-mm-dd格式的字符串用new Date()解析时,会默认使用UTC时区,如果你需要用本地时区避免日期偏移,可以把字符串替换成yyyy/mm/dd格式再传入构造函数- 可以额外加一层合法性判断,校验转换后的Date对象是不是
Invalid Date,避免用户输入非法格式的日期导致逻辑异常
内容的提问来源于stack exchange,提问作者Armitage2k
相关产品推荐
相关产品推荐

