Справка JavaScript - сравнить две даты в формате (дд / ммм / гггг) - PullRequest
2 голосов
/ 11 мая 2010

Я пытаюсь сравнить два значения текстового поля в форме aspx. Оба значения представляют даты. Они отформатированы как «дд / ммм / гггг». Как я могу сравнить их в JavaScript, чтобы увидеть, не равны ли они, а какой больше и т. Д.

Есть ли в JavaScript конструктор даты для таких строк? Любые советы будут оценены.

Ответы [ 5 ]

3 голосов
/ 11 мая 2010

Вы хотите использовать Date.parse () Итак, чтобы преобразовать в метку времени Unix в миллисекундах:

var d = Date.parse("Jul 8, 2005");
> 1120773600000 

Теперь вы можете манипулировать датой как целым значением.

0 голосов
/ 12 мая 2010

Если все, что вы хотите сделать сравнение, то вы можете просто сделать:

compareDates(d1, d2) {
  d1 = d1.split("/").reverse().join("/");
  d2 = d2.split("/").reverse().join("/");
  return d1 == d2 ? 0 : d1 < d2 ? : -1 : 1;
}

Предполагая, что аргументы имеют формат «дд / мм / гггг», эта функция вернет 0, если d1 == d2, -1, если d1 d2.

PS: если ваши массивы не умеют reverse, научите их, как:

Array.prototype.reverse = function() {
 var a = [];
 for(var i=this.length; i; i--) a.push(this[i-1]);
 return a;
}

РЕДАКТИРОВАТЬ: хорошо, я не заметил формат "МММ". Тогда я бы использовал хэш названий месяцев.

function compareDates(date1,date2) {
 var d1 = date1.split("/").reverse();
 var d2 = date2.split("/").reverse();

 var months = { 'Jan':'01', 'Feb':'02' }; // ...

 d1[1] = months[d1[1]] || '00';
 d2[1] = months[d2[1]] || '00';

 date1 = d1.join("/");
 date2 = d2.join("/");

 return date1 == date2 ? 0 : date1 < date2 ? : -1 : 1;
}
0 голосов
/ 12 мая 2010

К сожалению, способ Date.parse не является надежным, даже для формата ISO.

Здесь ниже представлена ​​быстрая однократная функция для анализа дат того формата, который вы используете в настоящее время.Если вам нравится, вы можете добавить некоторую проверку работоспособности, чтобы увидеть, находится ли этот день в пределах каждого месяца (не забывайте о leapyear, тогда :)), но если кто-то имеет разумный контроль над строками, которые он отправляет, это работает.

function parseThisYourVeryKnownFormatToDate(dateString /* '12/Jun/2010' */) {
  function getMonthIdx(monthName) {
    var months = {
      'Jan':0, 'Feb':1, 'Mar':2, 'Apr':3, 'May':4, 'Jun':5
      , 'Jul':6, 'Aug':7, 'Sep':8, 'Oct':9, 'Nov':10, 'Dec':11
    };
    return months[monthName];
  }
  var format = /^(\d+)\/(\w{3})\/(\d{4})$/;
  var match = format.exec(dateString);
  if (!match) {return undefined;}
  var day = match[1], monthIdx = getMonthIdx(match[2]), year = match[3];
  return new Date(year, monthIdx, day);
}

var testDates = ['10/Jan/2008', '15/Jun/1971', '31/Dec/1999', 'bogus/date/foo'];
for (var idx=0, len=testDates.length; idx<len; ++idx) {
  console.log(parseThisYourVeryKnownFormatToDate(testDates[idx])); // real date objects, except for the last
}

var d0 = (parseThisYourVeryKnownFormatToDate('15/Apr/2009'));
var d1 = (parseThisYourVeryKnownFormatToDate('12/Apr/2009'));
console.log(d0+' is after '+d1+': '+(d0.getTime()>d1.getTime())); // says true
console.log(d1+' is after '+d0+': '+(d1.getTime()>d0.getTime())); // says false
console.log(d0+' is after '+d0+': '+(d0.getTime()>d0.getTime())); // says false
0 голосов
/ 11 мая 2010

Читать об объекте Date .

0 голосов
/ 11 мая 2010

Преобразуйте даты в метку времени UNIX, а затем просто сравните значения.

if (date1.getTime() > date2.getTime()) alert("bla");

Чтобы быть более точным, функция getTime возвращает количество миллисекунд с 1970/01/01 года: http://www.w3schools.com/jsref/jsref_getTime.asp

И немного пояснений о времени UNIX: http://en.wikipedia.org/wiki/Unix_time

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...