如何将moment.js日期校验代码转换为等效的date-fns实现
问题诊断
你的代码存在两个核心错误:
- 入参类型错误:
isBefore方法要求两个入参都是Date类型,你把第一个输入值用format转成了字符串,字符串与Date对象无法进行正确的日期维度比较 - 逻辑冗余:你不需要对输入日期做格式化处理,而是要先把输入的字符串格式的日期转为合法的Date对象再做比较,format方法中的
dd参数在date-fns中是合法的月中日两位格式符,这点没有问题。
正确实现
你的业务需求是校验输入日期是否为包含当日在内的未来日期,等价于「输入日期不早于今日0点」,实现代码如下:
方式1:直接和今日0点对比(更直观)
import { parse, isBefore, startOfToday } from 'date-fns' // 第二个参数为你输入value的日期格式,如果你是空格分隔的"日 月 年"格式,替换为'dd MM yyyy'即可 const inputDate = parse(value, 'dd-MM-yyyy', new Date()) const todayStart = startOfToday() // 如果isBeforeToday为true,说明输入的是今日之前的日期,校验不通过;否则校验通过 const isBeforeToday = isBefore(inputDate, todayStart)
方式2:和昨日0点对比(匹配你提到的「当前日期减1天」的思路)
import { parse, isAfter, subDays, startOfToday } from 'date-fns' const inputDate = parse(value, 'dd-MM-yyyy', new Date()) const yesterdayStart = subDays(startOfToday(), 1) // 如果isValid为true,说明输入的是包含今日在内的未来日期,校验通过 const isValid = isAfter(inputDate, yesterdayStart)
如果不需要过滤时分秒,直接用当前时间对比,把startOfToday()替换为new Date()即可。
内容的提问来源于stack exchange,提问作者Katerin1122
相关产品推荐
相关产品推荐

