So sánh hai ngày với JavaScript


1951

Ai đó có thể đề xuất một cách để so sánh các giá trị của hai ngày lớn hơn, nhỏ hơn và không trong quá khứ bằng cách sử dụng JavaScript không? Các giá trị sẽ đến từ các hộp văn bản.


17
Khi nói đến DateTime và thao tác trong JS, tôi không tìm kiếm gì ngoài khoảnh khắc :)
Halceyon

47
không cần sử dụng khoảnh khắc để so sánh 2 ngày. Chỉ cần sử dụng đối tượng Date của javascript thuần túy. Kiểm tra câu trả lời chính để biết thêm chi tiết.
Lukas Liesis

Bạn có thể tham khảo câu trả lời sau: stackoverflow.com/questions/4812152/ kiểm tra getDateDifference và getDifferenceInDays nếu nó có thể giúp đỡ.
Vikash Rajpurohit

Tôi sẽ cho bạn một lý do để nhìn xa hơn Moment.js ( mà tôi yêu thích, NHƯNG ... ): Đừng sử dụng để tải vòng lặp
Cổ phiếu Geek

Để biết chức năng hữu ích để phân biệt thời gian thành các đơn vị (giây, phút, giờ, v.v.), hãy xem câu trả lời tại stackoverflow.com/questions/1968167/ . Câu trả lời đó hiện cũng có sẵn tại stackoverflow.com/a/46529159/3787376 .
Edward

Câu trả lời:


2284

Các đối tượng Date sẽ làm những gì bạn muốn - xây dựng một cho mỗi ngày, sau đó so sánh chúng bằng cách sử dụng >, <, <=hoặc>= .

Các ==, !=, ===, và !==các nhà khai thác yêu cầu bạn phải sử dụng date.getTime()như trong

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

để rõ ràng chỉ cần kiểm tra sự bình đẳng trực tiếp với các đối tượng ngày sẽ không hoạt động

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)

Tuy nhiên, tôi khuyên bạn nên sử dụng trình đơn thả xuống hoặc một số hình thức nhập ngày bị ràng buộc tương tự thay vì hộp văn bản, vì sợ rằng bạn sẽ thấy mình trong địa ngục xác thực đầu vào.


64
Ngay cả phương pháp của Ace cũng không an toàn. Bạn cần đặt lại mili giây trước và thậm chí bạn có thể muốn đặt lại toàn bộ thời gian. date1.setHours (0); date1.setMinutes (0); date1.setSeconds (0); date1.setMilliseconds (0); Điều đó kết hợp với việc sử dụng .getTime () sẽ cho bạn kết quả so sánh chính xác
patrick

102
@patrick, đề nghị gọi setHours(0,0,0,0)theo cách này. Loại bỏ sự cần thiết phải gọi setMinutes()vv Ngoài ra, thực hiện nhanh hơn.
Karl

26
tránh == hoặc === để có kết quả mong muốn: jsfiddle.net/P4y5J ngay bây giờ> = otherNow && now <= otherNow IS true FYI
Jason Sebring

5
Tại sao không chỉ đơn giản là sử dụng toString()phương thức trên cả hai ngày và sau đó so sánh với ==toán tử? Có vẻ dễ dàng hơn nhiều so với việc đặt lại thời gian và so sánh sau đó, có bất kỳ nhược điểm nào cho việc này không?
dùng2019515

13
Bạn cũng có thể so sánh các giá trị số của ngày của mình để tránh tự so sánh các đối tượng: date1.valueOf () == date2.valueOf ()
madprog

421

Cách dễ nhất để so sánh ngày trong javascript là trước tiên chuyển đổi nó thành đối tượng Ngày và sau đó so sánh các đối tượng ngày này.

