Chỉ so sánh phần ngày mà không so sánh thời gian trong JavaScript


397

Có gì sai với mã dưới đây?

Có lẽ sẽ đơn giản hơn nếu chỉ so sánh ngày và không thời gian. Tôi cũng không chắc làm thế nào để làm điều này, và tôi đã tìm kiếm, nhưng tôi không thể tìm thấy vấn đề chính xác của mình.

BTW, khi tôi hiển thị hai ngày trong một cảnh báo, chúng hiển thị giống hệt nhau.

Mã của tôi:

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

Có cách nào đơn giản hơn để so sánh ngày và không bao gồm thời gian không?

Câu trả lời:


781

Tôi vẫn đang học JavaScript và cách duy nhất tôi tìm thấy để so sánh hai ngày mà không có thời gian là sử dụng setHoursphương thức của đối tượng Date và đặt giờ, phút, giây và mili giây về 0. Sau đó so sánh hai ngày.

Ví dụ,

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

date2sẽ được đặt với giờ, phút, giây và mili giây về 0, nhưng date1 sẽ đặt chúng theo thời gian mà date1 được tạo. Để thoát khỏi giờ, phút, giây và mili giây vào ngày 1, hãy làm như sau:

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

Bây giờ bạn có thể so sánh hai ngày là NGÀY mà không phải lo lắng về các yếu tố thời gian.


63
Xin lưu ý rằng kiểm tra bằng cách date1 === date2dường như không cung cấp hành vi nhất quán; tốt hơn là làm date1.valueOf() === b.valueOf()hoặc thậm chí date1.getTime() === date2.getTime(). Lạ thay.
Erwin Wessels

4
Hãy cẩn thận: nếu date1 và date2 vào mùa đông và mùa hè và bạn có kế hoạch lặp lại từ cái này sang cái khác với addDays (1), thì vấn đề là chúng sẽ không có cùng múi giờ vì tiết kiệm ánh sáng ban ngày, vì vậy lần cuối so sánh sẽ cho các ngày bằng nhau sẽ không hoạt động vì hai ngày không thực sự ở 00: 00: 00: 0.
Oliver

9
Tôi biết đây là một câu hỏi cũ, nhưng nó xuất hiện đầu tiên trong google khi tìm kiếm. Hãy cẩn thận với câu trả lời này. Điều này sẽ đưa ra câu trả lời không chính xác nếu người dùng không ở cùng múi giờ với người tạo đối tượng ngày. Ví dụ: thay đổi múi giờ trên hệ điều hành máy tính của bạn thành thời gian Bờ Đông (Hoa Kỳ). Mở bàn điều khiển trình duyệt của bạn và gõ var date2 = new Date(2011,8,20). Bây giờ thay đổi múi giờ của HĐH thành Giờ Thái Bình Dương (Hoa Kỳ). Trong cùng loại bảng điều khiển trình duyệt date2.toDateString()và bạn sẽ quay lại Mon Sep 19 2011thay vì thứ ba ngày 20!
Adam

9
Cũng lưu ý rằng setHours()đặt thời gian dựa trên múi giờ hiện tại, tự động được trình duyệt phát hiện. Thử: t = new Date("2016-02-29T01:45:49.098Z"); t.setHours(0,0,0,0); console.log(t.toJSON());sẽ in "2016-02-28T15:00:00.000Z", ngày 28, nhưng không phải 29 Múi giờ hiện tại của tôi làAsia/Tokyo
transang

8
Câu trả lời này thực sự cần được cập nhật để sử dụng setUTCxxxcác phương thức thay vì các biến thể nhận biết cục bộ / múi giờ.
Stijn de Witt

136

XEM THỜI GIAN

Sử dụng đối tượng ngày để thể hiện ngay một ngày ngay lập tức sẽ đưa bạn vào một vấn đề chính xác vượt quá lớn. Bạn cần quản lý thời gian và múi giờ để tránh xa họ và họ có thể quay lại bất cứ lúc nào. Câu trả lời được chấp nhận cho câu hỏi này rơi vào bẫy.

