为何date-fns的isAfter与isBefore方法返回值均为false?
问题原因
你用isAfter/isBefore比较的是格式化后的日期字符串,但这类日期比较方法的设计目标是接收Date对象,而非字符串。这会导致两个关键问题:
- 字符串解析的不确定性:不同环境(浏览器/Node.js)对
'yyyy-MM-dd'格式字符串的解析规则存在差异——部分环境会将其解析为UTC时间,部分则解析为本地时间,生成的Date对象可能和你预期的不一致,最终导致比较结果错乱。 - 意外的相等判定:你遇到两个比较都返回
false的情况,本质是字符串被解析后生成的Date对象被判定为相等,这就是解析规则不一致带来的问题。
另外还要注意,部分日期库的isAfter(a, b)是判断a是否在b之后,若你搞反了参数顺序,也会得到不符合预期的结果。
解决方案
方案1:直接使用原始Date对象比较
不要提前格式化Date对象,直接用原生Date实例进行比较,这是最稳妥的方式:
// 保留原始Date对象,不做格式化 const currentDate = new Date(2021, 4, 5); const gameDate = new Date('2021-05-04T14:00:00'); // 直接传递Date对象给isAfter console.log(isAfter(currentDate, gameDate)); // 会返回预期的true
方案2:明确解析规则后比较(仅需比较年月日时)
如果确实需要基于格式化后的年月日进行比较,要用日期库的解析方法明确指定格式,避免解析歧义:
// 以date-fns为例,用parse方法指定格式解析 import { parse, isAfter } from 'date-fns'; const currentDateStr = '2021-05-05'; const gameDateStr = '2021-05-04'; // 按yyyy-MM-dd格式解析为Date对象 const currentDate = parse(currentDateStr, 'yyyy-MM-dd', new Date()); const gameDate = parse(gameDateStr, 'yyyy-MM-dd', new Date()); console.log(isAfter(currentDate, gameDate)); // 返回true
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