Dưới đây bạn tìm thấy một đối tượng có ba chức năng:

  • date.compare (a, b)

    Trả về một số:

    • -1 nếu a <b
    • 0 nếu a = b
    • 1 nếu a> b
    • NaN nếu a hoặc b là một ngày bất hợp pháp
  • date.inRange (d, bắt đầu, kết thúc)

    Trả về boolean hoặc NaN:

    • đúng nếu d nằm giữa điểm bắt đầukết thúc (bao gồm)
    • sai nếu d là trước khi bắt đầu hoặc sau khi kết thúc .
    • NaN nếu một hoặc nhiều ngày là bất hợp pháp.
  • ngày.convert

    Được sử dụng bởi các chức năng khác để chuyển đổi đầu vào của chúng thành một đối tượng ngày. Đầu vào có thể là

    • một ngày -object: Đầu vào được trả về như là.
    • một mảng : Giải thích là [năm, tháng, ngày]. LƯU Ý tháng là 0-11.
    • một số : Được hiểu là số mili giây kể từ ngày 1 tháng 1 năm 1970 (dấu thời gian)
    • một chuỗi : Một số định dạng khác nhau được hỗ trợ, như "YYYY / MM / DD", "MM / DD / YYYY", "31 tháng 1 năm 2009", v.v.
    • một đối tượng : Giải thích như một đối tượng với các thuộc tính năm, tháng và ngày. LƯU Ý tháng là 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)là hữu ích để sắp xếp mảng ngày
nktssh

@nikita Đúng vậy, và một hàm trả về kết quả đó có thể được sử dụng Array.prototype.sortmiễn là tất cả các giá trị là ngày hợp lệ. Nếu có thể có những ngày không hợp lệ, tôi khuyên bạn nên sử dụng một cái gì đó như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; }
một số

4
@ nktssh Có thể, nhưng return a - bđơn giản hơn và thay thế toàn bộ câu lệnh return.
RobG

284

So sánh <>chỉ như bình thường, nhưng bất cứ điều gì liên quan =nên sử dụng +tiền tố. Thích như vậy:

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

Hi vọng điêu nay co ich!


81
cực kỳ chậm :) Tôi thích x.getTime() === y.getTime()phương pháp này, cả hai đều có thể đọc và cực kỳ nhanh chóng xem jsperf
huysentbeanw