Một ngày javascript không có khái niệm về múi giờ . Đó là một khoảnh khắc thời gian (tích tắc kể từ thời đại) với các chức năng (tĩnh) tiện dụng để dịch sang và từ các chuỗi, theo mặc định sử dụng múi giờ "cục bộ" của thiết bị hoặc, nếu được chỉ định, UTC hoặc múi giờ khác. Để thể hiện chỉ một ngày ™ với một đối tượng ngày, 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ả khi bạn tạo đối tượng Ngày UTC nửa đêm và khi bạn tuần tự hóa nó.

Rất nhiều người bối rối bởi hành vi mặc định của giao diện điều khiển. Nếu bạn phun một ngày vào bảng điều khiển, đầu ra bạn nhìn thấy sẽ bao gồm múi giờ của bạn. Điều này chỉ là do bảng điều khiển gọi toString()vào ngày của bạn và toString()cung cấp cho bạn sự hồi phục cục bộ. Ngày cơ bản không có múi giờ ! (Miễn là thời gian khớp với thời gian bù, bạn vẫn có một đối tượng ngày UTC nửa đêm)

Giải trừ (hoặc tạo các đối tượng Ngày UTC nửa đêm)

Đây là bước làm tròn, với mẹo có hai câu trả lời "đúng". 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.getUTCFullYear(), myDate.getUTCMonth(), myDate.getUTCDate()));

Hủy bỏ một ngày

Thông thường ngày trên dây sẽ có định dạng YYYY-MM-DD. Để giải trừ chúng, hãy làm điều này ...

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

Nối tiếp

Đã cẩn thận để quản lý múi giờ khi bạn tạo, bây giờ bạn cần chắc chắn giữ hết 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()

Vì vậy, để trả lời câu hỏi của bạn, 7 năm quá muộn ...

