如何使用Date-FNS向函数传递日期?为何传参后分钟差返回NaN?
嘿,我来帮你解决这两个关于Date-FNS的问题~
1. 如何向Date-FNS库的函数传递日期?
Date-FNS的绝大多数日期计算函数(比如differenceInMinutes)都接受原生Date对象作为核心参数,你可以通过以下几种常见方式传递有效的日期值:
- 直接创建原生Date对象传入:
// 示例:创建2024年5月1日的日期对象(注意:月份是0-based,4对应5月) const targetDate = new Date(2024, 4, 1); differenceInMinutes(targetDate, new Date()); - 传入符合ISO 8601标准的日期字符串:
differenceInMinutes('2024-05-01T12:00:00', new Date()); - 用Date-FNS自带的工具函数解析日期字符串:
import { parseISO } from 'date-fns'; differenceInMinutes(parseISO('2024-05-01'), new Date()); - 部分Date-FNS工具函数还支持直接传入年、月、日等离散参数(比如
addDays),但核心计算函数还是以Date对象为主要输入形式。
2. 为什么调用
getDateTime(2018, 3, 4, 15, 30, 0)时返回NaN? 问题核心在于函数参数定义和调用方式不匹配:
你定义的getDateTime函数只接收一个customDate参数,但调用时却传入了6个离散参数(年、月、日、时、分、秒)。此时customDate只会取到第一个值2018,new Date(2018)会把这个数字当作毫秒级时间戳,对应1970年1月1日之后2018毫秒的时间——虽然这是一个有效日期,但显然不是你想要的2018年3月4日。如果遇到无法解析为有效日期的输入,differenceInMinutes就会返回NaN。
给你两种解决思路:
方法一:修改函数,适配多参数输入
调整函数参数定义,单独接收年、月、日等参数,再用来创建正确的Date对象:
getDateTime: function (year, month, day, hour, minute, second) { // 重要提醒:Date构造函数的月份是0-based,3对应四月,如果你的需求是3月,要改成2 const customDate = new Date(year, month, day, hour, minute, second); const minutesDifference = differenceInMinutes(customDate, new Date()); console.log('minutesDifference: ' + minutesDifference); }
这样调用getDateTime(2018, 3, 4, 15, 30, 0)就能得到预期结果了(记得确认月份是否需要调整)。
方法二:调用时直接传入Date对象
保持函数原有定义不变,调用时先创建好目标Date对象再传入:
// 同样注意月份的0-based规则 getDateTime(new Date(2018, 3, 4, 15, 30, 0));
此时customDate是一个标准的Date对象,differenceInMinutes就能正常计算两个日期的分钟差值了。
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

