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

如何使用date-fns修改material-ui-pickers时间选择器时区?

material-ui-pickers 基于date-fns自定义时区配置方法

material-ui-pickers的所有日期处理逻辑都依赖外层注入的date adapter工具类,默认提供的DateFnsUtils不支持自定义时区,我们可以通过继承扩展该类,结合date-fns-tz的时区处理能力快速实现需求,不需要修改时间选择器组件本身的代码。

  • 第一步:安装必要依赖
# npm 安装
npm i @date-io/date-fns date-fns date-fns-tz

# yarn 安装
yarn add @date-io/date-fns date-fns date-fns-tz
  • 第二步:编写支持时区的扩展工具类
    新建工具文件,写入以下代码,继承原生DateFnsUtils,覆写format方法注入时区参数:
import { format } from 'date-fns-tz';
import DateFnsUtils from "@date-io/date-fns";

export default class DateFnsTzUtils extends DateFnsUtils {
  constructor(props) {
    super();
    this.timeZone = props.timeZone;
  }

  format(date, formatString) {
    return format(date, formatString, {
      timeZone: this.timeZone,
      locale: this.locale
    });
  }
}
  • 第三步:全局/局部注入自定义工具类
    在使用时间选择器的组件外层,用MuiPickersUtilsProvider包裹,替换默认的utils为我们刚写的DateFnsTzUtils,同时传入需要指定的IANA标准时区字符串即可:
import { useState } from 'react';
import { MuiPickersUtilsProvider, TimePicker } from '@material-ui/pickers';
import DateFnsTzUtils from './utils/DateFnsTzUtils';

export default function TimeSelector() {
  const [selectTime, setSelectTime] = useState(new Date());
  return (
    // 示例为东八区配置,需要其他时区替换timeZone值即可,例如纽约时区传"America/New_York"
    <MuiPickersUtilsProvider utils={DateFnsTzUtils} timeZone="Asia/Shanghai">
      <TimePicker
        label="选择时间"
        value={selectTime}
        onChange={setSelectTime}
      />
    </MuiPickersUtilsProvider>
  )
}

提示:不要传入固定的时区偏移值(例如+8)作为timeZone参数,必须使用IANA标准时区名称,否则夏令时切换时会出现时间计算错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 09:01:10