开发者问题收集

如何在使用状态钩子中以字符串格式获取当前日期

2023-08-02
584

我想在 useState 钩子变量中以字符串格式获取今天的日期(例如 2/08/2023)作为初始值。

当前工作代码:

const [startDate, setStartDate] = useState(new Date());

// output: Wed Aug 02 2023 12:52:16 GMT+0800 (Australian Western Standard Time)

以下是我尝试输出的内容(2/08/2023):

// Trial #1
const [startDate, setStartDate] = useState(new Date().toLocaleDateString());


// Trial #2
let today = new Date().toLocaleDateString()
const [startDate, setStartDate] = useState(today)

不幸的是,这两种方法都会产生以下错误:

Uncaught RangeError: Invalid time value.

有人猜过如何解决这个问题吗?谢谢!

2个回答

出现 Uncaught RangeError: Invalid time value 错误是因为 toLocaleDateString() 方法返回的日期格式为 dd/mm/yyyy ,而该格式对于直接创建 JavaScript Date 对象而言并不是有效的输入。要将 startDate 的初始值设置为 2/08/2023 格式的字符串,您可以使用 Date 对象的 getFullYear()getMonth()getDate() 方法手动格式化日期。

以下是实现方法:

const currentDate = new Date();
const formattedDate = `${currentDate.getDate()}/${currentDate.getMonth() + 1}/${currentDate.getFullYear()}`;

const [startDate, setStartDate] = useState(formattedDate);

在此代码中,我们首先创建一个新的 Date 对象,然后手动构建所需的日期字符串,格式为 dd/mm/yyyygetMonth() 方法返回一个从 0 到 11 的值,其中 0 代表一月,1 代表二月,依此类推。因此,我们将 getMonth() 值加 1 以获取正确的月份数。

这应该将 startDate 的初始值设置为今天的日期,格式为 2/08/2023

snowden
2023-08-02

您可以使用 moment.js 包:

npm i moment

并使用:

moment().format('l'); // 8/2/2023

moment().format('L'); // 08/02/2023

像这样:

 import "./styles.css";
import moment from 'moment'
import { useState } from "react";

export default function App() {
  const [startDate, setStartDate] = useState(moment().format('L'));
  return (
    <div className="App">
      <h1>{startDate}</h1>
      <h2>Start editing to see some magic happen!</h2>
    </div>
  );
}

文档: https://momentjs.com/

QasemBSK
2023-08-02