Что не так с кодом ниже?
Может быть, было бы проще просто сравнить дату, а не время. Я не уверен, как это сделать, и я искал, но я не мог найти свою точную проблему.
Кстати, когда я отображаю две даты в предупреждении, они отображаются одинаково.
Мой код:
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);
}
});
Есть ли более простой способ сравнить даты, не включая время?
источник
date1 === date2
видимому, не обеспечивает согласованного поведения; это лучше сделатьdate1.valueOf() === b.valueOf()
или дажеdate1.getTime() === date2.getTime()
. Странность.var date2 = new Date(2011,8,20)
. Теперь измените часовой пояс ОС на Pacific Time (США). В том же браузере введите консоль,date2.toDateString()
и вы вернетесь,Mon Sep 19 2011
а не вторник 20-го!setHours()
устанавливает время на основе текущего часового пояса, который автоматически определяется браузером. Попробуйте:t = new Date("2016-02-29T01:45:49.098Z");
t.setHours(0,0,0,0);
console.log(t.toJSON());
напечатает"2016-02-28T15:00:00.000Z"
, дата 28, но не 29 Мой текущий часовой поясAsia/Tokyo
setUTCxxx
методы вместо вариантов с учетом локальных / часовых поясов.ОСТЕРЕГАЙТЕСЬ ВРЕМЕНИ
Использование объекта date для непосредственного представления даты просто поставит вас перед проблемой чрезмерной точности. Вы должны управлять временем и часовым поясом, чтобы не пускать их, и они могут вернуться обратно на любом этапе. Принятый ответ на этот вопрос попадает в ловушку.
Дата в JavaScript не имеет понятия о часовом поясе . Это момент времени (тики с начала эпохи) с удобными (статическими) функциями для перевода в и из строк, с использованием по умолчанию «локального» часового пояса устройства или, если указан, UTC или другого часового пояса. Чтобы представить just-a-date ™ с объектом даты, вы хотите , чтобы ваши даты представляли полночь UTC в начале рассматриваемой даты. Это общее и необходимое соглашение, которое позволяет вам работать с датами независимо от сезона или часового пояса их создания. Таким образом, вы должны быть очень бдительными, чтобы управлять понятием часового пояса, как при создании объекта «Дата в формате UTC», так и при его сериализации.
Многие люди смущены поведением консоли по умолчанию. Если вы распылите дату на консоль, вы увидите, что вы увидите ваш часовой пояс. Это просто потому, что консоль вызывает
toString()
вашу дату иtoString()
дает вам местное представительство. Базовая дата не имеет часового пояса ! (До тех пор, пока время соответствует смещению часового пояса, у вас все еще будет объект даты UTC в полночь)Десериализация (или создание полуночных UTC Date объектов)
Это шаг округления с хитростью в том, что есть два «правильных» ответа. В большинстве случаев вы хотите, чтобы ваша дата отражала часовой пояс пользователя. Нажмите, если сегодня ваш день рождения . Пользователи в Новой Зеландии и США нажимают одновременно и получают разные даты. В таком случае сделай это ...
Иногда международная сопоставимость превосходит локальную точность. В таком случае сделай это ...
Десериализовать дату
Часто даты на проводе будут в формате ГГГГ-ММ-ДД. Чтобы десериализовать их, сделайте это ...
Сериализация
Позаботившись об управлении часовым поясом при создании, теперь вы должны быть уверены, что часовой пояс не будет отображаться при преобразовании обратно в строковое представление. Так что вы можете смело использовать ...
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 лет слишком поздно ...
Вижу это работает ...
Обновление 2019 ... бесплатные вещи ...
Учитывая популярность этого ответа, я поместил все это в код. Следующая функция возвращает обернутый объект даты и предоставляет только те функции, которые безопасно использовать с just-a-date ™.
Вызовите его с объектом Date, и он будет преобразован в JustADate, отражая часовой пояс пользователя. Назовите его строкой: если строка соответствует ISO 8601 с указанием часового пояса, мы просто округлим часть времени. Если часовой пояс не указан, мы конвертируем его в дату, отражающую местный часовой пояс, как и для объектов даты.
источник
Как насчет этого?
Это позволяет вам сравнивать часть даты с датой следующим образом, не влияя на значение вашей переменной:
источник
Использование Moment.js
Если у вас есть возможность включить стороннюю библиотеку, определенно стоит взглянуть на Moment.js . Это делает работу с
Date
иDateTime
много, гораздо проще.Например, видя, что одна Дата идет после другой, но исключая их время, вы должны сделать что-то вроде этого:
Второй параметр , который вы проходите в
isAfter
это точность , чтобы сделать сравнение и может быть любой изyear
,month
,week
,day
,hour
,minute
илиsecond
.источник
Просто сравните, используя .toDateString, как показано ниже:
Это вернет вам только часть даты, а не время или часовой пояс, например:
Следовательно, обе даты можно сравнивать в этом формате аналогично без временной части.
источник
new Date(new Date().toDateString());
Это может быть немного более чистая версия, также обратите внимание, что вы должны всегда использовать основание при использовании parseInt.
Посетите страницу parseInt MDC для получения дополнительной информации о radix.
JSLint - это отличный инструмент для обнаружения таких вещей, как отсутствующий корень и многие другие вещи, которые могут вызвать неясные и сложные ошибки в отладке. Это заставляет вас использовать лучшие стандарты кодирования, чтобы избежать головной боли в будущем. Я использую его в каждом проекте JavaScript, который я кодирую.
источник
Библиотека date.js удобна для этих вещей. Это делает все сценарии, связанные с датой JS, намного проще.
источник
Если вы действительно сравниваете дату только с отсутствующим временным компонентом, другое решение, которое может показаться неправильным, но работает и позволяет избежать
Date()
головной боли во времени и часовом поясе, - это сравнить строковую дату ISO напрямую, используя сравнение строк:Вы можете получить текущую дату (дату UTC, а не обязательно локальную дату пользователя), используя:
Мой аргумент в пользу этого - простота программиста - вы гораздо меньше рискуете испортить это, чем пытаться правильно обрабатывать время и смещение, вероятно, за счет скорости (я не сравнивал производительность)
источник
new Date().toISOString().substr(0, 10) // "2019-04-22"
.new Date().toLocaleDateString() // "8/26/2019"
. Но тогда сравнение текста не будет точным (например"8/26/2019" >= "9/29/2001"
, ложным). Поэтому вам необходимо преобразовать его,new Date(new Date().toLocaleDateString())
чтобы точно сравнить с другой датой.Просто используйте toDateString () для обеих дат. toDateString не включает время, поэтому для 2 раз в одну и ту же дату значения будут одинаковыми, как показано ниже.
Очевидно, что некоторые проблемы с часовыми поясами, высказанные в других местах по этому вопросу, являются действительными, но во многих случаях они не актуальны.
источник
Вот как я это делаю:
источник
getTime()
это необходимо?setHours()
изменяет объект, к которому он вызывается, и возвращает дату в виде количества миллисекунд (эквивалентно вызовуgetTime()
). Следовательно, вашаtoday
переменная не являетсяDate
объектом, как некоторые ожидают, но на самом деле представляет собой целое число миллисекунд. В качестве побочного эффекта именно поэтому вам не нужно было звонитьgetTime()
перед сравнением, так как вы уже сделали это неясным образом.Поскольку я не вижу здесь подобного подхода, и мне не нравится устанавливать h / m / s / ms в 0, так как это может вызвать проблемы с точным переходом на местный часовой пояс с измененным
date
объектом (я полагаю, так), позвольте мне представьте здесь, написанную несколько минут назад, функцию lil:+
: Прост в использовании, выполняет базовые операции сравнения (сравнивая день, месяц и год без времени.)-
: Кажется, что это полная противоположность мышлению «из коробки».Применение:
datecompare(date1, '===', date2)
для проверки на равенство,datecompare(date1, '>', date2)
для большей проверки,!datecompare(date1, '>', date2)
для проверки меньшей или равнойТакже, очевидно, вы можете переключаться
date1
иdate2
местами, чтобы добиться любого другого простого сравнения.источник
Эффективный и правильный способ сравнения дат:
Он игнорирует временную часть, он работает для разных часовых поясов, и вы также можете сравнить на равенство
==
. 86400000 - это количество миллисекунд в дне (= 24*60*60*1000
).Учтите , что оператор равенства
==
не должен никогда использоваться для сравнения объектов Date , поскольку он терпит неудачу , когда можно было бы ожидать тест равенства на работе , потому что это сравнение двух объектов Date (и не сравнить две даты) , например:Примечания: Если вы сравниваете объекты Date, у которых часть времени установлена на ноль, то вы можете использовать,
date1.getTime() == date2.getTime()
но вряд ли стоит оптимизировать. Вы можете использовать<
,>
,<=
или>=
при сравнении даты объектов напрямую , потому что эти операторы сначала преобразовать объект Date, вызвав.valueOf()
перед оператором делает сравнение.источник
Прочитав этот вопрос практически в то же время, когда он был опубликован, я решил опубликовать другое решение, так как я не нашел его достаточно удовлетворительным, по крайней мере, для моих потребностей:
Я использовал что-то вроде этого:
Таким образом, я мог бы использовать даты в том формате, который хотел потом обработать. Но это было только для моей необходимости, но я все равно решил опубликовать это, может быть, это кому-то поможет
источник
currentDate
переменная не дата, а количество миллисекунд с 1970-01-01. ВsetHours()
метод изменяет даты объекта он вызывается, и возвращает эквивалентgetTime()
(значение даты в миллисекундах , так как 1970-01-01).Удостоверьтесь, что вы строите
userDate
с 4-значным годом какsetFullYear(10, ...) !== setFullYear(2010, ...)
.источник
Вы можете использовать некоторую арифметику с суммой мс.
Мне это нравится, потому что обновления оригинальных дат не производятся и выполняются быстрее, чем разбивка строк и сравнение.
Надеюсь, это поможет!
источник
Этот JS изменит содержание после установленной даты, это то же самое, но в w3schools
источник
Это работает для меня:
В принятом ответе есть проблема часового пояса, а в другое время нет 00:00:00
источник
Я знаю, что на этот вопрос уже был дан ответ, и это, возможно, не лучший способ, но в моем сценарии он работает отлично, поэтому я подумал, что он может помочь кому-то, как я.
если у вас есть
date string
каки вы просто хотите сравнить часть даты с другим объектом Date в JS,
то вы должны к объекту с помощью
convert
string
Date
new Date("2018-01-01T18:19:12.543");
и вот фокус:
Я использовал
toDateString()
изDate object
JS, который возвращает только строку даты.Примечание: не забудьте использовать
.valueOf()
функцию при сравнении дат.больше информации о
.valeOf()
здесь ссылкаУдачной кодировки.
источник
Это поможет. Мне удалось получить это так.
источник
Сравнение с
setHours()
будет решением. Образец:источник
если формат даты отличается, то используйте библиотеку moment.js для преобразования формата даты, а затем используйте приведенный выше код для сравнения двух дат
Пример :
Если ваша дата указана в формате «ДД / ММ / ГГГГ» и требуется преобразовать ее в «ММ / ДД / ГГГГ», см. Приведенный ниже пример кода
источник
Вы можете использовать fp_incr (0). Который устанавливает часть часового пояса в полночь и возвращает объект даты.
источник