Thời điểm so sánh ngày js


384

Tôi đang sử dụng Moment.js để định dạng thời gian ngày của mình, ở đây tôi có hai giá trị ngày và tôi muốn đạt được một chức năng cụ thể khi một ngày lớn hơn ngày kia. Tôi đã đọc hầu hết các tài liệu của họ, nhưng không tìm thấy chức năng để đạt được điều này. Tôi biết nó sẽ ở đó.

Đây là mã của tôi:

var date_time = 2013-03-24 + 'T' + 10:15:20:12 + 'Z'
var d = moment(date_time).tz('UTC'); // first date 

var now = new Date(),
    dnow = moment(now).tz('UTC'),
    snow = dnow.minute() % 15,
    diffnow = 15 - snow,
    tonow = moment(dnow).add('minute', diffnow),
    ahead30now = moment(tonow).add('minute', 30);

if (d > ahead30now) {
    // allow input time
    console.log('UTC TIME DB', d.format());
} else {

}

Biên tập

var date_time = req.body.date + 'T' + req.body.time + req.body.timezone; // 2014-03-24T01:15:000
var utc_input_time = moment(date_time).utc(); // 2014-03-24T01:15:000
console.log('utc converted date_time', moment(date_time).utc().format("YYYY-MM-DDTHH:mm:SSS"));
var isafter = moment(utc_input_time).isAfter(moment('2014-03-24T01:14:000')); // true
if(isafter === true){
    console.log('is after true');
} else {
    console.log('is after is false');
}

Ở đây, tôi đang so sánh hai ngày tức là 2014-03-24T01:15:000 > 2014-03-24T01:14:000hy vọng rằng ngày đầu tiên lớn hơn ngày thứ hai, nhưng nó luôn đi đến điều kiện khác. Tôi không biết tại sao?

Câu trả lời:


540

Tôi tin rằng bạn đang tìm kiếm các chức năng truy vấn , isBefore, isSame, và isAfter.

Nhưng thật khó để nói chính xác những gì bạn đang cố gắng. Có lẽ bạn chỉ đang tìm cách để có được sự khác biệt giữa thời gian đầu vào và thời gian hiện tại? Nếu vậy, hãy xem xét các chức năng khác biệt , diff. Ví dụ:

moment().diff(date_time, 'minutes')

Một vài điều khác:

  • Có lỗi trong dòng đầu tiên:

    var date_time = 2013-03-24 + 'T' + 10:15:20:12 + 'Z'

    Điều đó sẽ không đi làm. Tôi nghĩ bạn có nghĩa là:

    var date_time = '2013-03-24' + 'T' + '10:15:20:12' + 'Z';

    Tất nhiên, bạn cũng có thể:

    var date_time = '2013-03-24T10:15:20:12Z';
  • Bạn đang sử dụng: .tz('UTC')không chính xác. .tzthuộc về múi giờ . Bạn không cần sử dụng nó trừ khi bạn làm việc với các múi giờ khác, như America/Los_Angeles.

    Nếu bạn muốn phân tích một giá trị là UTC, thì hãy sử dụng:

    moment.utc(theStringToParse)

    Hoặc, nếu bạn muốn phân tích một giá trị cục bộ và chuyển đổi nó thành UTC, thì hãy sử dụng:

    moment(theStringToParse).utc()

    Hoặc có lẽ bạn không cần nó cả. Chỉ vì giá trị đầu vào là UTC, không có nghĩa là bạn phải làm việc trong UTC trong toàn bộ chức năng của mình.

  • Bạn dường như nhận được ví dụ "bây giờ" moment(new Date()). Thay vào đó bạn chỉ có thể sử dụng moment().

Đã cập nhật

Dựa trên chỉnh sửa của bạn, tôi nghĩ bạn có thể làm điều này:

var date_time = req.body.date + 'T' + req.body.time + 'Z';
var isafter = moment(date_time).isAfter('2014-03-24T01:14:00Z');

Hoặc, nếu bạn muốn đảm bảo rằng các trường của bạn được xác thực theo đúng định dạng:

var m = moment.utc(req.body.date + ' ' + req.body.time, "YYYY-MM-DD  HH:mm:ss");
var isvalid = m.isValid();
var isafter = m.isAfter('2014-03-24T01:14:00Z');

1
Cảm ơn ý kiến ​​có giá trị của bạn. Tôi đã chỉnh sửa mã của mình để đưa vào nhận xét của bạn nhưng không nhận được sự khác biệt chính xác. Bạn có thể vui lòng kiểm tra mã đã chỉnh sửa của tôi không
Dibish

3
Xem câu trả lời cập nhật. Cũng xem số chữ số trong trường giây. Và có req.body.timezonebao giờ bất cứ điều gì khác hơn Z? Nếu vậy thì sao?
Matt Johnson-Pint

Cảm ơn bạn rất nhiều về mã đã chỉnh sửa của bạn, tôi gần như đã đạt đến đó .. Trong trường hợp của tôi, tôi có số múi giờ đó từ phía người dùng, ví dụ date_time = 2014-03-25T23: 10 + 5: 30, khi tôi sử dụng khoảnh khắc (date_time) .utc () đôi khi tôi nhận được Ngày không hợp lệ
Dibish

1
Khi tôi đặt +05: 30 nó hoạt động rất tốt. Một lần nữa cảm ơn bạn rất nhiều vì lòng tốt của bạn
Dibish