<input type="date" onchange="isInPast(event)">
<script>
var isInPast = function(event){
  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>

Thấy nó chạy ...

Cập nhật 2019 ... công cụ miễn phí ...

Với sự phổ biến của câu trả lời này, tôi đã đặt tất cả vào mã. Hàm sau trả về một đối tượng ngày được bao bọc và chỉ hiển thị các chức năng an toàn để sử dụng với chỉ một ngày ™.

Gọi nó với một đối tượng Date và nó sẽ phân giải thành JustADate phản ánh múi giờ của người dùng. Gọi nó bằng một chuỗi: nếu chuỗi là ISO 8601 với múi giờ được chỉ định, chúng ta sẽ làm tròn phần thời gian. Nếu múi giờ không được chỉ định, chúng tôi sẽ chuyển đổi nó thành ngày phản ánh múi giờ địa phương, giống như đối với các đối tượng ngày.

function JustADate(initDate){
  var utcMidnightDateObj = null
  // if no date supplied, use Now.
  if(!initDate)
    initDate = new Date();

  // if initDate specifies a timezone offset, or is already UTC, just keep the date part, reflecting the date _in that timezone_
  if(typeof initDate === "string" && initDate.match(/((\+|-)\d{2}:\d{2}|Z)$/gm)){  
     utcMidnightDateObj = new Date( initDate.substring(0,10) + 'T00:00:00Z');
  } else {
    // if init date is not already a date object, feed it to the date constructor.
    if(!(initDate instanceof Date))
      initDate = new Date(initDate);
      // Vital Step! Strip time part. Create UTC midnight dateObj according to local timezone.
      utcMidnightDateObj = new Date(Date.UTC(initDate.getFullYear(),initDate.getMonth(), initDate.getDate()));
  }

  return {
    toISOString:()=>utcMidnightDateObj.toISOString(),
    getUTCDate:()=>utcMidnightDateObj.getUTCDate(),
    getUTCDay:()=>utcMidnightDateObj.getUTCDay(),
    getUTCFullYear:()=>utcMidnightDateObj.getUTCFullYear(),
    getUTCMonth:()=>utcMidnightDateObj.getUTCMonth(),
    setUTCDate:(arg)=>utcMidnightDateObj.setUTCDate(arg),
    setUTCFullYear:(arg)=>utcMidnightDateObj.setUTCFullYear(arg),
    setUTCMonth:(arg)=>utcMidnightDateObj.setUTCMonth(arg),
    addDays:(days)=>{
      utcMidnightDateObj.setUTCDate(utcMidnightDateObj.getUTCDate + days)
    },
    toString:()=>utcMidnightDateObj.toString(),
    toLocaleDateString:(locale,options)=>{
      options = options || {};
      options.timezone = "UTC";
      locale = locale || "en-EN";
      return utcMidnightDateObj.toLocaleDateString(locale,options)
    }
  }
}


// if initDate already has a timezone, we'll just use the date part directly
console.log(JustADate('1963-11-22T12:30:00-06:00').toLocaleDateString())


3
Câu trả lời của bạn chứa thông tin thực sự có giá trị! Thật không may, bạn đã không thực sự thêm câu trả lời cho câu hỏi thực tế của OP, ngăn tôi nâng cao nó. Hãy thử thêm vào một đoạn mã nhỏ để trả lời câu hỏi của OP.
Stijn de Witt

Ha ha ha @ '7 năm quá muộn'! Tôi thích phong cách của bạn user1585345! Bạn đã nhận được phiếu bầu của tôi!
Stijn de Witt

Tôi thấy điều này là hữu ích. Lưu ý rằng có một lỗi đánh máy trong đoạn "so sánh quốc tế". Tôi nghĩ rằng nó phải là: Ngày mới (Date.UTC (myDate.getUTCFullYear (), myDate.getUTCMonth (), myDate.getUTCDate ()));
RikRak

1
Tôi ước tôi có thể nâng cao câu trả lời này 100 lần !!!
Sнаđошƒаӽ

77

Còn cái này thì sao?

Date.prototype.withoutTime = function () {
    var d = new Date(this);
    d.setHours(0, 0, 0, 0);
    return d;
}

Nó cho phép bạn so sánh phần ngày của ngày như thế này mà không ảnh hưởng đến giá trị của biến của bạn:

var date1 = new Date(2014,1,1);
new Date().withoutTime() > date1.withoutTime(); // true

Đây là câu trả lời thanh lịch nhất cho bài viết gốc. Tôi không tạo ra một chức năng riêng cho mục đích của mình, chỉ bao gồm hai dòng mã.
Danimal Reks

25

Sử dụng Moment.js

Nếu bạn có tùy chọn bao gồm thư viện của bên thứ ba, chắc chắn bạn nên xem qua Moment.js . Nó làm việc với DateDateTimenhiều, dễ dàng hơn nhiều.

Ví dụ: xem nếu một Ngày đến sau Ngày khác nhưng không bao gồm thời gian của họ, bạn sẽ làm một cái gì đó như thế này:

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

Tham số thứ hai bạn vượt qua vào isAfterlà chính xác để làm việc so sánh và có thể là bất kỳ year, month, week, day, hour, minutehoặc second.


4
có tốc độ tăng gấp 100 lần khi chuyển từ giải pháp tạm thời sang giải pháp sethours () + sethours. bạn bè cẩn thận :-)
2c2c

@ 2c2c Thú vị. Chắc chắn tốt để biết tác động hiệu suất. Có bao nhiêu hoạt động bạn đã sử dụng cho điểm chuẩn của bạn?
Joshua Pinter

1
tôi đã ở khoảng 1mil so sánh. đã không thiết lập một điểm chuẩn thực tế
2c2c

17

Chỉ cần so sánh bằng cách sử dụng .toDateString như dưới đây:

new Date().toDateString();

Điều này sẽ trả về cho bạn một phần ngày duy nhất và không phải là thời gian hoặc múi giờ, như thế này:

"Thứ Sáu ngày 03 tháng 2 năm 2017"

Do đó cả hai ngày có thể được so sánh trong định dạng này tương tự mà không có phần thời gian của nó.


2
Đó là một khởi đầu tốt, nhưng nó sẽ không cho phép so sánh vì giờ đây nó là một chuỗi. Để so sánh, thay đổi nó trở lại một đối tượng Date bằng cách thực hiện new Date(new Date().toDateString());
Grid Trekkor 27/2/2017

@GridTrekkor Đúng, nhưng nếu bạn chỉ muốn kiểm tra công bằng nhanh chóng thì đây là giải pháp đơn giản nhất.
CM

8

Đây có thể là một phiên bản sạch hơn một chút, cũng lưu ý rằng bạn nên luôn luôn sử dụng cơ số khi sử dụng parseInt.

window.addEvent('domready', function() {
    // Create a Date object set to midnight on today's 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);
    }
});

