You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Next.js Airbnb克隆项目刷新后出现RangeError: Invalid time value问题求助

问题根源

刷新页面时组件状态重置,若startDate/endDate未被正确初始化(如为undefined/null),或从URL参数读取的日期格式不合法,会导致date-fns的format函数无法处理无效时间值,触发RangeError。

解决方案

1. 给日期状态设置合法默认值

初始化状态时确保日期为有效Date对象,避免空值:

// 示例:组件状态初始化
const [dateRange, setDateRange] = useState({
  startDate: new Date(),
  endDate: new Date(Date.now() + 86400000), // 默认选中次日
  key: 'selection'
});

2. 校验URL参数中的日期格式

若通过URL查询参数传递日期,刷新时需将字符串转为合法Date并校验有效性:

import { useRouter } from 'next/router';
import { parseISO, isValid } from 'date-fns';

const router = useRouter();

useEffect(() => {
  const { startDate, endDate } = router.query;
  if (startDate && endDate) {
    const parsedStart = parseISO(startDate);
    const parsedEnd = parseISO(endDate);
    if (isValid(parsedStart) && isValid(parsedEnd)) {
      setDateRange({
        startDate: parsedStart,
        endDate: parsedEnd,
        key: 'selection'
      });
    } else {
      // 无效日期时重置为默认值
      setDateRange({
        startDate: new Date(),
        endDate: new Date(Date.now() + 86400000),
        key: 'selection'
      });
    }
  }
}, [router.query]);

3. 格式化前校验日期有效性

调用format前先检查日期是否合法,避免传入无效值:

import { format, isValid } from 'date-fns';

// 替换原format调用
const displayStart = isValid(startDate) ? format(startDate, 'yyyy-MM-dd') : '';
const displayEnd = isValid(endDate) ? format(endDate, 'yyyy-MM-dd') : '';

4. 用本地存储持久化日期状态

若需刷新后保留选中日期,可将日期存入localStorage,组件初始化时读取:

// 日期选择变化时存入本地存储
const handleDateChange = (ranges) => {
  const selectedRange = ranges.selection;
  setDateRange(selectedRange);
  localStorage.setItem('savedDateRange', JSON.stringify({
    startDate: selectedRange.startDate.toISOString(),
    endDate: selectedRange.endDate.toISOString()
  }));
};

// 组件初始化时读取本地存储
useEffect(() => {
  const saved = localStorage.getItem('savedDateRange');
  if (saved) {
    const { startDate, endDate } = JSON.parse(saved);
    const parsedStart = new Date(startDate);
    const parsedEnd = new Date(endDate);
    if (isValid(parsedStart) && isValid(parsedEnd)) {
      setDateRange({ startDate: parsedStart, endDate: parsedEnd, key: 'selection' });
    }
  }
}, []);
核心注意事项
  • 所有传入date-fns的参数必须是有效Date对象,undefined、null或格式错误的字符串都会触发错误。
  • Next.js页面刷新会重置组件状态,依赖状态的内容需从URL、本地存储或后端重新获取并校验。

内容的提问来源于stack exchange,提问作者fabiocattolico

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 13:50:21