.isSame () chính xác là những gì tôi đang tìm kiếm. Bằng cách nào đó đã bỏ lỡ nó trong các tài liệu trước đây.
Sẽ Strohl

231

Bạn sẽ có thể so sánh chúng trực tiếp.

var date = moment("2013-03-24")
var now = moment();

if (now > date) {
   // date is past
} else {
   // date is future
}


87
Tôi cảm thấy đáng để giải thích rằng điều này hoạt động vì javascript ép các đối tượng thành nguyên thủy thông qua Object.prototype.valueOfđó được ghi đè trong nguyên mẫu khoảnh khắc để trả về dấu thời gian epoch như một số. Vì vậy, điều này là tương tự như now.format('x') > date.format('x').
tandrewnichols

không, nó không hoạt động ... đây là những gì tôi đã cố gắng. // newDate cao hơn ngày nay ... vì vậy nó in thất bại trong cả hai điều kiện lớn hơn và lessthen const resDate = res.url.ExiryDate; const newDate = khoảnh khắc (resDate); var now = khoảnh khắc (). định dạng ("DD / MM / YYYY"); if (now <newDate) {console.log ("thành công"); } other {console.log ("fail")}
steve

3
@steve moment().format("DD/MM/YYYY")sẽ trả về một chuỗi và sau đó bạn đang so sánh theo thứ tự bảng chữ cái và sau đó ngày 1 tháng 12 sẽ đến trước ngày 2 tháng 1, vì bạn cũng đang dẫn đầu với nhiều ngày. Đừng sử dụng format()nếu bạn muốn so sánh trực tiếp khoảnh khắc phản đối.
ryanwinchester

28

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 dateTimeA lớn hơn dateTimeB

Phương thức trả về 0 nếu dateTimeA bằng dateTimeB

Phương thức trả về -1 nếu dateTimeA nhỏ hơn dateTimeB


1
chức năng so sánh1 (dateTimeA, dateTimeB) {thời điểm trả về (dateTimeA, 'MM / DD / YYYY'). diff (dateTimeB, 'MM / DD / YYYY'); }
Pháp sư

23

Điều quan trọng là datetime của bạn phải ở định dạng ISO chính xác khi sử dụng bất kỳ truy vấn nào trong giây lát :isBefore , isAfter, isSameOrBefore, isSameOrAfter,isBetween

Vì vậy, thay vì 2014-03-24T01: 14: 000, thời gian của bạn phải là:

2014 / 03-24T01: 14: 00 hoặc 2014 / 03-24T01: 14: 00.000Z

nếu không, bạn có thể nhận được cảnh báo khấu hao sau đây và điều kiện sẽ đánh giá là sai:

Cảnh báo khấu hao: giá trị được cung cấp không ở định dạng RFC2822 hoặc ISO được công nhận. thời điểm xây dựng rơi trở lại js Date (), không đáng tin cậy trên tất cả các trình duyệt và phiên bản. Các định dạng ngày không RFC2822 / ISO không được khuyến khích và sẽ bị xóa trong một bản phát hành chính sắp tới. Vui lòng tham khảo http://momentjs.com/guides/#/warnings/js-date/ để biết thêm thông tin.

// https://momentjs.com/docs/#/query/

const dateIsAfter = moment('2014-03-24T01:15:00.000Z').isAfter(moment('2014-03-24T01:14:00.000Z'));

const dateIsSame = moment('2014-03-24T01:15:00.000Z').isSame(moment('2014-03-24T01:14:00.000Z'));

const dateIsBefore = moment('2014-03-24T01:15:00.000Z').isBefore(moment('2014-03-24T01:14:00.000Z'));

console.log(`Date is After: ${dateIsAfter}`);
console.log(`Date is Same: ${dateIsSame}`);
console.log(`Date is Before: ${dateIsBefore}`);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.0/moment.min.js"
></script>


10

vượt qua từng ngày như thế này nó sẽ so sánh và đưa ra kết quả. nếu bạn không muốn định dạng loại bỏ nó

moment(Date1).format("YYYY-MM-DD") > moment(Date2).format("YYYY-MM-DD")

6
Be carefulkhông gì khác ngoài việc so sánh hai chuỗi
Pranoy Sarkar

@PranoySarkar bạn có thể vui lòng cho tôi biết lý do tại sao chúng ta cần phải cẩn thận hơn?
DEEPESH KUMAR R


2

để so sánh thời gian, bạn có thể sử dụng valueOfchức năng của thời điểm cung cấp mili giây của thời gian ngày, tốt nhất để so sánh:

let date1 = moment('01-02-2020','DD-MM-YYYY').valueOf()
let date2 = moment('11-11-2012','DD-MM-YYYY').valueOf()

//     alert((date1 > date2 ? 'date1' : 'date2') + " is greater..."  )

if (date1 > date2) {
   alert("date1 is greater..." )
} else {
   alert("date2 is greater..." )
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>


1
        var startDate = moment(startDateVal, "DD.MM.YYYY");//Date format
        var endDate = moment(endDateVal, "DD.MM.YYYY");

        var isAfter = moment(startDate).isAfter(endDate);

        if (isAfter) {
            window.showErrorMessage("Error Message");
            $(elements.endDate).focus();
            return false;
        }
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.