Порівняйте дві дати з JavaScript


1950

Чи може хтось запропонувати спосіб порівняння значень двох дат, більших, менших, а не раніше, використовуючи JavaScript? Значення будуть надходити з текстових полів.


17
Що стосується DateTime та маніпуляцій в JS, я дивлюся не далі, ніж momentjs :)
Хелсйон

47
не потрібно використовувати momentjs для порівняння двох дат. Просто використовуйте чистий об'єкт дати JavaScript. Перевірте головну відповідь для отримання більш детальної інформації.
Лукас Лейсіс

Ви можете послатися таку відповідь: stackoverflow.com/questions/4812152 / ... Перевірте getDateDifference і getDifferenceInDays , якщо це може допомогти.
Вікаш Раджпурохіт

Я дам вам привід шукати далі, ніж Moment.js ( який я люблю, АЛЕ ... ): Не використовуйте для циклічного навантаження
Geek Stocks

Про корисну функцію для розділення різниці в часі на одиниці (секунди, хвилини, години тощо) дивіться відповідь на сайті stackoverflow.com/questions/1968167/… . Ця відповідь тепер також доступна на сайті stackoverflow.com/a/46529159/3787376 .
Едвард

Відповіді:


2284

Об'єкт Дата буде робити те , що ви хочете - конструкт один на кожну дату, а потім порівняти їх з допомогою >, <, <=або >=.

==, !=, ===, І !==оператори вимагають використовувати date.getTime()як в

var d1 = new Date();
var d2 = new Date(d1);
var same = d1.getTime() === d2.getTime();
var notSame = d1.getTime() !== d2.getTime();

щоб було зрозуміло, просто перевірка рівності безпосередньо з об'єктами дати не працюватиме

var d1 = new Date();
var d2 = new Date(d1);

console.log(d1 == d2);   // prints false (wrong!) 
console.log(d1 === d2);  // prints false (wrong!)
console.log(d1 != d2);   // prints true  (wrong!)
console.log(d1 !== d2);  // prints true  (wrong!)
console.log(d1.getTime() === d2.getTime()); // prints true (correct)

Я пропоную вам скористатися випадаючими списками чи іншою подібною обмеженою формою введення дати, а не текстовими полями, щоб, можливо, не опинитися у пеклі перевірки введення даних.


64
Навіть метод Ейса не є небезпечним. Спочатку потрібно скинути мілісекунди, і, можливо, ви навіть хочете скинути весь час. date1.setHours (0); date1.setMinutes (0); date1.setSeconds (0); date1.setMilliseconds (0); Це в поєднанні з використанням .getTime () дасть точний результат порівняння
Патрік

102
@patrick, запропонуйте зателефонувати setHours(0,0,0,0)так. Усуває потребу в дзвінках setMinutes()тощо. Також виконується швидше.
Карл

26
уникаючи == або ===, щоб отримати бажаний результат: jsfiddle.net/P4y5J зараз> = іншийЗараз && зараз <= черговий ЗНАЙДА FYI
Jason Sebring

5
Чому б просто не використовувати toString()метод в обидві дати, а потім порівнювати з ==оператором? Здається, набагато простіше, ніж скидання часу та порівняння після цього, чи є недоліки для цього?
користувач2019515

13
Ви також можете порівняти числові значення своїх дат, щоб уникнути порівняння самих об’єктів: date1.valueOf () == date2.valueOf ()
madprog

421

Найпростіший спосіб порівняння дат у javascript - спершу перетворити його в об’єкт Date, а потім порівняти ці об’єкти date.