Kiểm tra các MDC parseInt trang để biết thêm thông tin về cơ số.

JSLint là một công cụ tuyệt vời để bắt những thứ như một cơ số bị thiếu và nhiều thứ khác có thể gây ra lỗi tối nghĩa và khó gỡ lỗi. Nó buộc bạn phải sử dụng các tiêu chuẩn mã hóa tốt hơn để tránh những cơn đau đầu trong tương lai. Tôi sử dụng nó trên mọi dự án JavaScript mà tôi viết mã.


@EmKay Điều này không phải là vấn đề lớn vì ES5 khá chuẩn trong hầu hết các trình duyệt và nó cấm diễn giải bát phân NHƯNG một số trình duyệt vẫn có thể sử dụng cách hiểu bát phân cũ vì lý do tương thích ngược, vì vậy tôi sẽ tiếp tục sử dụng cơ số cho tới tương lai dự đoán trước được.
Mã vô dụng

Nếu bạn sử dụng các diễn giải bát phân chế độ nghiêm ngặt sẽ gây ra lỗi, đó là một điều tốt vì nó giúp bạn tìm ra các lỗi có thể bị hiểu sai.
Mã vô dụng

4

Các date.js thư viện rất thuận tiện cho những điều này. Nó làm cho tất cả các đoạn mã liên quan đến ngày của JS dễ dàng hơn rất nhiều.


11
Bạn có thể thêm thông tin về cách thư viện này làm cho việc này dễ dàng hơn không?
Mahmoud Hanafy

4

Nếu bạn thực sự so sánh ngày chỉ với thành phần không có thời gian, một giải pháp khác có thể cảm thấy sai nhưng hoạt động và tránh tất cả các vấn đề Date()đau đầu về thời gian và múi giờ là so sánh trực tiếp ngày chuỗi ISO bằng cách sử dụng so sánh chuỗi:

> "2019-04-22" <= "2019-04-23"
true
> "2019-04-22" <= "2019-04-22"
true
> "2019-04-22" <= "2019-04-21"
false
> "2019-04-22" === "2019-04-22"
true

Bạn có thể lấy ngày hiện tại (ngày UTC, không nhất thiết là ngày địa phương của người dùng) bằng cách sử dụng:

> new Date().toISOString().split("T")[0]
"2019-04-22"

Lập luận của tôi ủng hộ nó là sự đơn giản của lập trình viên - bạn sẽ ít gặp phải vấn đề này hơn là cố gắng xử lý dữ liệu và bù đắp chính xác, có thể là do chi phí tốc độ (tôi chưa so sánh hiệu suất)


Bạn cũng có thể làm new Date().toISOString().substr(0, 10) // "2019-04-22".
stomy

Đối với ngày địa phương (ngày không phải UTC), bạn có thể sử dụng new Date().toLocaleDateString() // "8/26/2019". Nhưng sau đó so sánh văn bản sẽ không chính xác (như "8/26/2019" >= "9/29/2001"là sai). Vì vậy, bạn sẽ cần phải chuyển đổi nó new Date(new Date().toLocaleDateString())để so sánh chính xác với Ngày khác.
stomy

4

Chỉ cần sử dụng toDateString () vào cả hai ngày. toDateString không bao gồm thời gian, vì vậy trong 2 lần vào cùng một ngày, các giá trị sẽ bằng nhau, như được minh họa dưới đây.

var d1 = new Date(2019,01,01,1,20)
var d2 = new Date(2019,01,01,2,20)
console.log(d1==d2) // false
console.log(d1.toDateString() == d2.toDateString()) // true

Rõ ràng một số mối quan tâm múi giờ được thể hiện ở nơi khác về câu hỏi này là hợp lệ, nhưng trong nhiều tình huống, những điều đó không liên quan.


1
Trong trường hợp của tôi, giải pháp này tốt hơn nhiều so với câu trả lời được chọn và câu trả lời được bình chọn nhiều hơn. Nó được nói rõ ràng trong tiêu đề "không so sánh thời gian", giải pháp này thực hiện chính xác như vậy, tiết kiệm nhu cầu thiết lập thời gian để thao tác so sánh. Để trả lời "Có phải sự kiện X và sự kiện Y xảy ra trong cùng một ngày không" nên so sánh chỉ ngày, thay vì trả lời "Là 00: 00: 00:00 sáng của ngày sự kiện X giống hệt với 00:00: 00.00 ngày của sự kiện Y? " đó là những gì nhiều người trả lời khác đang làm
Mr.K

