【问题标题】:How to properly create date object for function如何为函数正确创建日期对象
【发布时间】:2018-07-25 23:49:58
【问题描述】:

我的表单上有一个字段的日期选择器,允许用户选择一个日期。提交表单时,日期对象被解析为后端 API 要求的正确格式的字符串。当我尝试获取一个对象来填充表单时,该输入字段的返回类型作为字符串返回。如果我尝试传递字符串,页面将崩溃。

当 API 返回一个应该填写下面显示的输入字段的字符串变量时,就会发生确切的问题。该程序当前抛出 date.clone 不是函数的错误。

有人能帮我弄清楚如何从后端传递字符串日期,以便它可以正确显示在前端吗?

这是接受日期对象并为后端创建字符串的函数。后端将 lastDateAccessed 作为字符串返回,lastDateAccessedHolder 是输入字段中可见的内容。

handleDateChange(date) {
    this.setState({ lastDateAccessedHolder: date });

    var lastDate = new Date(date);
    var day = lastDate.getDate();
    if(day.toString().length === 1)
    {
        day = '0' + day;
    }

    var month = lastDate.getMonth() + 1;
    if(month.toString().length === 1)
    {
        month = '0' + month;
    }

    var year = lastDate.getFullYear();
    this.setState(
        {lastDateAccessed: year+"-"+month+"-"+day},
        () => console.log(this.state.lastDateAccessed)
    );
}

这是使用日期选择器的行,并显示输入字段:

<DatePicker selected={this.state.lastDateAccessedHolder} onChange={this.handleDateChange}/>

更新:后端将返回 responseData.lastDateAccessed。此变量将保存类似“2018-09-09”或“2016-12-03”的日期。

更新 2:我在 API 的 GET 函数中运行的代码是:

var dateString = responseData.lastDateAccessed;
     var finalDate = dateString.split('-');
     var done = new Date(finalDate[0], finalDate[1] - 1, finalDate[2]);
     this.setState({lastDateAccessedHolder: done});

错误:

index.js:318 Uncaught TypeError: date.clone is not a function
at safeDateFormat (index.js:318)
at DatePicker._this.renderDateInput (index.js:2844)
at DatePicker.render (index.js:2916)
at finishClassComponent (react-dom.development.js:8389)
at updateClassComponent (react-dom.development.js:8357)
at beginWork (react-dom.development.js:8982)
at performUnitOfWork (react-dom.development.js:11814)
at workLoop (react-dom.development.js:11843)
at HTMLUnknownElement.callCallback (react-dom.development.js:100)
at Object.invokeGuardedCallbackDev (react-dom.development.js:138)
at invokeGuardedCallback (react-dom.development.js:187)
at replayUnitOfWork (react-dom.development.js:11318)
at renderRoot (react-dom.development.js:11885)
at performWorkOnRoot (react-dom.development.js:12449)
at performWork (react-dom.development.js:12370)
at performSyncWork (react-dom.development.js:12347)
at requestWork (react-dom.development.js:12247)
at scheduleWorkImpl (react-dom.development.js:12122)
at scheduleWork (react-dom.development.js:12082)
at Object.enqueueSetState (react-dom.development.js:6644)
at addAsset../node_modules/react/cjs/react.development.js.Component.setState (react.development.js:238)
at addAsset.js:71

【问题讨论】:

  • “页面将崩溃” - 是否存在相关错误?
  • 如果我尝试将 lastDateAccessedHolder 设置为 responseData.lastDateAccessed 我得到 date.clone is not a function
  • 你需要显示后端返回的实际值,即lastDateAccessed的值,否则任何答案都只是猜测。您不应该使用内置解析器,请参阅Why does Date.parse give incorrect results? 没有可以传递给 Date 构造函数的字符串值将返回 Date 对象以外的任何内容 - 它可能具有 NaN 时间值,表示无效日期,但对象本身将是有效的。
  • @RobG 我更新了这个问题。感谢您的观看!
  • new Date('2018-09-09') 将在相当现代的实现中返回 2018-09-09T00:00:00Z 的 Date 对象,它不会产生错误,因此您的问题出在其他地方。

标签: javascript reactjs date datepicker


【解决方案1】:

此答案假定您只需要日期。

确保 GET 请求返回的字符串遵循 ISO 格式:YYYY-MM-DD

有关更多详细信息,您可以参考这些答案 - link 1link 2

更新:在进一步挖掘时,我遇到了this issue,它建议按照其中一个 cmets 中的建议使用时刻来打包日期

<DatePicker
  className={styles.datePicker}
  selected={moment(this.props.endDate)}
  onChange={this.handleChangeEnd}
/>

【讨论】:

  • 我尝试将返回字符串转换为该格式并将其传递为新日期,然后使用该新日期对象,不幸的是它返回了相同的错误。
  • 我已经用另一个链接更新了答案。让我知道这是否适合你。如果没有,请写下你要返回的字符串。
  • 不幸的是,这也不起作用。我复制了错误,但粘贴到 cmets 太长。它仍然在说 date.clone 不是一个函数,我不知道它想让我通过什么。 @doodhwala
  • 不客气!更新解释发生了什么的问题,以便有相同问题的其他人可以从中受益。
  • 这不是答案,可能是评论。如果链接回答了问题,则应将其标记为重复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-14
  • 2015-03-06
  • 1970-01-01
  • 2018-08-26
  • 2013-02-22
相关资源
最近更新 更多