使用Moment验证默认的Javascript日期格式

时间:2017-11-29 00:06:16

标签: javascript validation date momentjs

我想使用片刻(或任何其他方法)根据默认的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。

2 个答案:

答案 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;
&#13;
&#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 modemoment(String, String, Boolean))。

请注意,片刻不提供解析时区缩写的标记(例如CST),因此您的输入将无法在严格模式下识别。这里是一个使用严格和宽容模式解析的例子; myIsValid函数是从输入中删除时区缩写的示例。

&#13;
&#13;
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;
&#13;
&#13;

最新版本的时刻(2.19.2),即使在原谅模式下也会提供无效日期。使用parsingFlags(),您会发现weekdayMismatchtrue,我认为这是2.19+版本时刻的问题这与时刻{{3}有关问题。

&#13;
&#13;
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;
&#13;
&#13;