如何将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年附近。
正确转换方案
根据你需要存储的时间格式二选一即可:
- 完全对齐原有moment逻辑,存储ISO时间字符串,使用date-fns的
formatISO方法:
import { formatISO } from 'date-fns' // onChange回调内的写法 setStartDate(formatISO(new Date(value)))
- 如需存储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
相关产品推荐
相关产品推荐

