【问题标题】:Check if date has already been parsed with moment检查日期是否已经用时刻解析
【发布时间】:2019-02-25 23:30:42
【问题描述】:

我正在传递一个需要使用moment 适当解析的日期字符串。问题是在某些情况下它会被解析两次,这会导致它变成undefined

这是当前代码的样子:

moment.tz(dt, 'MMMM D, YYYY', timezone).toDate()

当我第二次解析它时,我得到:

moment.invalid(/* 2018-09-21T05:00:00.000Z */)

这会导致当我执行 toDate() 时变成 undefined

虽然第一次我会得到我所期望的:

'2019-02-01T05:00:00.000Z'

在做任何这些之前,我想检查一下它是否已经符合我期望的格式。我该怎么做?

【问题讨论】:

  • 为什么会被解析两次?这听起来有点像一个逻辑缺陷。有没有更好的方法通过改变代码流来防止这种情况发生?
  • 这与数据的转换有关。有时我将其转换为 json,有时从 json 转换为 csv,有时直接转换为 csv。这就是为什么我需要知道如何检查数据是否已经是我期望的格式,这将是我对逻辑缺陷的补救措施。
  • 而不是在解析日期之前检查变量的类型(我相信这将是您在这个问题中寻找的答案),我会尝试理解为什么函数在它被调用时被调用不需要,然后修复它。
  • 我猜您在更改数据格式的同时更改日期字符串(即在从 JSON 更改为 CSV 或其他内容的同时进行)。也许你可以把这两个过程分开,我不知道,我没有足够的信息来做出判断。但是如果没有更好的选择,您可以在调用toDate()之前使用isValid() 方法来检查解析是否有效@
  • 也许你应该向我们展示更多代码。

标签: javascript date momentjs moment-timezone


【解决方案1】:

您可以在调用toDate() 之前使用isValid() 方法检查解析是否有效。演示:

var timezone = "America/Los_Angeles";
var dt = 'Sept 21, 2018';
var m = moment.tz(dt, 'MMMM D, YYYY', timezone);
var converted = m.toDate().toString();
console.log(converted);

var x = moment.tz(converted, 'MMMM D, YYYY', timezone);
console.log(x.isValid());
//if parsing worked, use the new value
if (x.isValid()) {
  console.log(x.toDate());
}
// if not, assume it's already the correct format and just use that
else
{
  console.log(converted);
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-timezone/0.5.21/moment-timezone-with-data.min.js"></script>

【讨论】:

    猜你喜欢
    • 2018-03-24
    • 1970-01-01
    • 1970-01-01
    • 2016-08-24
    • 1970-01-01
    • 2020-06-14
    • 2016-06-24
    • 1970-01-01
    • 2019-03-27
    相关资源
    最近更新 更多