Нижче ви знайдете об’єкт з трьома функціями:

  • date.compare (a, b)

    Повертає число:

    • -1, якщо a <b
    • 0, якщо a = b
    • 1, якщо a> b
    • NaN, якщо a або b - незаконна дата
  • date.inRange (d, початок, кінець)

    Повертає булева або NaN:

    • вірно, якщо d знаходиться між початком і кінцем (включно)
    • false, якщо d перед початком або після закінчення .
    • NaN, якщо одна чи кілька дат є незаконними.
  • дати.конвертувати

    Інші функції використовуються для перетворення свого вводу в об'єкт дати. Вхід може бути

    • Дата -об'єкт: Вхідний повертається як є.
    • масив : Інтерпретується як [рік, місяць, день]. ПРИМІТКА місяць - 0-11.
    • номер : інтерпретувати як кількість мілісекунд , що пройшли з 1 січня 1970 (відмітка про часу)
    • рядок : Кілька різних форматів підтримується, як "YYYY / MM / DD", "MM / DD / YYYY", "31 січня 2009 року" і т.д.
    • об'єкт : інтерпретовано як об'єкт з рік, місяць і дата атрибутів. ПРИМІТКА місяць - 0-11.

.

// Source: http://stackoverflow.com/questions/497790
var dates = {
    convert:function(d) {
        // Converts the date in d to a date-object. The input can be:
        //   a date object: returned without modification
        //  an array      : Interpreted as [year,month,day]. NOTE: month is 0-11.
        //   a number     : Interpreted as number of milliseconds
        //                  since 1 Jan 1970 (a timestamp) 
        //   a string     : Any format supported by the javascript engine, like
        //                  "YYYY/MM/DD", "MM/DD/YYYY", "Jan 31 2009" etc.
        //  an object     : Interpreted as an object with year, month and date
        //                  attributes.  **NOTE** month is 0-11.
        return (
            d.constructor === Date ? d :
            d.constructor === Array ? new Date(d[0],d[1],d[2]) :
            d.constructor === Number ? new Date(d) :
            d.constructor === String ? new Date(d) :
            typeof d === "object" ? new Date(d.year,d.month,d.date) :
            NaN
        );
    },
    compare:function(a,b) {
        // Compare two dates (could be of any type supported by the convert
        // function above) and returns:
        //  -1 : if a < b
        //   0 : if a = b
        //   1 : if a > b
        // NaN : if a or b is an illegal date
        // NOTE: The code inside isFinite does an assignment (=).
        return (
            isFinite(a=this.convert(a).valueOf()) &&
            isFinite(b=this.convert(b).valueOf()) ?
            (a>b)-(a<b) :
            NaN
        );
    },
    inRange:function(d,start,end) {
        // Checks if date in d is between dates in start and end.
        // Returns a boolean or NaN:
        //    true  : if d is between start and end (inclusive)
        //    false : if d is before start or after end
        //    NaN   : if one or more of the dates is illegal.
        // NOTE: The code inside isFinite does an assignment (=).
       return (
            isFinite(d=this.convert(d).valueOf()) &&
            isFinite(start=this.convert(start).valueOf()) &&
            isFinite(end=this.convert(end).valueOf()) ?
            start <= d && d <= end :
            NaN
        );
    }
}

11
(a > b) - (a < b)корисний для сортування масиву дат
nktssh

@nikita Так, так і функція, яка повертає цей результат, може використовуватися до Array.prototype.sortтих пір, поки всі значення є датними. Якщо можуть бути недійсні дати, рекомендую скористатися чимось на зразокfunction ( a, b ) { a = a === undefined || a === null : NaN : a.valueOf( a ); b = a === undefined || b === null : NaN : a.valueOf( b ); return isFinite( a ) && isFinite( b ) ? ( a > b ) - ( a < b ) : NaN; }
десь

4
@ nktssh — можливо, але return a - bпростіше і замінює весь оператор return.
RobG

284

Порівняйте <і так >само, як зазвичай, але все, що стосується, =має використовувати +префікс. Так:

var x = new Date('2013-05-23');
var y = new Date('2013-05-23');

// less than, greater than is fine:
x < y; => false
x > y; => false
x === y; => false, oops!

// anything involving '=' should use the '+' prefix
// it will then compare the dates' millisecond values
+x <= +y;  => true
+x >= +y;  => true
+x === +y; => true

Сподіваюся, це допомагає!


81
жахливо повільно :) Я вважаю за краще x.getTime() === y.getTime()метод, читабельний і надзвичайно швидкий, дивіться jsperf
huysentruitw

24
+Оператор намагається перетворити вираз в номер. Date.valueOf()використовується для конвертації (яка повертає те саме, що і Date.getTime().
Салман А

13
@WouterHuysentruit Обидва дуже швидкі (> 3 мільйони OPS у найповільнішому браузері). Скористайтеся методом, який, на вашу думку, є більш зрозумілим
висловлюється

13
Зауважте, що все , що стосується '=', повинно використовувати префікс "+" у вашій відповіді, невірно. <, <=, >І >=використовувати той же алгоритм ( абстрактний алгоритм відносного порівняння ) за лаштунками.
Салман А

2
developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… Завдяки вашій відповіді, сервіс, який я розробляю на роботі, мав жахливу помилку, яку важко було відстежити.
Gyuhyeon Lee

157

Реляційні оператори < <= > >=можуть використовуватися для порівняння дат JavaScript:

var d1 = new Date(2013, 0, 1);
var d2 = new Date(2013, 0, 2);
d1 <  d2; // true
d1 <= d2; // true
d1 >  d2; // false
d1 >= d2; // false

Однак операторів рівності == != === !==не можна використовувати для порівняння (значення) дат, оскільки :

  • Два чіткі об'єкти ніколи не дорівнюють ні для суворих, ні для абстрактних порівнянь.
  • Вираз, який порівнює об'єкти, справедливий лише в тому випадку, якщо операнди посилаються на той самий Об'єкт.

Можна порівняти значення дат рівності, використовуючи будь-який із цих методів:

var d1 = new Date(2013, 0, 1);
var d2 = new Date(2013, 0, 1);
/*
 * note: d1 == d2 returns false as described above
 */
d1.getTime() == d2.getTime(); // true
d1.valueOf() == d2.valueOf(); // true
Number(d1)   == Number(d2);   // true
+d1          == +d2;          // true

І те, Date.getTime()і Date.valueOf()повернути кількість мілісекунд з 1 січня 1970 р., 00:00 UTC. Як Numberфункціональний, так і одинаковий +оператор викликають valueOf()методи за кадром.


Чи безпечно конвертувати об'єкт String to Date? Чи може це не кинути виняток або дати ненадійні результати? Що може бути найнадійнішим способом порівняння дат у JS? Якщо ви говорите ненадійні результати, чи може цей метод дати різні / неправильні значення, навіть коли ми впевнені, що формат дати не зміниться -> Це було б "четвер, 10 серпня 2017 року". Ваша допомога тут дуже цінується.
користувач2696258

Чи може це дати ненадійні результати для однієї і тієї ж дати на різних ОС / браузерах / пристроях?
користувач2696258

1
@ User2696258 це найнадійніший спосіб порівняння двох дат об'єктів. Перетворення рядка в дату - це інша проблема ... використовуйте бібліотеку для аналізу дат або прокатуйте власне рішення. Thursday, 10 Aug 2017це нестандартний формат, і різні веб-переглядачі можуть аналізувати його по-різному, або взагалі не розбирати його. Дивіться примітки до Date.parse.
Салман

88

На сьогодні найпростіший метод - відняти одну дату від іншої та порівняти результат.

var oDateOne = new Date();
var oDateTwo = new Date();

alert(oDateOne - oDateTwo === 0);
alert(oDateOne - oDateTwo < 0);
alert(oDateOne - oDateTwo > 0);


68

Порівнювати дати в JavaScript досить просто ... У JavaScript є вбудована система порівняння дат, що дозволяє зробити порівняння таким простим ...

Просто виконайте ці кроки для порівняння значення двох дат, наприклад, у вас є два входи, у кожного з яких є значення дати, Stringі ви їх порівнюєте ...

1. у вас є 2 рядкові значення, які ви отримуєте від введення даних, і ви хочете порівняти їх, вони наведені нижче:

var date1 = '01/12/2018';
var date2 = '12/12/2018';

2. Їх потрібно Date Objectпорівнювати як значення дат, тому просто перетворіть їх на дату, використовуючи new Date(), я просто повторно призначу їх для простоти пояснення, але ви можете робити це все, що завгодно:

date1 = new Date(date1);
date2 = new Date(date2);

3. Тепер просто порівняйте їх, використовуючи> < >= <=

date1 > date2;  //false
date1 < date2;  //true
date1 >= date2; //false
date1 <= date2; //true

порівняти дати в JavaScript


Я виявив, що більшість рішень для порівняння дат працюють у будь-якому браузері. Проблема, яку я зазнав, була з IE. Це рішення працювало в усьому світі. Thx Alireza!
Джошуа Оглсбі

2
Це не працює. І це не повинно працювати. Ви порівнюєте об’єкт дати.
maxisam

3
@maxisam Ні, це робить роботу з операторів порівняння ( <, >, <=, >=) використовується, дата об'єкти перетворюються першим в UNIX епохи ( в секундах), та він працює відмінно. Однак це може призвести до поширеної помилки робити, date1 == date2коли дійсно вводиться помилка як не значення, а перевіряється рівність примірника. Щоб уникнути цього і перевірити рівність значення дати , це буде працювати: date1.valueOf() == date2.valueOf()або коротшеdate1+0 == date2+0
humanityANDpeace

Примітка від MDN Note: Parsing of strings with Date.parse is strongly discouraged due to browser differences and inconsistencies. та Note: Parsing of date strings with the Date constructor (and Date.parse, they are equivalent) is strongly discouraged due to browser differences and inconsistencies.
AaA

35

Порівняйте лише день (ігнорування компонента часу):

Date.prototype.sameDay = function(d) {
  return this.getFullYear() === d.getFullYear()
    && this.getDate() === d.getDate()
    && this.getMonth() === d.getMonth();
}

Використання:

if(date1.sameDay(date2)) {
    // highlight day on calendar or something else clever
}

це добре. але що робити, якщо я порівняю nextDay або previousDay. я спробував цей Date.prototype.nextDay = функція (d) {повернути цей.getFullYear () === d.getFullYear () && this.getDate () <d.getDate () && this.getMonth () === d .getMonth (); } Date.prototype.previousDay = функція (d) {return this.getFullYear () === d.getFullYear () && this.getDate ()> d.getDate () && this.getMonth () === d.getMonth (); }, але він працюватиме лише в цьому місяці. як я порівнюю по місяцях або по роках
Paresh3489227

32

який формат?

Якщо ви створюєте Javascript об'єкт Date , ви можете просто відняти їх, щоб отримати різницю в мілісекундах (відредагувати: або просто порівняти):

js>t1 = new Date()
Thu Jan 29 2009 14:19:28 GMT-0500 (Eastern Standard Time)
js>t2 = new Date()
Thu Jan 29 2009 14:19:31 GMT-0500 (Eastern Standard Time)
js>t2-t1
2672
js>t3 = new Date('2009 Jan 1')
Thu Jan 01 2009 00:00:00 GMT-0500 (Eastern Standard Time)
js>t1-t3
2470768442
js>t1>t3
true

1
Віднімання є хорошою ідеєю, оскільки дозволяє уникнути ==згаданої вище проблеми порівняння.
devios1

Який JavaScript REPL ви використовуєте?
Гайда

JSDB - див. Jsdb.org - Я використовую його рідше в наші дні, коли Python є моєю мовою вибору, але це все ще велика корисна програма.
Jason S

1
@ StuartP.Bentley Я не знаю, тому що я не використовую жодного з них. Я використовую jsdb.
Джейсон S

при перегляді великої кількості дат це здається найбільш ефективним, оскільки не потрібно конвертувати за допомогою getTime ().
pcarvalho

16

ви використовуєте цей код,

var firstValue = "2012-05-12".split('-');
var secondValue = "2014-07-12".split('-');

 var firstDate=new Date();
 firstDate.setFullYear(firstValue[0],(firstValue[1] - 1 ),firstValue[2]);

 var secondDate=new Date();
 secondDate.setFullYear(secondValue[0],(secondValue[1] - 1 ),secondValue[2]);     

  if (firstDate > secondDate)
  {
   alert("First Date  is greater than Second Date");
  }
 else
  {
    alert("Second Date  is greater than First Date");
  }

А також перевірте це посилання http://www.w3schools.com/js/js_obj_date.asp


3
Причина не посилатися на W3Schools: w3fools.com - приємне рішення - хоча це відповідає стандартам і чи працює він у всіх браузерах?
Mathias Lykkegaard Lorenzen

1
Краще зверніться до мережі розробників Mozilla: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… .
Даніель Лідстрем

16

КОРОТКА ВІДПОВІДЬ

Ось функція, яка повертає {boolean}, якщо дія від dateTime> до dateTime Demo

var from = '08/19/2013 00:00'
var to = '08/12/2013 00:00 '

function isFromBiggerThanTo(dtmfrom, dtmto){
   return new Date(dtmfrom).getTime() >=  new Date(dtmto).getTime() ;
}
console.log(isFromBiggerThanTo(from, to)); //true

Пояснення

jsFiddle

var date_one = '2013-07-29 01:50:00',
date_two = '2013-07-29 02:50:00';
//getTime() returns the number of milliseconds since 01.01.1970.
var timeStamp_date_one = new Date(date_one).getTime() ; //1375077000000 
console.log(typeof timeStamp_date_one);//number 
var timeStamp_date_two = new Date(date_two).getTime() ;//1375080600000 
console.log(typeof timeStamp_date_two);//number 

оскільки у вас зараз обидва дати за типом числа, ви можете порівняти їх з будь-якими операціями порівняння

(>, <, =,! =, ==,! ==,> = І <=)

Тоді

якщо ви знайомі зі C#спеціальним форматом дати та часу, ця бібліотека повинна робити саме те саме і допомогти вам відформатувати дату та час dtmFRM, незалежно від того, чи передаєте ви часовий рядок дати чи формат Unix.

Використання

var myDateTime = new dtmFRM();

alert(myDateTime.ToString(1375077000000, "MM/dd/yyyy hh:mm:ss ampm"));
//07/29/2013 01:50:00 AM

alert(myDateTime.ToString(1375077000000,"the year is yyyy and the day is dddd"));
//this year is 2013 and the day is Monday

alert(myDateTime.ToString('1/21/2014', "this month is MMMM and the day is dd"));
//this month is january and the day is 21

DEMO

все, що вам потрібно зробити, - це передавання будь-якого з цих форматів, утиснених у jsфайлі бібліотеки


нова дата (dtmfrom)> = нова дата (dtmto) набагато повільніше, ніж нова дата (dtmfrom) .getTime ()> = нова дата (dtmto) .getTime ()
Міна Габріель

Можливо, але різниця становить приблизно від 30 до 120 наносекунд (скажімо 0,000000075 секунд) на операцію, залежно від браузера, тому не дуже важлива.
RobG

15

Простий спосіб -

var first = '2012-11-21';
var second = '2012-11-03';

if (new Date(first) > new Date(second) {
    .....
}

14

Примітка - порівняйте лише частину дати:

Коли ми порівнюємо дві дати в JavaScript. Це також займає години, хвилини та секунди. Тож якщо нам потрібно лише порівняти дату, це такий підхід:

var date1= new Date("01/01/2014").setHours(0,0,0,0);

var date2= new Date("01/01/2014").setHours(0,0,0,0);

Тепер: if date1.valueOf()> date2.valueOf()буде працювати як шарм.


13
function datesEqual(a, b)
{
   return (!(a>b || b>a))
}

1
Що вони за тип a або b? Дати? Який формат? Здається, це не працює зі мною.
Люці

5
припускаючи aта bбудучи Dateоб’єктами, які ви також можете використовуватиreturn a*1 == b*1;
Udo G

4
@UdoG: Коротше:+a == +b
1313

13
var date = new Date(); // will give you todays date.

// following calls, will let you set new dates.
setDate()   
setFullYear()   
setHours()  
setMilliseconds()   
setMinutes()    
setMonth()  
setSeconds()    
setTime()

var yesterday = new Date();
yesterday.setDate(...date info here);

if(date>yesterday)  // will compare dates

11

Просто, щоб додати ще одну можливість до багатьох існуючих варіантів, ви можете спробувати:

if (date1.valueOf()==date2.valueOf()) .....

... який, здається, працює на мене. Звичайно, ви повинні переконатися, що обидві дати не визначені ...

if ((date1?date1.valueOf():0)==(date2?date2.valueOf():0) .....

Таким чином ми можемо забезпечити позитивне порівняння, якщо обидва також не визначені, або ...

if ((date1?date1.valueOf():0)==(date2?date2.valueOf():-1) .....

... якщо ви віддаєте перевагу, щоб вони не були рівними.


11

Через Moment.js

Jsfiddle: http://jsfiddle.net/guhokemk/1/

function compare(dateTimeA, dateTimeB) {
    var momentA = moment(dateTimeA,"DD/MM/YYYY");
    var momentB = moment(dateTimeB,"DD/MM/YYYY");
    if (momentA > momentB) return 1;
    else if (momentA < momentB) return -1;
    else return 0;
}

alert(compare("11/07/2015", "10/07/2015"));

Метод повертає 1, якщо dateTimeA більший заdateTimeB

Метод повертає 0, якщо dateTimeA дорівнюєdateTimeB

Метод повертає -1, якщо dateTimeAменшеdateTimeB


3
Немає необхідності використовувати зовнішню бібліотеку, таку як Moment для порівняння дат для Dateоб’єктів.
амб

Момент був абсолютно необхідний для мого випадку використання. Дякую, Разан!
razorsyntax

1
чому ви навіть користуєтесь <або >операторами, коли наближається момент із зручними методами порівняння, такими як, .isBeforeі .isAfterце все в документах
svarog

10

ПОДЕРЖАЙТЕ ЧАС

Дата JavaScript не має поняття часового поясу . Це момент у часі (галочки з епохи) із зручними функціями для перекладу до та з рядків у "локальному" часовому поясі. Якщо ви хочете працювати з датами, використовуючи об'єкти дат, як це роблять усі тут, ви хочете, щоб ваші дати представляли UTC опівночі на початку вказаної дати. Це звичайна і необхідна конвенція, яка дозволяє вам працювати з датами незалежно від сезону або часового поясу їх створення. Тож вам потрібно бути дуже пильним, щоб керувати поняттям часового поясу, особливо коли ви створюєте об’єкт дати півночі UTC.

Більшу частину часу ви хочете, щоб ваша дата відображала часовий пояс користувача. Клацніть, якщо сьогодні ваш день народження . Користувачі в NZ та США клацають одночасно та отримують різні дати. У такому випадку зробіть це ...

// create a date (utc midnight) reflecting the value of myDate and the environment's 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()

8

Скажімо, ви отримали об'єкти дати A і B, отримайте їхнє значення часу EPOC, а потім відніміть, щоб отримати різницю в мілісекундах.

var diff = +A - +B;

Це все.


8

Для порівняння двох дат ми можемо використовувати бібліотеку JavaScript date.js, яку можна знайти за посиланням: https://code.google.com/archive/p/datejs/downloads

і використовувати Date.compare( Date date1, Date date2 )метод, і він поверне число, яке означає такий результат:

-1 = дата1 - найменша дата2.

0 = значення рівні.

1 = дата1 більша, ніж дата2.


8

Відніміть дві дати, ви отримаєте різницю в мілісекундах, якщо отримаєте - 0це та сама дата

function areSameDate(d1, d2){
    return d1 - d2 === 0
}

7

Для того, щоб створити дати з вільного тексту в Javascript, вам потрібно проаналізувати його в об’єкт Date ().

Ви можете використовувати Date.parse (), який займає вільний текст, намагається перетворити його в нову дату, але якщо у вас є контроль над сторінкою, я б рекомендував використовувати замість цього вікна вибору HTML або вибір дат, наприклад, контроль календаря YUI або інтерфейс jQuery Вибір дат .

Після того, як у вас є дата, як вказали інші люди, ви можете використовувати просту арифметику, щоб відняти дати та перетворити їх на кількість днів, діливши число (у секундах) на кількість секунд у день (60 * 60 * 24 = 86400).


6
var date_today=new Date();
var formated_date = formatDate(date_today);//Calling formatDate Function

var input_date="2015/04/22 11:12 AM";

var currentDateTime = new Date(Date.parse(formated_date));
var inputDateTime   = new Date(Date.parse(input_date));

if (inputDateTime <= currentDateTime){
    //Do something...
}

function formatDate(date) {
    var hours = date.getHours();
    var minutes = date.getMinutes();
    var ampm = hours >= 12 ? 'PM' : 'AM';

    hours = hours % 12;
    hours = hours ? hours : 12; // the hour '0' should be '12'
    hours   = hours < 10 ? '0'+hours : hours ;

    minutes = minutes < 10 ? '0'+minutes : minutes;

    var strTime = hours+":"+minutes+ ' ' + ampm;
    return  date.getFullYear()+ "/" + ((date.getMonth()+1) < 10 ? "0"+(date.getMonth()+1) :
    (date.getMonth()+1) ) + "/" + (date.getDate() < 10 ? "0"+date.getDate() :
    date.getDate()) + " " + strTime;
}

5

Удосконалена версія коду, розміщена "деякими"

/* Compare the current date against another date.
 *
 * @param b  {Date} the other date
 * @returns   -1 : if this < b
 *             0 : if this === b
 *             1 : if this > b
 *            NaN : if a or b is an illegal date
*/ 
Date.prototype.compare = function(b) {
  if (b.constructor !== Date) {
    throw "invalid_date";
  }

 return (isFinite(this.valueOf()) && isFinite(b.valueOf()) ? 
          (this>b)-(this<b) : NaN 
        );
};

використання:

  var a = new Date(2011, 1-1, 1);
  var b = new Date(2011, 1-1, 1);
  var c = new Date(2011, 1-1, 31);
  var d = new Date(2011, 1-1, 31);

  assertEquals( 0, a.compare(b));
  assertEquals( 0, b.compare(a));
  assertEquals(-1, a.compare(c));
  assertEquals( 1, c.compare(a));

Імовірно є екземпляр дата , на яку викликається метод. У цьому випадку може бути невірна дата, але все ще може бути екземпляром дата?
RobG

5

Якщо наступним є ваш формат дати, ви можете використовувати цей код:

var first = '2012-11-21';
var second = '2012-11-03';
if(parseInt(first.replace(/-/g,""),10) > parseInt(second.replace(/-/g,""),10)){
   //...
}

Він перевірить, чи 20121121більша кількість 20121103чи ні.


4
Якщо вона вже є у форматі ISO8601 (РРРР-ММ-DD), вам не потрібно видаляти жодні символи або перетворювати їх у ціле число. Просто порівняйте рядки first == secondабо first < secondабо first > second. Це одна з багатьох красунь з ISO8601 порівняно з MM / DD / YY, DD / MM / YY, YY / DD / MM, DD / YY / MM або MM / YY / DD.
десь

5

Зазвичай я зберігаю Datesяк timestamps(Number)у базах даних.

Коли мені потрібно порівняти, я просто порівнюю між цими часовими позначками або

конвертуйте його в об'єкт дати та, > <якщо потрібно, порівняйте .

Зауважте, що == або === не працює належним чином, якщо ваші змінні не посилаються на той самий об'єкт дати.

Перетворіть спочатку ці об’єкти дати у мітку часу (число), а потім порівняйте їх рівність.


Дата до мітки

var timestamp_1970 = new Date(0).getTime(); // 1970-01-01 00:00:00
var timestamp = new Date().getTime(); // Current Timestamp

Відмітка до дати

var timestamp = 0; // 1970-01-01 00:00:00
var DateObject = new Date(timestamp);

Це найкраща відповідь - і найшвидший jsperf.com/comparing-date-objects
Скотт

3

Перш ніж порівнювати Datesоб’єкт, спробуйте встановити обидві їх мілісекунди на нуль, як Date.setMilliseconds(0);.

У деяких випадках, коли Dateоб’єкт динамічно створюється в javascript, якщо ви продовжуєте друкувати Date.getTime(), ви побачите зміну мілісекунд, що запобіжить рівність обох дат.


3

Продуктивність

Сьогодні 2020.02.27 я виконую тести вибраних рішень на Chrome v80.0, Safari v13.0.5 та Firefox 73.0.1 на MacOs High Sierra v10.13.6

Висновки

  • рішення d1==d2(D) та d1===d2(E) найшвидші для всіх браузерів
  • розчин getTime(A) швидше, ніж valueOf(B) (обидва є середньо швидкими)
  • рішення F, L, N є найповільнішими для всіх браузерів

введіть тут опис зображення

Деталі

Нижче представлені фрагменти рішень, які використовуються в тестах працездатності. Ви можете виконати тест у своїй машині ТУТ

Результати для хрому

введіть тут опис зображення


Але d1==d2або d1===d2марний у контексті питання.
TheMaster

1
        from_date ='10-07-2012';
        to_date = '05-05-2012';
        var fromdate = from_date.split('-');
        from_date = new Date();
        from_date.setFullYear(fromdate[2],fromdate[1]-1,fromdate[0]);
        var todate = to_date.split('-');
        to_date = new Date();
        to_date.setFullYear(todate[2],todate[1]-1,todate[0]);
        if (from_date > to_date ) 
        {
            alert("Invalid Date Range!\nStart Date cannot be after End Date!")

            return false;
        }

Використовуйте цей код для порівняння дати за допомогою JavaScript.

Дякую Д.Єєву


Я думаю, що це хороша відповідь, оскільки у нас є формат "dd / mm / yy", і ми повинні це зробити, щоб порівняти обидві дати. Я не знаю, чи це найкраща відповідь, але цього достатньо. Дякую за поділ.
danigonlinea

1
var curDate=new Date();
var startDate=document.forms[0].m_strStartDate;

var endDate=document.forms[0].m_strEndDate;
var startDateVal=startDate.value.split('-');
var endDateVal=endDate.value.split('-');
var firstDate=new Date();
firstDate.setFullYear(startDateVal[2], (startDateVal[1] - 1), startDateVal[0]);

var secondDate=new Date();
secondDate.setFullYear(endDateVal[2], (endDateVal[1] - 1), endDateVal[0]);
if(firstDate > curDate) {
    alert("Start date cannot be greater than current date!");
    return false;
}
if (firstDate > secondDate) {
    alert("Start date cannot be greater!");
    return false;
}

1

Ось що я зробив в одному зі своїх проектів,

function CompareDate(tform){
     var startDate = new Date(document.getElementById("START_DATE").value.substring(0,10));
     var endDate = new Date(document.getElementById("END_DATE").value.substring(0,10));

     if(tform.START_DATE.value!=""){
         var estStartDate = tform.START_DATE.value;
         //format for Oracle
         tform.START_DATE.value = estStartDate + " 00:00:00";
     }

     if(tform.END_DATE.value!=""){
         var estEndDate = tform.END_DATE.value;
         //format for Oracle
         tform.END_DATE.value = estEndDate + " 00:00:00";
     }

     if(endDate <= startDate){
         alert("End date cannot be smaller than or equal to Start date, please review you selection.");
         tform.START_DATE.value = document.getElementById("START_DATE").value.substring(0,10);
         tform.END_DATE.value = document.getElementById("END_DATE").value.substring(0,10);
         return false;
     }
}

викликаючи це у формі підписом. сподіваюся, що це допомагає.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.