24
Các +nhà điều hành cố gắng để chuyển đổi biểu thức thành một số. Date.valueOf()được sử dụng cho việc chuyển đổi (trả về tương tự như Date.getTime().
Salman A

13
@WouterHuysentbean Cả hai đều rất nhanh (> 3 triệu OPS trong trình duyệt chậm nhất). Sử dụng phương pháp mà bạn nghĩ là dễ đọc hơn
Eloims 17/12/14

13
Lưu ý rằng mọi thứ liên quan đến '=' nên sử dụng phần tiền tố '+' trong câu trả lời của bạn là không chính xác. <, <=, >>=sử dụng các thuật toán tương tự ( trừu tượng quan hệ thuật toán so sánh ) đằng sau hậu trường.
Salman A

2
developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/, Nhờ câu trả lời của bạn, dịch vụ tôi phát triển tại nơi làm việc có một lỗi khủng khiếp khó theo dõi.
Gyuhyeon Lee

157

Các toán tử quan hệ < <= > >=có thể được sử dụng để so sánh ngày 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

Tuy nhiên, các toán tử đẳng thức == != === !==không thể được sử dụng để so sánh (giá trị của) ngày :

  • Hai đối tượng riêng biệt không bao giờ bằng nhau cho các so sánh nghiêm ngặt hoặc trừu tượng.
  • Một biểu thức so sánh các Đối tượng chỉ đúng nếu các toán hạng tham chiếu cùng một Đối tượng.

Bạn có thể so sánh giá trị của ngày cho đẳng thức bằng bất kỳ phương pháp nào sau đây:

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

Cả hai Date.getTime()Date.valueOf()trả về số mili giây kể từ ngày 1 tháng 1 năm 1970, 00:00 UTC. Cả Numberhàm và toán tử đơn nguyên +gọi các valueOf()phương thức phía sau hậu trường.


Có an toàn để chuyển đổi đối tượng String sang Date không? Điều đó có thể không ném ngoại lệ hoặc cho kết quả không đáng tin cậy? Điều gì có thể là cách đáng tin cậy nhất để thực hiện các ngày vui vẻ trong JS? Khi bạn nói kết quả không đáng tin cậy, phương pháp này có thể đưa ra các giá trị khác nhau / sai ngay cả khi chúng tôi chắc chắn định dạng ngày sẽ không thay đổi -> Đó sẽ là "Thứ năm, ngày 10 tháng 8 năm 2017". Sự giúp đỡ của bạn ở đây là rất nhiều đánh giá cao.
dùng2696258

Điều này có thể cho kết quả không đáng tin cậy cho cùng một giá trị ngày trên các hệ điều hành / trình duyệt / thiết bị khác nhau không?
dùng2696258

1
@ user2696258 đây là cách đáng tin cậy nhất để so sánh hai đối tượng Date . Chuyển đổi một chuỗi thành ngày là một vấn đề khác ... sử dụng thư viện phân tích ngày hoặc cuộn giải pháp của riêng bạn. Thursday, 10 Aug 2017là định dạng không chuẩn và các trình duyệt khác nhau có thể phân tích cú pháp khác nhau hoặc không phân tích cú pháp nào cả. Xem ghi chú trên Date.parse.
Salman A

88

Cho đến nay, phương pháp đơn giản nhất là trừ đi một ngày khác và so sánh kết quả.

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

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


68

So sánh số ngày trong JavaScript là khá dễ dàng ... Javascript đã được xây dựng trong hệ thống so sánh cho ngày mà làm cho nó dễ dàng như vậy để làm việc so sánh ...

Chỉ cần làm theo các bước sau để so sánh giá trị 2 ngày, ví dụ: bạn có 2 đầu vào, mỗi đầu vào có giá trị Ngày trong String và bạn so sánh chúng ...

1. bạn có 2 giá trị chuỗi bạn nhận được từ một đầu vào và bạn muốn so sánh chúng, chúng như dưới đây:

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

2. Chúng cần Date Objectđược so sánh như các giá trị ngày, vì vậy chỉ cần chuyển đổi chúng thành ngày, bằng cách sử dụng new Date(), tôi chỉ cần gán lại chúng để đơn giản giải thích, nhưng bạn có thể làm điều đó theo cách bạn muốn:

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

3. Bây giờ chỉ cần so sánh chúng, sử dụng> < >= <=

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

so sánh ngày trong javascript


Tôi thấy rằng hầu hết các giải pháp để so sánh ngày làm việc trong bất kỳ trình duyệt nào. Vấn đề tôi gặp phải là với IE. Giải pháp này đã làm việc trên bảng. Thx Alireza!
Joshua Oglesbee

2
Nó không hoạt động. Và nó không nên hoạt động. Bạn đang so sánh đối tượng ngày.
maxisam

3
@maxisam Không, nó không làm việc vì toán tử so sánh ( <, >, <=, >=) đang được sử dụng, các đối tượng ngày được chuyển đổi đầu tiên unix thời đại (giây), và nó hoạt động tốt. Tuy nhiên, điều này có thể dẫn đến sai lầm phổ biến khi thực hiện date1 == date2một lỗi thực sự được đưa ra không phải là giá trị mà là sự bình đẳng thể hiện được kiểm tra. Để ngăn chặn điều này và kiểm tra sự bằng nhau của giá trị ngày, điều này sẽ hoạt động: date1.valueOf() == date2.valueOf()hoặc ngắn hơndate1+0 == date2+0
nhân

Lưu ý từ 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

Chỉ so sánh ngày (bỏ qua thành phần thời gian):

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

Sử dụng:

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

điều này là tốt Nhưng nếu tôi so sánh nextDay hoặc trướcDay. tôi đã thử Date.prototype.nextDay = function (d) {return this.getFullYear () === d.getFullYear () && this.getDate () <d.getDate () && this.getMonth () === d .getMonth (); } Date.prototype.preinglyDay = function (d) {return this.getFullYear () === d.getFullYear () && this.getDate ()> d.getDate () && this.getMonth () === d.getMonth (); } nhưng nó sẽ chỉ hoạt động trong tháng này. Làm thế nào để tôi so sánh qua các tháng hoặc qua các năm
Paresh3361227

32

định dạng gì

Nếu bạn xây dựng một đối tượng Ngày Javascript , bạn chỉ có thể trừ chúng để có chênh lệch mili giây (chỉnh sửa: hoặc chỉ so sánh chúng):

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
Trừ đi là một ý tưởng tốt vì nó tránh được ==vấn đề so sánh được đề cập ở trên.
devios1

Bạn đang sử dụng JavaScript REPL nào?
hyde

JSDB - xem jsdb.org - Tôi sử dụng nó ít thường xuyên hơn hiện nay vì Python là ngôn ngữ tôi chọn, nhưng nó vẫn là một tiện ích tuyệt vời.
Jason S

1
@ StuartP.Bentley Tôi không biết, vì tôi không sử dụng bất kỳ ai trong số họ. Tôi sử dụng jsdb.
Jason S

khi trải qua một số lượng lớn ngày, điều này có vẻ hiệu quả nhất vì không cần phải chuyển đổi với getTime ().
pcarvalho

16

bạn sử dụng mã này,

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");
  }

