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

如何将moment代码转换为date-fns?转换后时间为1970年是什么原因?

问题根因
  • 格式输出不匹配:原moment(value).format()默认输出ISO 8601格式的时间字符串,而getUnixTime(new Date(value))返回的是秒级Unix时间戳(10位左右的数字),两者格式完全不同。
  • 组件入参不匹配:你使用的DateTimePicker组件的value属性预期接收的是ISO字符串、Date对象或毫秒级时间戳,当你传入秒级时间戳时,组件会默认把该数值当作毫秒级时间戳解析,10位的秒级数值作为毫秒计数最大仅对应1970年1月1日之后约4个月的时间,所以返回的时间永远在1970年附近。
正确转换方案

根据你需要存储的时间格式二选一即可:

  1. 完全对齐原有moment逻辑,存储ISO时间字符串,使用date-fns的formatISO方法:
import { formatISO } from 'date-fns'

// onChange回调内的写法
setStartDate(formatISO(new Date(value)))
  1. 如需存储Unix时间戳,优先存储组件兼容的毫秒级时间戳:
// 存储毫秒级时间戳,无需额外适配组件value属性
setStartDate(new Date(value).getTime())

// 若确定要存储秒级时间戳,需要同步修改组件的value属性赋值逻辑:
// <DateTimePicker value={new Date(startDate * 1000)} ... />

注意:如果DateTimePicker的onChange回调返回的value本身就是Date类型,无需额外套一层new Date(value),直接传入value即可。

内容的提问来源于stack exchange,提问作者János

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 14:15:04