Использование момента для проверки формата даты по умолчанию в Javascript

1

Я хочу использовать момент (или любой другой метод) для проверки конкретной строки как допустимого значения даты на основе формата даты 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)?

Я исследовал всюду, чтобы понять, какой формат Tue Nov 28 2017 17:54:41 GMT-0600 (CST), но я ничего не могу найти. Это не ISO 8601, а не RFC 2822.

  • 2
    что заставляет вас думать, что new Date() производит строку?
  • 0
    @Sag1v Sag1v Я не говорю, что это так, я просто говорю, что у меня есть строка в этом формате
Показать ещё 1 комментарий
Теги:
validation
date
momentjs

2 ответа

1
Лучший ответ

Как заявил RobG в комментариях "Формат дат javascript по умолчанию". Результат Date.prototype.toString зависит от реализации

Поскольку ваш вход ни в ISO 8601, ни в форматах времени RFC 2822 Date, вы должны использовать moment(String, String) используя 'ddd MMM D YYYY HH:mm:ss [GMT]Z' качестве параметра формата. Если вы хотите, чтобы строка строго соответствовала вашему формату, вы можете использовать строгий режим (moment(String, String, Boolean)).

Обратите внимание, что момент не предоставляет токен для аббревиатуры разбора часового пояса (например, CST), поэтому ваш вход не будет распознаваться в строгом режиме. Вот пример синтаксического анализа, использующий как строгий, так и прощающий режим; Функция myIsValid - это пример удаления 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));
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>

Последняя версия момента (2.19.2), дает недопустимую дату даже в режиме прощения. Используя parsingFlags() вы видите, что weekdayMismatch true, я думаю это вопрос версии 2. 19+ момента это связано с вопросом № 4227.

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());
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.19.2/moment.min.js"></script>
1

Если вы хотите строго проверить метку времени с помощью Moment.js, используйте синтаксический флаг при разборе:

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>

Однако для меня и строгая и свободная продукция "Недействительная дата", которая является неправильной (и должна быть "Недействительной датой"). Проблема, по-видимому, является значением или токеном часового пояса.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню