Сравнение даты с датой без сравнения времени в 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);
    }
});

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

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

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

Например,

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

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

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

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

656
ответ дан 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
59
ответ дан 13 апр. '15 в 12:45
источник

ОСТЕРЕГАЙТЕСЬ ВРЕМЕНИ

Использование объекта date для непосредственного представления даты просто поставит вас перед проблемой чрезмерной точности. Вы должны управлять временем и часовым поясом, чтобы не пускать их, и они могут вернуться обратно на любом этапе. Принятый ответ на этот вопрос попадает в ловушку.

Дата в JavaScript не имеет понятия о часовом поясе. Это момент времени (тики с начала эпохи) с удобными (статическими) функциями для перевода в и из строк, используя по умолчанию "локальный" часовой пояс устройства или, если указан, UTC или другой часовой пояс. Чтобы представить дату с помощью объекта даты, вы хотите, чтобы ваши даты представляли полночь UTC в начале рассматриваемой даты. Это общее и необходимое соглашение, которое позволяет вам работать с датами независимо от времени года или часового пояса их создания. Таким образом, вы должны быть очень бдительными, чтобы управлять понятием часового пояса, как при создании объекта "Дата в формате UTC", так и при его сериализации.

Многие люди смущены поведением консоли по умолчанию. Если вы распылите дату на консоль, вы увидите, что вы увидите ваш часовой пояс. Это просто потому, что консоль вызывает toString() для вашей даты, а toString() дает вам локальное представление. Базовая дата не имеет часового пояса! (Пока время совпадает со смещением часового пояса, у вас все еще будет объект даты в полночь по 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.getUTCFullYear(), myDate.getUTCMonth(), myDate.getUTCDate()));

Десериализовать дату

Часто даты на проводе будут в формате ГГГГ-ММ-ДД. Чтобы десериализовать их, сделайте это...

var midnightUTCDate = new Date( dateString + 'T00:00:00Z');

Сериализация

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

  • 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>

Видеть это работает...

51
ответ дан 27 июня '16 в 12:52
источник

Использование 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.

17
ответ дан 10 июля '16 в 22:50
источник

Это может быть немного более чистая версия, также обратите внимание, что вы всегда должны использовать 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
ответ дан 02 июня '11 в 1:47
источник

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

new Date().toDateString();

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

"Пт Фев 03 2017"

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

8
ответ дан 03 февр. '17 в 12:08
источник

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

5
ответ дан 23 апр. '10 в 16:21
источник

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

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();
    });
}
3
ответ дан 06 нояб. '11 в 23:10
источник

Как я не вижу здесь подобного подхода, и мне не нравится устанавливать 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
ответ дан 26 марта '15 в 1:45
источник

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

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

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

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

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

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

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

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

Эффективный и правильный способ сравнения дат:

Math.floor(date1.getTime() / 86400000) > Math.floor(date2.getTime() / 86400000);

Он игнорирует временную часть, он работает для разных часовых поясов, и вы также можете сравнить на равенство ==. 86400000 - это количество миллисекунд в дне (= 24*60*60*1000).

Помните, что оператор сравнения == никогда не должен использоваться для сравнения объектов Date, потому что он не работает, когда вы ожидаете, что тест на равенство сработает, потому что он сравнивает два объекта Date (и не сравнивает эти две даты), например:

> date1;
outputs: Thu Mar 08 2018 00:00:00 GMT+1300

> date2;
outputs: Thu Mar 08 2018 00:00:00 GMT+1300

> date1 == date2;
outputs: false

> Math.floor(date1.getTime() / 86400000) == Math.floor(date2.getTime() / 86400000);
outputs: true

Примечания: Если вы сравниваете объекты Date, для которых часть времени установлена в ноль, вы можете использовать date1.getTime() == date2.getTime() но вряд ли стоит оптимизировать. Вы можете использовать <, >, <= или >= при непосредственном сравнении объектов Date, поскольку эти операторы сначала преобразуют объект Date, вызывая .valueOf() прежде чем оператор .valueOf() сравнение.

1
ответ дан 08 марта '18 в 4:35
источник

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

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

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

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

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

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

Это поможет. Мне удалось получить это так.

var currentDate = new Date(new Date().getFullYear(), new Date().getMonth() , new Date().getDate())
0
ответ дан 28 июня '18 в 17:34
источник

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

если у вас есть date string как

String dateString="2018-01-01T18:19:12.543";

и вы просто хотите сравнить часть даты с другим объектом Date в JS,

var anotherDate=new Date(); //some date

затем необходимо convert string в объект Date с помощью new Date("2018-01-01T18:19:12.543");

и вот фокус:

var valueDate =new Date(new Date(dateString).toDateString());

            return valueDate.valueOf() == anotherDate.valueOf(); //here is the final result

Я использовал toDateString() Date object JS, который возвращает только строку Date.

Примечание. Не забудьте использовать .valueOf() при сравнении дат.

больше информации о .valeOf() здесь ссылка

Удачной кодировки.

0
ответ дан 05 янв. '18 в 13:24
источник

Другие вопросы по меткам или Задайте вопрос