Và cũng kiểm tra liên kết này http://www.w3schools.com/js/js_obj_date.asp


3
Một lý do để không tham khảo W3Schools: w3fools.com - mặc dù giải pháp tốt - nó có tuân thủ tiêu chuẩn và nó có hoạt động trong tất cả các trình duyệt không?
Mathias Lykkegaard Lorenzen

1
Tham khảo tốt hơn về Mạng của Nhà phát triển Mozilla: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/ .
Daniel Lidström

16

CÂU TRẢ LỜI NGẮN

Đây là một hàm trả về {boolean} nếu hoạt động từ dateTime> đến 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

Giải trình

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 

vì hiện tại bạn có cả datetime theo kiểu số, bạn có thể so sánh chúng với bất kỳ hoạt động so sánh nào

(>, <, = ,! =, == ,! ==,> = VÀ <=)

Sau đó

nếu bạn quen thuộc với C#Chuỗi định dạng ngày và giờ tùy chỉnh, thư viện này sẽ thực hiện chính xác điều đó và giúp bạn định dạng ngày và giờ dtmFRM của bạn bạn cho dù bạn đang chuyển qua chuỗi thời gian ngày hoặc định dạng unix

Sử dụng

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

BẢN GIỚI THIỆU

tất cả những gì bạn phải làm là chuyển bất kỳ định dạng nào được định dạng trong jstệp thư viện


Ngày mới (dtmfrom)> = Ngày mới (dtmto) chậm hơn nhiều so với Ngày mới (dtmfrom) .getTime ()> = Ngày mới (dtmto) .getTime ()
Mina Gabriel

Có lẽ, nhưng sự khác biệt là khoảng 30 đến 120 nano giây (giả sử 0,000000075 giây) cho mỗi thao tác, tùy thuộc vào trình duyệt, do đó không thực sự đáng kể.
RobG

16

Cách đơn giản là,

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

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

14

Lưu ý - Chỉ so sánh Phần ngày:

Khi chúng ta so sánh hai ngày trong javascript. Phải mất hàng giờ, phút và giây cũng được xem xét .. Vì vậy, nếu chúng ta chỉ cần so sánh ngày, đây là cách tiếp cận:

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

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

Bây giờ: if date1.valueOf()> date2.valueOf()sẽ làm việc như một lá bùa.


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

1
Họ là loại a hoặc b là gì? Ngày? Định dạng nào? Điều này dường như không làm việc với tôi.
Luci

5
giả sử abDateđối tượng bạn cũng có thể sử dụngreturn a*1 == b*1;
Udo G

4
@UdoG: Ngắn hơn:+a == +b
mpen

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

Chỉ cần thêm một khả năng khác vào nhiều tùy chọn hiện có, bạn có thể thử:

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

... có vẻ như làm việc cho tôi. Tất nhiên bạn phải đảm bảo rằng cả hai ngày không được xác định ...

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

Bằng cách này, chúng tôi có thể đảm bảo rằng một so sánh tích cực được thực hiện nếu cả hai cũng không được xác định hoặc ...

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

... Nếu bạn thích chúng không bằng nhau.


11

Qua 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"));

Phương thức trả về 1 nếu dateTimeAlớn hơndateTimeB

Phương thức trả về 0 nếu dateTimeAbằngdateTimeB

Phương thức trả về -1 nếu dateTimeAnhỏ hơndateTimeB


3
Không cần sử dụng thư viện bên ngoài như Khoảnh khắc để thực hiện so sánh ngày cho Datecác đối tượng.
AMB

Khoảnh khắc hoàn toàn cần thiết cho trường hợp sử dụng của tôi. Cảm ơn, Razan!
razorsyntax

1
tại sao bạn thậm chí sử dụng <hoặc >vận hành khi thời điểm đã đi kèm với các phương pháp so sánh tiện dụng như .isBefore, và .isAftertất cả đều có trong tài liệu
svarog 30/12/18

10

XEM THỜI GIAN

Một ngày javascript không có khái niệm về múi giờ . Đó là một khoảnh khắc trong thời gian (tích tắc kể từ thời đại) với các chức năng tiện dụng để dịch sang và từ các chuỗi trong múi giờ "cục bộ". Nếu bạn muốn làm việc với ngày bằng cách sử dụng các đối tượng ngày, như mọi người ở đây đang làm, bạn muốn ngày của bạn đại diện cho nửa đêm UTC vào đầu ngày được đề cập. Đây là một quy ước phổ biến và cần thiết cho phép bạn làm việc với các ngày bất kể mùa hoặc múi giờ sáng tạo của họ. Vì vậy, bạn cần hết sức cảnh giác để quản lý khái niệm múi giờ, đặc biệt khi bạn tạo đối tượng Ngày UTC nửa đêm của mình.

Hầu hết thời gian, bạn sẽ muốn ngày của bạn phản ánh múi giờ của người dùng. Nhấp vào nếu hôm nay là sinh nhật của bạn . Người dùng ở New Zealand và Mỹ nhấp vào cùng một lúc và nhận được các ngày khác nhau. Trong trường hợp đó, hãy làm điều này ...

// 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()));

Đôi khi, so sánh quốc tế hơn hẳn độ chính xác địa phương. Trong trường hợp đó, hãy làm điều này ...

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

Bây giờ bạn có thể so sánh trực tiếp các đối tượng ngày của bạn như các câu trả lời khác gợi ý.

Đã cẩn thận để quản lý múi giờ khi bạn tạo, bạn cũng cần chắc chắn loại bỏ múi giờ khi bạn chuyển đổi trở lại thành một chuỗi đại diện. Vì vậy, bạn có thể sử dụng một cách an toàn ...

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

Và hoàn toàn tránh mọi thứ khác, đặc biệt là ...

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

8

Giả sử bạn có các đối tượng ngày A và B, nhận giá trị thời gian EPOC của chúng, sau đó trừ đi để có sự khác biệt tính bằng mili giây.

var diff = +A - +B;

Đó là tất cả.


8

Để so sánh hai ngày, chúng tôi có thể sử dụng thư viện JavaScript date.js có thể tìm thấy tại: https://code.google.com.vn/archive/p/datejs/doads

và sử dụng Date.compare( Date date1, Date date2 )phương thức và nó trả về một số có nghĩa là kết quả sau:

-1 = date1 là ngày lessthan2.

0 = giá trị bằng nhau.

1 = date1 là ngày lớn hơn2.


8

Trừ hai ngày lấy chênh lệch tính bằng mili giây, nếu bạn nhận được 0cùng một ngày

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

7

Để tạo ngày từ văn bản miễn phí trong Javascript, bạn cần phân tích cú pháp thành đối tượng Date ().

Bạn có thể sử dụng Date.parse () để lấy văn bản miễn phí cố gắng chuyển đổi nó thành một ngày mới nhưng nếu bạn có quyền kiểm soát trang, tôi sẽ khuyên bạn nên sử dụng các hộp chọn HTML thay thế hoặc một công cụ chọn ngày như điều khiển lịch YUI hoặc UI UI Hẹn hò .

