Сравнение даты с датой без сравнения времени в JavaScript

Что не так с кодом ниже?

Возможно, было бы проще просто сравнить дату, а не время. Я также не знаю, как это сделать, и я искал, но я не мог найти свою точную проблему.

Кстати, когда я показываю две даты в предупреждении, они отображаются точно так же.

Мой код:

window.addEvent('domready', function() {
    var now = new Date();
    var input = $('datum').getValue();
    var dateArray = input.split('/');
    var userMonth = parseInt(dateArray[1])-1;
    var userDate = new Date();
    userDate.setFullYear(dateArray[2], userMonth, dateArray[0], now.getHours(), now.getMinutes(), now.getSeconds(), now.getMilliseconds());

    if (userDate > now)
    {
        alert(now + '\n' + userDate);
    }
});

Есть ли более простой способ сравнить даты и не включать время?

254
задан moleculezz 23 апр. '10 в 16:08
источник поделиться
12 ответов

Я все еще изучаю JavaScript, и единственный способ, который я нашел, который работает для меня, чтобы сравнить две даты без времени, - это использовать метод setHours объекта Date и установить часы, минуты, секунды и миллисекунды до нуля. Затем сравните две даты.

Например,

date1 = new Date()
date2 = new Date(2011,8,20)

date2 будет устанавливаться с часами, минутами, секундами и миллисекундами до нуля, но date1 будет устанавливать их на время создания этой даты1. Чтобы избавиться от часов, минут, секунд и миллисекунд на дату1, выполните следующие действия:

date1.setHours(0,0,0,0)

Теперь вы можете сравнить две даты как DATES, не беспокоясь о элементах времени.

561
ответ дан nexar 01 июня '11 в 16:46
источник поделиться

Как насчет этого?

Date.prototype.withoutTime = function () {
    var d = new Date(this);
    d.setHours(0, 0, 0, 0);
    return d;
}

Это позволяет сравнить дату даты такой, как это, не влияя на значение вашей переменной:

var date1 = new Date(2014,1,1);
new Date().withoutTime() > date1.withoutTime(); // true
49
ответ дан AdEpt 13 апр. '15 в 12:45
источник поделиться

Использование Moment.js

Если у вас есть возможность включить стороннюю библиотеку, определенно стоит взглянуть на Moment.js. Это значительно облегчает работу с Date и DateTime.

Например, если одна Дата приходит после другой Даты, но исключая их время, вы делаете что-то вроде этого:

var date1 = new Date(2016,9,20,12,0,0); // October 20, 2016 12:00:00
var date2 = new Date(2016,9,20,12,1,0); // October 20, 2016 12:01:00

// Comparison including time.
moment(date2).isAfter(date1); // => true

// Comparison excluding time.
moment(date2).isAfter(date1, 'day'); // => false

Второй параметр, который вы передаете в isAfter, является точностью для сравнения и может быть любым из year, month, week, day, hour, minute или second.

12
ответ дан Joshua Pinter 10 июля '16 в 22:50
источник поделиться

ОСТОРОЖНО ВРЕМЕНИ

Объект даты javascript делает это излишне сложным, поэтому вряд ли это будет сделано хорошо. Принятый ответ на этот вопрос попадает в ловушку.

В дате javascript нет понятия часового пояса. Это момент времени (тики с эпохи) с удобными функциями для перевода в строки и из строк в "локальном" часовом поясе. Если вы хотите работать с датами с использованием объектов даты, , вы хотите, чтобы ваши даты представляли собой полутонов UTC в начале указанной даты. Это обычное и необходимое соглашение, которое позволяет работать с датами независимо от того, сезон или часовой пояс их создания. Поэтому вам нужно быть очень бдительными, чтобы управлять понятием часового пояса, особенно когда вы создаете свой полуночный объект UTC Date.

В большинстве случаев вы хотите, чтобы ваша дата отражала часовой пояс пользователя. Нажмите, если сегодня ваш день рождения. Пользователи в Новой Зеландии и США щелкают одновременно и получают разные даты. В этом случае сделайте это...

// create a date (utc midnight) reflecting the value of myDate and the environment timezone offset.
new Date(Date.UTC(myDate.getFullYear(),myDate.getMonth(), myDate.getDate()));

Иногда международная сопоставимость превосходит локальную точность. В этом случае сделайте это...

// the date in London of a moment in time. Device timezone is ignored.
new Date(Date.UTC(myDate.getUTCYear(), myDate.getyUTCMonth(), myDate.getUTCDate()));

Позаботившись, чтобы управлять часовым поясом при создании, теперь вы должны быть уверены, что оставите часовой пояс при обратном преобразовании в строковое представление. Таким образом, вы можете безопасно использовать...

  • toISOString()
  • getUTCxxx()
  • getTime() //returns a number with no time or timezone.
  • .toLocaleDateString("fr",{timezone:"UTC"}) // whatever locale you want, but ALWAYS UTC.

И полностью избегайте всего остального, особенно...

  • getYear(), getMonth(), getDate()

Итак, чтобы ответить на ваш вопрос, 7 лет слишком поздно...

<input type="date" onchange="isInPast(event)">
<script>
var isInPast = function(event){
  debugger;
  var userEntered = new Date(event.target.valueAsNumber); // valueAsNumber has no time or timezone!
  var now = new Date();
  var today = new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate() ));
  if(userEntered.getTime() < today.getTime())
    alert("date is past");
  else if(userEntered.getTime() == today.getTime())
    alert("date is today");
  else
    alert("date is future");

}
</script>

