【问题标题】:Moment.js Date Returning InvalidMoment.js 日期返回无效
【发布时间】:2018-04-02 20:53:51
【问题描述】:

我有一个使用 Moment.js/Timezones 解析一些日期的 React 应用程序。我从 API 获取数据,许多日期返回正确并被解析,但有一些不是。例如,此日期:2018-04-03T02:10:00Z 正确解析,而此日期不正确:2018-04-03T01:40:00Z。我看不出有什么理由应该是这种情况。

我正在使用 moment.timezone 来猜测用户的时区:

this.state = {
  userZone: moment.tz.guess()
}

然后映射我的 API 响应并输出日期(或游戏状态,如果正在进行中)。

{this.props.status === 'Scheduled' ? moment(this.props.gameDate, 'YYYY-MM-DDTHH:MM00Z').tz(this.state.userZone).format('h:MM A z') : this.props.status}

我很困惑为什么这种情况只发生在几个约会中,实际上我已经断断续续地旋转了 4 个月......有什么想法吗?谢谢!

【问题讨论】:

  • 我不确定这是否会有大问题,但 ISO 日期应该在 Z 之前有 3 位毫秒:2017-09-14T18:40:16.000Z
  • 时间部分的第二个MM被解析为一个月,所以试试mm(也在format中)。

标签: reactjs date momentjs


【解决方案1】:

您在解析输入时遇到了一些问题。由于它采用符合 ISO 8601 的格式,因此您可以使用 moment(String) 而不是 moment(String, String)

您的代码可能如下所示:

{this.props.status === 'Scheduled' ? moment(this.props.gameDate).tz(this.state.userZone).format('h:mm A z') : this.props.status}

在您的问题中,您使用'YYYY-MM-DDTHH:MM00Z' 作为moment(String, String) 的格式参数,问题是格式标记区分大小写:大写MM 代表月份数字,而lovercase mm 代表分钟。 2018-04-03T01:40:00Z 给出的日期无效,因为使用您的代码,您试图将 40 解析为月份。

查看 here 示例,了解如何使用 moment(String, String) 解析符合 ISO 8601 的输入,如果您想在 UTC 模式下显式解析 UTC 输入,请查看 moment.utc

【讨论】:

  • 非常感谢。在查看文档时,我一定混淆了一些东西。 moment(this.props.gameDate).tz(this.state.userZone).format('h:mm A z') 效果很好。
猜你喜欢
  • 1970-01-01
  • 2014-02-27
  • 1970-01-01
  • 2017-04-04
  • 2013-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多