使用自定义格式的 DatePicker 日期输入

DatePicker date input with custom format

我想使用 redux-form 记录我所在州的日期。我使用反应日期选择器。为了使日期选择器与我的 redux-form 兼容,我写道:

import React, { PropTypes } from 'react';
import DatePicker from 'react-datepicker';
import moment from 'moment';
import 'react-datepicker/dist/react-datepicker.css';

    const MyDatePicker = ({ input, meta: { touched, error } }) => (
      <div>
        <DatePicker
          {...input} dateFormat="YYYY-MM-DD"
          selected={input.value ? moment(input.value) : null}
        />
        {
          touched && error &&
          <span className="error">
            {error}
          </span>
        }
      </div>
    );

    MyDatePicker.propTypes = {
      input: PropTypes.shape().isRequired,
      meta: PropTypes.shape().isRequired
    };

    export default MyDatePicker;

问题是,当我选择日期时,我希望它显示为 DD-MM-YYYY,但我希望日期以 YYYY-MM-DD HH:MM:SS 格式保存在我的状态中。这该怎么做?我用了moment的格式化功能,但是好像没用

如果我的理解是正确的,您只需要 2 种不同的格式用于同一日期,一种用于 UI,另一种用于保存? moment(date).format('DD-MM-YYYY')moment(date).format('YYYY-MM-DD HH:MM:SS') 将为您提供两种格式的日期。

您应该使用 redux-form 为此提供的 the value lifecycle methods

使用 parse 格式化来自 react-datepicker 的值以供存储,并使用 format 将存储的值解析回 react-datepicker 以呈现它。示例:

function formatDateForInput(storedDate) {
  // the returned value will be available as `input.value`
  return moment(pickedDate).format('right format for your input')
}

function parseDateForStore(pickedDate) {
  // the returned value will be stored in the redux store
  return moment(storedDate).format('desired format for storage')
}

<Field
  component={ MyDatePicker }
  format={ formatDateForInput }
  parse={ parseDateForStore }
/>

如果这对您不起作用,我建议您检查是否需要在 [=12= 提供的 DatePickerinput 道具之间放置自定义 onChange 处理程序].因为 DatePicker 用来调用 onChange 的值可能是 redux-form 不理解的值。像这样:

const MyDatePicker = ({ input, meta: { touched, error } }) => {

  const onChange = event => {
    const pickedDate = event.path.to.value;
    input.onChange(pickedDate);
  }

  return (
    <div>
      <DatePicker
        dateFormat="YYYY-MM-DD"
        selected={input.value ? moment(input.value) : null}
        onChange={ onChange }
      />
      {
        touched && error &&
        <span className="error">
          {error}
        </span>
      }
    </div>
  );
}

MyDatePicker.propTypes = {
  input: PropTypes.shape().isRequired,
  meta: PropTypes.shape().isRequired
};

export default MyDatePicker;

希望对您有所帮助!

只需使用属性 dateFormat="dd/MM/yyyy"

示例:

<DatePicker 
    selected={startDate} 
    onChange={date => handleChange(date)} 
    dateFormat="DD/MM/YYYY"
/>

我使用了以下道具 -maskinputFormatformat - 来改变默认格式为“yyyy-MM-dd”格式。 格式代码“yyyy-MM-dd”很重要,绕过它找到所需的格式。

示例:

<LocalizationProvider dateAdapter={AdapterDateFns} >
   <DatePicker
      label="SomeDate"
      {...register("details_received_date")}
      mask="____-__-__"
      inputFormat="yyyy-MM-dd"
      format="yyyy-MM-dd"
      value={someDate}
      onChange={(newValue) => {setSomeDate(newValue);}}
      renderInput={(params) => <TextField {...params} />}
      />
</LocalizationProvider>

这将显示在前端并以所需格式提供值。 希望这有帮助。