1.5k

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.

|
1.8k

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 dữ liệu 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.

|
  • 1

    Hoạt động cho> <như trạng thái câu hỏi nhưng tôi nghĩ tôi chỉ nhận xét rằng nó không hoạt động nếu == vì bản thân các đối tượng là khác nhau. Ví dụ: var date1 = ngày mới (); var date2 = Ngày mới (date1); date1 == date2 là sai. Nếu bạn làm date1.getTime () == date2.getTime () bạn sẽ thành sự thật.

    – Ngô Minh Nguyệt 16:57:18 05/08/2011
  • 1

    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

    – Hồ Hồng Thúy 02:23:04 13/12/2011
  • 1

    Ace - cảm ơn phản hồi của bạn, bạn vừa tiết kiệm cho tôi một chút thời gian xử lý sự cố. Lưu ý cho những người trong tương lai: date1 === date2 cũng sẽ sai (3 =)

    – Hồ Bảo Anh 21:53:10 20/06/2012
  • 1

    @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.

    – Phạm Quỳnh Như 21:32:02 16/11/2012
  • 1

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

    – Trịnh Thạch Tùng 19:42:08 15/04/2014
387

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
        );
    }
}
|
  • 1

    (a > b) - (a < b)là hữu ích để sắp xếp mảng ngày

    – Ngô Minh Nguyệt 09:26:17 14/05/2015
  • 1

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

    – Hồ Hồng Thúy 10:37:57 14/05/2015
  • 1

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

    – Hồ Bảo Anh 23:05:39 17/08/2016
243

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!

|
134

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 sự bằng nhau 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ả hai Numberhàm và toán tử đơn nguyên +gọi các valueOf()phương thức đằng sau hậu trường.

|
  • 1

    Có an toàn để chuyển đổi đối tượng String thành 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 những 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.

    – Hồ Liễu Oanh 03:33:29 02/08/2017
  • 1

    Đ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?

    – Hoàng Hải Lý 03:34:16 02/08/2017
  • 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.

    – Dương Quang Duy 07:00:12 02/08/2017
70

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

|
51

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 Stringvà 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

|
  • 1

    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!

    – Hồ Liễu Oanh 13:47:48 24/05/2018
  • 1

    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.

    – Hoàng Hải Lý 15:41:58 26/07/2018
  • 1

    @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 date1 == date2khi thực sự có lỗi đượ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

    – Dương Quang Duy 09:16:25 08/12/2018
  • 1

    @humanityANDpeace Tôi thấy. Đó là một khó khăn.

    – Phan Gia Khánh 19:12:55 09/12/2018
32

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

    Đơn giản và dễ đọc. Ngày tốt nhất (chỉ) so sánh tôi đã thấy

    – Lý Hoài Giang 13:29:47 07/07/2016
  • 1

    đ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

    – Bùi Kim Trang 07:07:22 09/08/2016
28

đị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
|
15

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

|
14

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 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 dtmFRM ngày và giờ của 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

|
13
function datesEqual(a, b)
{
   return (!(a>b || b>a))
}
|
12
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

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.

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

|
10

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

|

Câu trả lời của bạn (> 20 ký tự)

Bằng cách click "Đăng trả lời", bạn đồng ý với Điều khoản dịch vụ, Chính sách bảo mật and Chính sách cookie của chúng tôi.

Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ hoặc hỏi câu hỏi của bạn.