yup.date() 验证后将日期转换为不带时区的字符串

dra*_*rys 7 javascript reactjs yup react-hook-form

我将 Yup 与 React-hook-form 结合使用,并在 Yup 中具有以下架构

  const validationSchema = Yup.object({
    installation: Yup.string().nullable().required("Required"),
    from_date: Yup.date()
      .max(new Date(), "Cannot use future date")
      .nullable()
      .required("Required"),
    to_date: Yup.date()
      .min(Yup.ref("from_date"), "To Date cannot be before From Date")
      .max(new Date(), "Cannot use future date")
      .nullable()
      .required("Required")
  });

Run Code Online (Sandbox Code Playgroud)

当我在输入中键入日期时,验证工作正常,但日期以 格式返回2021-03-31T18:30:00.000Z,但是我希望日期以2021-03-31.

我将数据发送到 Django 后端服务器,并且只需要一个没有时区的 DateField。我该怎么做?

有没有什么办法可以转换没有时区的日期。如果我使用它,我可以让它工作Yup.string(),但是必要的验证将不起作用。

可能的解决方案想法(但需要帮助来理解如何去做)

我可以在 Yup 中编写一些自定义验证吗?如果可能的话我可以使用Yup.string()并仍然执行必要的验证

  1. 使用Yup.string()
  2. 转换为日期
  3. 执行必要的验证
  4. 将日期重新转换为字符串
  5. 并返回字符串

PS 这个问题有很多观点,但没有重要的评论或答案。我可以更改问题格式以使其更容易理解吗?

Car*_*cia 1

您应该编写一个快速函数,以便在进一步验证 yup 之前更改格式。为此,您可以使用date-fns助手。

import parse from "date-fns/parse";

function parseDateString(value, originalValue) {
  return isDate(originalValue)
    ? originalValue  // this make sure that a value is provided
    : parse(originalValue, "yyyy-MM-dd", new Date());
}
Run Code Online (Sandbox Code Playgroud)

可以这样使用:

import { date, object } from "yup";

const today = new Date();

const validationSchema = Yup.object({
  installation: Yup.string().nullable().required("Required"),
  from_date: Yup.date()
    .transform(parseDateString)
    .max(new Date(), "Cannot use future date")
    .required("Required"),
  to_date: Yup.date()
    .min(Yup.ref("from_date"), "To Date cannot be before From Date")
    .max(new Date(), "Cannot use future date")
    .required("Required")
});
Run Code Online (Sandbox Code Playgroud)