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

从localStorage读取日期后调用getFullYear()方法的问题求解

原因说明

JSON.stringify处理Date对象时会默认将其转为ISO格式字符串,JSON.parse反序列化时不会自动把该字符串还原为Date实例,因此字符串类型的值无法直接调用Date原型上的getFullYear()方法。

修复方案

在读取localStorage数据、完成JSON反序列化后,遍历所有数据项将日期字段重新转为Date实例,再存入组件state即可。修改后的可直接运行代码如下:

const formDepositsData = [];
const [depositsData, setDepositsData] = useState(formDepositsData);

// 组件初始化时读取本地持久化数据
useEffect(() => {
  const storageValue = localStorage.getItem("deposits");
  if (!storageValue) return;

  try {
    const parsedData = JSON.parse(storageValue);
    // 遍历转换日期字段,将下方的depositDate替换为你实际使用的日期字段名
    const formattedData = parsedData.map(item => ({
      ...item,
      depositDate: item.depositDate ? new Date(item.depositDate) : null
    }));
    setDepositsData(formattedData);
  } catch (err) {
    // 捕获解析异常,清除脏数据避免页面报错
    console.error("存款数据解析失败:", err);
    localStorage.removeItem("deposits");
  }
}, []);

// 数据变更时同步写入本地存储
useEffect(() => {
  localStorage.setItem("deposits", JSON.stringify(depositsData));
}, [depositsData]);

使用说明

  • 代码中的depositDate是示例字段名,需要替换为你业务代码里实际存储日期的字段,比如createTime、tradeDate等
  • 转换前做了空值判断,避免日期字段为空时生成无效Date实例,导致后续调用方法报错
  • 增加了JSON解析异常捕获,避免本地存储被手动篡改、存入非标准格式数据时引发页面白屏

转换完成后,你就可以在业务逻辑里直接调用日期方法获取年份了,示例:

// 渲染列表时获取存款年份
{depositsData.map(item => (
  <div key={item.id}>
    存款年份:{item.depositDate ? item.depositDate.getFullYear() : "暂无数据"}
  </div>
))}

如果你的数据存在多层嵌套、或者有多个日期字段,只需要在格式化数据的步骤里,对应每个日期字段做new Date()转换即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 12:36:27