Moment: 解析值而不回退

创建于 2015-07-10  ·  9评论  ·  资料来源: moment/moment

将任意值传递给moment(value)会根据 #1407 产生弃用警告。

如果有某种方法可以使用这种解析但又不回退到 Date 构造函数,那就太好了。 到目前为止,我发现的唯一方法相当笨拙:

if (moment.isDate(value)) {
    return moment(value);
} else {
    return moment(value, moment.ISO_8601);
}

即便如此,这仍然无法解析 ASP.net /Date(1198908717056)/字符串。

最简单的选择是允许使用两个参数形式的严格选项: moment(value, true)

谢谢。

Enhancement

最有用的评论

@SystemParadox以防万一,我遇到了与您类似的问题,我最终创建了如下包装函数:

function disableNativeDateFallback(config) {
    config._d = new Date(parseFloat('NaN')); // an invalid date
}
function makeMomentWrapper(momentFn) {
    return function() {
        var prevFallback = moment.createFromInputFallback;
        moment.createFromInputFallback = disableNativeDateFallback;
        var result = momentFn.apply(null, arguments);
        moment.createFromInputFallback = prevFallback;
        return result;
    }
};
var momentStrict = makeMomentWrapper(moment);
momentStrict.utc = makeMomentWrapper(moment.utc);

它们的工作方式是简单地替换createFromInputFallback ,然后在返回之前将其恢复以避免影响其他代码。 您准备迁移的任何代码都可以使用momentStrictmomentStrict.utc而不是momentmoment.utc ,其余的可以保持原样。

所有9条评论

只是为了澄清,您要求一种禁用回退而不是显示警告的方法 - 不使用严格模式,对吗?

是的,我想自动解析moment()支持的所有内容,但如果它们都失败了,我希望它生成无效日期,而不是打印警告并使用Date构造函数。

我想预先选择加入moment的未来版本的行为,其中弃用的Date构造函数回退将完全删除。

我不确定你所说的严格模式到底是什么意思。 你的意思是在传递像moment(value, 'YYYY-MM-DD')这样的确切格式时吗? 如果是这样,这无济于事,因为 1. 它过于冗长,2. 它仍然不包括moment(value)在诉诸Date构造函数之前可以解析的所有格式。

通过传递true作为最后一个参数来启用严格模式。 它在文档中。 基本上,这意味着字符串必须与格式 _exactly_ 匹配。

由于moment(String)直接支持的格式已在文档中列出,我认为将其视为与严格模式相同是可以接受的。 换句话说,添加moment(String, Boolean)

是啊,那样最好了。 谢谢。

@SystemParadox是的,您想要的是支持。 您只需覆盖moment.createFromInputFallback(config)

moment.createFromInputFallback = function (config) {
    config._d = new Date(NaN);
}

我同意这不是微不足道的,但有可能;-)

这很有帮助,但会全局更改设置。

如果我想一次调用一次逐步迁移代码库怎么办?

为什么我们不能只添加对moment(String, true)

重新开放,虽然有解决方法,但在公共 API 中使用它会有助于各种用例。 还要考虑 #2535,要求仅围绕内置格式进行验证。

需要的是 moment.JS_DATE 常量,这意味着只需将输入传递给new Date ,检查https://github.com/moment/moment/issues/1686。 接受拉取请求。

@SystemParadox以防万一,我遇到了与您类似的问题,我最终创建了如下包装函数:

function disableNativeDateFallback(config) {
    config._d = new Date(parseFloat('NaN')); // an invalid date
}
function makeMomentWrapper(momentFn) {
    return function() {
        var prevFallback = moment.createFromInputFallback;
        moment.createFromInputFallback = disableNativeDateFallback;
        var result = momentFn.apply(null, arguments);
        moment.createFromInputFallback = prevFallback;
        return result;
    }
};
var momentStrict = makeMomentWrapper(moment);
momentStrict.utc = makeMomentWrapper(moment.utc);

它们的工作方式是简单地替换createFromInputFallback ,然后在返回之前将其恢复以避免影响其他代码。 您准备迁移的任何代码都可以使用momentStrictmomentStrict.utc而不是momentmoment.utc ,其余的可以保持原样。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

nikocraft picture nikocraft  ·  3评论

dogukankotan picture dogukankotan  ·  3评论

Shoroh picture Shoroh  ·  3评论

tanepiper picture tanepiper  ·  3评论

vbullinger picture vbullinger  ·  3评论