Khi bạn có một ngày như những người khác đã chỉ ra, bạn có thể sử dụng số học đơn giản để trừ ngày và chuyển đổi lại thành một số ngày bằng cách chia số (tính bằng giây) cho số giây trong một ngày (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

Một phiên bản cải tiến của mã được đăng bởi "một số"

/* 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 
        );
};

sử dụng:

  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));

Có lẽ a là phiên bản Date mà phương thức được gọi. Trong trường hợp này có thể một là một ngày không hợp lệ, nhưng vẫn có một trường hợp ngày?
RobG

5

Nếu sau đây là định dạng ngày của bạn, bạn có thể sử dụng mã này:

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

Nó sẽ kiểm tra xem 20121121số có lớn hơn 20121103hay không.


4
Nếu nó đã ở định dạng ISO8601 (YYYY-MM-DD), bạn không cần phải xóa bất kỳ ký tự nào hoặc chuyển đổi nó thành một số nguyên. Chỉ cần so sánh chuỗi first == secondhay first < secondhay first > second. Đó là một trong nhiều người đẹp có ISO8601 so với MM / DD / YY, DD / MM / YY, YY / DD / MM, DD / YY / MM hoặc MM / YY / DD.
một số

5

Tôi thường lưu trữ Datesnhư timestamps(Number)trong cơ sở dữ liệu.

Khi tôi cần so sánh, tôi chỉ cần so sánh giữa các dấu thời gian đó hoặc

chuyển đổi nó thành Date Object và sau đó so sánh với > <nếu cần thiết.

Lưu ý rằng == hoặc === không hoạt động chính xác trừ khi các biến của bạn là tham chiếu của cùng một Đối tượng Ngày.

Chuyển đổi các đối tượng Date đó thành dấu thời gian (số) trước rồi so sánh sự bằng nhau của chúng.


Ngày đến Dấu thời gian

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

Dấu thời gian đến ngày

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

Đây là câu trả lời tốt nhất - và jsperf.com/compared-date-objects
Scott Stensland

3

Trước khi so sánh Datesđối tượng, hãy thử đặt cả hai mili giây của chúng thành 0 like Date.setMilliseconds(0);.

Trong một số trường hợp Dateđối tượng được tạo động trong javascript, nếu bạn tiếp tục in Date.getTime(), bạn sẽ thấy một phần nghìn giây thay đổi, điều này sẽ ngăn sự bình đẳng của cả hai ngày.


3

Hiệu suất

Hôm nay 2020.02.27 Tôi thực hiện kiểm tra các giải pháp được chọn trên Chrome v80.0, Safari v13.0.5 và Firefox 73.0.1 trên MacOs High Sierra v10.13.6

Kết luận

  • giải pháp d1==d2(D) và d1===d2(E) là nhanh nhất cho tất cả các trình duyệt
  • giải pháp getTime(A) nhanh hơn valueOf(B) (cả hai đều nhanh trung bình)
  • giải pháp F, L, N là chậm nhất cho tất cả các trình duyệt

nhập mô tả hình ảnh ở đây

Chi tiết

Trong các giải pháp đoạn dưới đây được sử dụng trong các bài kiểm tra hiệu suất được trình bày. Bạn có thể thực hiện kiểm tra trong máy của bạn TẠI ĐÂY

Kết quả cho chrome

nhập mô tả hình ảnh ở đây


Nhưng d1==d2hoặc d1===d2là vô dụng trong bối cảnh của câu hỏi.
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;
        }

Sử dụng mã này để so sánh ngày sử dụng javascript.

Cảm ơn D.Jeeva


Tôi nghĩ rằng đây là một câu trả lời tốt vì chúng tôi có định dạng "dd / mm / yy" và chúng tôi phải làm điều đó để so sánh cả hai ngày. Tôi không biết nếu đó là câu trả lời tốt nhất nhưng nó là đủ. Cảm ơn bạn đã chia sẻ.
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

Đây là những gì tôi đã làm trong một trong những dự án của tôi,

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;
     }
}

gọi điều này trên mẫu onsubmit. hi vọng điêu nay co ich.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.