3

Đây là cách tôi làm:

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

Tôi hiện đang sử dụng điều này trong sản xuất và tôi không có bất kỳ vấn đề hoặc không tương thích trình duyệt, v.v ... bất kỳ lý do nào khiến bạn nói điều đó getTime()là bắt buộc?
Fabrizio

5
Xin lưu ý rằng setHours()sửa đổi đối tượng mà nó được gọi và trả về ngày dưới dạng một phần nghìn giây (tương đương với việc gọi getTime()). Do đó, todaybiến của bạn không phải là một Dateđối tượng như một số người mong đợi, nhưng thực sự là một số nguyên mili giây. Như một tác dụng phụ, đây là lý do tại sao bạn không cần phải gọi getTime()trước khi so sánh, vì bạn đã có một cách tối nghĩa.
Timothy Walters

3

Vì tôi không thấy cách tiếp cận tương tự ở đây và tôi không thích cài đặt h / m / s / ms thành 0, vì nó có thể gây ra sự cố khi chuyển chính xác sang múi giờ địa phương với dateđối tượng đã thay đổi (tôi đoán vậy), hãy để tôi giới thiệu ở đây, viết vài phút trước, chức năng lil:

+: Dễ sử dụng, thực hiện một thao tác so sánh cơ bản được thực hiện (so sánh ngày, tháng và năm mà không có thời gian.)
-: Có vẻ như điều này hoàn toàn trái ngược với suy nghĩ "ngoài luồng".

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

Sử dụng:

datecompare(date1, '===', date2)để kiểm tra bình đẳng,
datecompare(date1, '>', date2)để kiểm tra lớn hơn,
!datecompare(date1, '>', date2) đối với ít hơn hoặc bằng

Ngoài ra, rõ ràng, bạn có thể chuyển đổi date1date2ở những nơi để đạt được bất kỳ so sánh đơn giản khác.


Một điều tuyệt vời, cộng với, đã giúp tôi thoát ra, bây giờ hy vọng các chuyển đổi iso không cắn, haha, thx.
edencorbin

3

Một cách hiệu quả và chính xác để so sánh ngày là:

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

Nó bỏ qua phần thời gian, nó hoạt động cho các múi giờ khác nhau và bạn cũng có thể so sánh cho sự bình đẳng ==. 86400000 là số mili giây trong một ngày ( = 24*60*60*1000).

Coi chừng rằng toán tử đẳng thức ==nên không bao giờ được sử dụng để so sánh ngày đối tượng vì nó không thành công khi bạn mong chờ một bài kiểm tra bình đẳng với công việc bởi vì nó được so sánh hai đối tượng ngày (và không so sánh hai ngày) ví dụ như:

> 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

Lưu ý: Nếu bạn đang so sánh các đối tượng Ngày có phần thời gian được đặt thành 0, thì bạn có thể sử dụng date1.getTime() == date2.getTime()nhưng hầu như không đáng để tối ưu hóa. Bạn có thể sử dụng <, >, <=, hoặc >=khi so sánh ngày các đối tượng trực tiếp vì các nhà khai thác đầu tiên chuyển đổi các đối tượng ngày bằng cách gọi .valueOf()trước khi các nhà điều hành thực hiện việc so sánh.


2

Sau khi đọc câu hỏi này khá lâu sau khi được đăng, tôi đã quyết định đăng một giải pháp khác, vì tôi không thấy nó khá thỏa đáng, ít nhất là theo nhu cầu của tôi:

Tôi đã sử dụng một cái gì đó như thế này:

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

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

Theo cách đó tôi có thể sử dụng ngày ở định dạng tôi muốn xử lý sau đó. Nhưng điều này chỉ dành cho nhu cầu của tôi, nhưng dù sao tôi cũng đã quyết định đăng nó, có lẽ nó sẽ giúp được ai đó