Посмотрите, как работает...

10
ответ дан bbsimonbb 27 июня '16 в 12:52
источник поделиться

Это может быть немного более чистая версия, также обратите внимание, что вы всегда должны использовать radix при использовании parseInt.

window.addEvent('domready', function() {
    // Create a Date object set to midnight on today date
    var today = new Date((new Date()).setHours(0, 0, 0, 0)),
    input = $('datum').getValue(),
    dateArray = input.split('/'),
    // Always specify a radix with parseInt(), setting the radix to 10 ensures that
    // the number is interpreted as a decimal.  It is particularly important with
    // dates, if the user had entered '09' for the month and you don't use a
    // radix '09' is interpreted as an octal number and parseInt would return 0, not 9!
    userMonth = parseInt(dateArray[1], 10) - 1,
    // Create a Date object set to midnight on the day the user specified
    userDate = new Date(dateArray[2], userMonth, dateArray[0], 0, 0, 0, 0);

    // Convert date objects to milliseconds and compare
    if(userDate.getTime() > today.getTime())
    {
            alert(today+'\n'+userDate);
    }
});

За дополнительной информацией о радиксе обратитесь к странице MDC parseInt.

JSLint - отличный инструмент для поиска вещей, таких как отсутствующий радикс и многие другие вещи, которые могут вызвать неясность и сложность отладки ошибок, Это заставляет вас использовать лучшие стандарты кодирования, чтобы избежать будущих головных болей. Я использую его для каждого проекта JavaScript, который я кодирую.

8
ответ дан Useless Code 02 июня '11 в 1:47
источник поделиться

Библиотека date.js удобна для этих вещей. Это упрощает все сценарии, связанные с датой JS.

5
ответ дан Diodeus - James MacFarlane 23 апр. '10 в 16:21
источник поделиться

Как я не вижу здесь подобного подхода, и мне не нравится устанавливать h/m/s/ms на 0, так как это может вызвать проблемы с точным переходом в локальный часовой пояс с измененным объектом date (I предположим так), позвольте мне представить здесь это, написанное несколько мгновений назад, lil function:

+: Простая в использовании, делает основные операции сравнения (сравнение дня, месяца и года без времени).
-: Кажется, что это полная противоположность мышлению "из коробки".

function datecompare(date1, sign, date2) {
    var day1 = date1.getDate();
    var mon1 = date1.getMonth();
    var year1 = date1.getFullYear();
    var day2 = date2.getDate();
    var mon2 = date2.getMonth();
    var year2 = date2.getFullYear();
    if (sign === '===') {
        if (day1 === day2 && mon1 === mon2 && year1 === year2) return true;
        else return false;
    }
    else if (sign === '>') {
        if (year1 > year2) return true;
        else if (year1 === year2 && mon1 > mon2) return true;
        else if (year1 === year2 && mon1 === mon2 && day1 > day2) return true;
        else return false;
    }    
}

Использование:

datecompare(date1, '===', date2) для проверки равенства,
datecompare(date1, '>', date2) для большей проверки,
!datecompare(date1, '>', date2) для менее или равной проверки

Кроме того, вы можете переключать date1 и date2 в местах, чтобы достичь любого другого простого сравнения.

3
ответ дан Max Yari 26 марта '15 в 1:45
источник поделиться

Просто сравните с помощью .toDateString, как показано ниже:

new Date().toDateString();

Это вернет вам только дату, а не время или часовой пояс, например:

"Пт Фев 03 2017"

Следовательно, обе даты могут сравниваться в этом формате также без временной части.

2
ответ дан Rahi 03 февр. '17 в 12:08
источник поделиться

Так я это делаю:

var myDate  = new Date($('input[name=frequency_start]').val()).setHours(0,0,0,0);
var today   = new Date().setHours(0,0,0,0);
if(today>myDate){
    jAlert('Please Enter a date in the future','Date Start Error', function(){
        $('input[name=frequency_start]').focus().select();
    });
}
2
ответ дан Fabrizio 06 нояб. '11 в 23:10
источник поделиться

После прочтения этого вопроса в то же время после его публикации я решил опубликовать другое решение, так как не нашел его вполне удовлетворительным, по крайней мере, для моих нужд:

Я использовал что-то вроде этого:

var currentDate= new Date().setHours(0,0,0,0);

var startDay = new Date(currentDate - 86400000 * 2);
var finalDay = new Date(currentDate + 86400000 * 2);

Таким образом, я мог бы использовать даты в формате, который я хотел бы обработать впоследствии. Но это было только для моей потребности, но я решил опубликовать его в любом случае, возможно, это поможет кому-то

1
ответ дан Aleks 21 янв. '14 в 12:19
источник поделиться

Убедитесь, что вы построили userDate с 4-значным годом как setFullYear(10, ...) !== setFullYear(2010, ...).

1
ответ дан Alex K. 23 апр. '10 в 16:31
источник поделиться

Вы можете использовать некоторую арифметику с общим количеством ms.

var date = new Date(date1);
date.setHours(0, 0, 0, 0);

var diff = date2.getTime() - date.getTime();
return diff >= 0 && diff < 86400000;

Мне это нравится, потому что обновление исходных дат не выполняется и выполняется быстрее, чем разделение строк и сравнение.

Надеюсь на эту помощь!

1
ответ дан Miguel 27 янв. '16 в 15:11
источник поделиться

Другие вопросы по меткам