我想使用片刻(或任何其他方法)根据默认的javascript日期格式将特定字符串验证为有效日期值。
我有以下代码:
var date = new Date(); // Tue Nov 28 2017 17:54:41 GMT-0600 (CST)
我想获取该字符串输出并使用时刻将其验证为有效的日期字符串。我知道我可以这样做:
moment(date, moment.ISO_8601).isValid();
但是有一个问题。以下是相同日期值的结果:
moment(new Date(), moment.ISO_8601).isValid(); //True
moment("Tue Nov 28 2017 17:54:41 GMT-0600 (CST)", moment.ISO_8601).isValid() //False
这不是我想要的,因为它们都应该是真的。我无法做new Date(...)
,因为这是该方法的结果:
moment(new Date("Tue Nov 28 2017 17:54:41 GMT-0600 (CST)"), moment.ISO_8601).isValid(); //True
moment(new Date("3"), moment.ISO_8601).isValid(); //True
这也不是我想要的,因为第二行应该是假的。
如果字符串严格遵循Tue Nov 28 2017 17:54:41 GMT-0600 (CST)
格式,我如何正确地将字符串有效地作为有效日期?
我到处研究了解Tue Nov 28 2017 17:54:41 GMT-0600 (CST)
是什么格式,但我找不到任何东西。它不是ISO 8601而不是RFC 2822。
答案 0 :(得分:1)
如果要使用Moment.js严格验证时间戳,请在解析时使用strict标志:
var s = 'Tue Nov 28 2017 17:54:41 GMT-0600';
s = s.replace('GMT','');
console.log('Modified string: ' + s);
var mStrict = moment(s, 'ddd MMM D YYYY HH:mm:ss ZZ', true);
console.log('Strict parse: ' + mStrict.format());
var mLoose = moment(s, 'ddd MMM D YYYY HH:mm:ss ZZ');
console.log('Loose parse : ' + mLoose.format());

<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.19.2/moment.min.js"></script>
&#13;
然而,对我来说,严格和松散的产品&#34;无效的日期&#34;,这是不正确的(并且应该是&#34;无效的日期&#34;)。问题似乎是时区价值或代币。
答案 1 :(得分:1)
正如RobG在评论中所述没有&#34;默认的javascript日期格式&#34;。 Date.prototype.toString的输出是依赖于实现的
由于您的输入既不是ISO 8601也不是RFC 2822日期时间格式,您必须使用moment(String, String)
作为格式参数使用'ddd MMM D YYYY HH:mm:ss [GMT]Z'
。如果您希望字符串严格您的格式,则可以使用strict mode(moment(String, String, Boolean)
)。
请注意,片刻不提供解析时区缩写的标记(例如CST
),因此您的输入将无法在严格模式下识别。这里是一个使用严格和宽容模式解析的例子; myIsValid
函数是从输入中删除时区缩写的示例。
var s = 'Tue Nov 28 2017 17:54:41 GMT-0600 (CST)';
var fmt = 'ddd MMM D YYYY HH:mm:ss [GMT]Z';
console.log(moment(s, fmt).isValid());
console.log(moment(s, fmt, true).isValid());
function myIsValid(input){
// Check if input contains ()
var idxl = input.indexOf('(');
var idxr = input.indexOf(')');
if( idxl>0 && idxr>0 ){
// Remove timezone abbreviation
input = input.substr(0, idxl-1);
}
var fmt = 'ddd MMM D YYYY HH:mm:ss [GMT]Z';
return moment(input, fmt, true).isValid();
}
console.log(myIsValid(s));
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>
&#13;
最新版本的时刻(2.19.2
),即使在原谅模式下也会提供无效日期。使用parsingFlags()
,您会发现weekdayMismatch
是true
,我认为这是2.19+版本时刻的问题这与时刻{{3}有关问题。
var s = 'Tue Nov 28 2017 17:54:41 GMT-0600 (CST)';
var fmt = 'ddd MMM D YYYY HH:mm:ss [GMT]Z';
var m1 = moment(s, fmt);
var m2 = moment(s, fmt, true);
console.log(m1.isValid());
console.log(m1.parsingFlags());
console.log(m2.isValid());
console.log(m2.parsingFlags());
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.19.2/moment.min.js"></script>
&#13;