1
Xin lưu ý rằng currentDatebiến của bạn không phải là một ngày, đó là một số mili giây kể từ 1970-01-01. Các setHours()phương pháp đổi các đối tượng ngày nó được gọi về, và lợi nhuận tương đương với getTime()(giá trị ngày trong mili giây kể từ 1970/01/01).
Timothy Walters

1

Hãy chắc chắn rằng bạn xây dựng userDatevới một năm gồm 4 chữ số setFullYear(10, ...) !== setFullYear(2010, ...).


1

Bạn có thể sử dụng một số số học với tổng số ms.

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

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

Tôi thích điều này bởi vì không có bản cập nhật nào cho ngày ban đầu được thực hiện và nhanh hơn so với phân tách và so sánh chuỗi.

Hy vọng điều này giúp đỡ!


1

JS này sẽ thay đổi nội dung sau ngày đã đặt ở đây, điều tương tự nhưng trên w3schools

date1 = new Date()
date2 = new Date(2019,5,2) //the date you are comparing

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

var stockcnt = document.getElementById('demo').innerHTML;
if (date1 > date2){
document.getElementById('demo').innerHTML="yes"; //change if date is > set date (date2)
}else{
document.getElementById('demo').innerHTML="hello"; //change if date is < set date (date2)
}
<p id="demo">hello</p> <!--What will be changed-->
<!--if you check back in tomorrow, it will say yes instead of hello... or you could change the date... or change > to <-->


1

Điều này làm việc cho tôi:

 export default (chosenDate) => {
  const now = new Date();
  const today = new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate()));
  const splitChosenDate = chosenDate.split('/');

  today.setHours(0, 0, 0, 0);
  const fromDate = today.getTime();
  const toDate = new Date(splitChosenDate[2], splitChosenDate[1] - 1, splitChosenDate[0]).getTime();

  return toDate < fromDate;
};

Trong câu trả lời được chấp nhận, có vấn đề múi giờ và trong thời gian khác không phải là 00:00:00


0

Tôi biết câu hỏi này đã được trả lời và đây có thể không phải là cách tốt nhất, nhưng trong kịch bản của tôi, nó hoạt động hoàn hảo, vì vậy tôi nghĩ nó có thể giúp một người như tôi.

nếu bạn có date stringnhư

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

và bạn chỉ muốn so sánh phần ngày với một đối tượng Ngày khác trong JS,

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

sau đó bạn phải convertstringđể Dateđối tượng bằng cách sử dụngnew Date("2018-01-01T18:19:12.543");

và đây là mẹo: -

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

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

Tôi đã sử dụng toDateString()của Date objectcủa JS, mà trả về chuỗi ngày mà thôi.

Lưu ý: Đừng quên sử dụng .valueOf()chức năng trong khi so sánh ngày.

Thông tin thêm về .valeOf()đây là tài liệu tham khảo

Chúc mừng mã hóa.


0

Điều này sẽ giúp. Tôi quản lý để có được nó như thế này.

var currentDate = new Date(new Date().getFullYear(), new Date().getMonth() , new Date().getDate())

0

So sánh với setHours()sẽ là một giải pháp. Mẫu vật:

var d1 = new Date();
var d2 = new Date("2019-2-23");
if(d1.setHours(0,0,0,0) == d2.setHours(0,0,0,0)){
    console.log(true)
}else{
    console.log(false)
}

0
var fromdate = new Date(MM/DD/YYYY);
var todate = new Date(MM/DD/YYYY);
if (fromdate > todate){
    console.log('False');
}else{
    console.log('True');
}

nếu định dạng ngày của bạn khác nhau thì hãy sử dụng thư viện Moment.js để chuyển đổi định dạng ngày của bạn và sau đó sử dụng mã ở trên để so sánh hai ngày

Thí dụ :

Nếu Ngày của bạn ở dạng "DD / MM / YYYY" và muốn chuyển đổi nó thành "MM / DD / YYYY" thì hãy xem ví dụ mã bên dưới

var newfromdate = new Date(moment(fromdate, "DD/MM/YYYY").format("MM/DD/YYYY"));
console.log(newfromdate);
var newtodate = new Date(moment(todate, "DD/MM/YYYY").format("MM/DD/YYYY"));
console.log(newtodate);

0

Bạn có thể sử dụng fp_incr (0). Cái nào đặt phần múi giờ thành nửa đêm và trả về một đối tượng ngày.

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.