Khoảnh khắc JS - kiểm tra xem một ngày là hôm nay hay trong tương lai


222

Tôi đang cố gắng sử dụng momentjsđể kiểm tra xem một ngày nhất định là hôm nay hay trong tương lai.

Đây là những gì tôi có cho đến nay:

<script type="text/javascript" src="http://momentjs.com/downloads/moment.min.js"></script>
<script type="text/javascript">

var SpecialToDate = '31/01/2014'; // DD/MM/YYYY

var SpecialTo = moment(SpecialToDate, "DD/MM/YYYY");
if (moment().diff(SpecialTo) > 0) {
    alert('date is today or in future');
} else {
    alert('date is in the past');
}

</script>

Mã này đang đánh giá ngày của tôi (ngày 31 tháng 1 năm 2014) là một ngày trong quá khứ.

Bất cứ ý tưởng những gì tôi đang làm sai?

Câu trả lời:


197

Sau khi đọc tài liệu: http://momentjs.com/docs/#/displaying/difference/ , bạn phải xem xét diffchức năng như một toán tử trừ.

                   // today < future (31/01/2014)
today.diff(future) // today - future < 0
future.diff(today) // future - today > 0

Do đó, bạn phải đảo ngược tình trạng của bạn.

Nếu bạn muốn kiểm tra xem tất cả có ổn không, bạn có thể thêm một tham số phụ cho hàm:

moment().diff(SpecialTo, 'days') // -8 (days)

75
điều này sẽ không hoạt động nếu đó là một ngày khác nhưng sự khác biệt là ít hơn 24 giờ
galki

1
Làm việc, bất kể thời gian chênh lệch ít hơn 24 giờ.
zanderwar

3
Không làm việc cho tôi. Nếu ngày là +1 trong thời điểm tương lai (). Diff (SpecialTo, 'days') mang lại cho tôi -0 (số 0 âm)
gavroche

2
Hôm nay không có nghĩa là trong 24 giờ tới. isSame là giải pháp tốt.
Kasper Zi phóngek

1
moment().diff(SpecialToDate)sẽ trực tiếp đưa ra sự khác biệt tính bằng mili giây. 'days'không cần thiết Điều này sẽ làm việc cho tất cả các kịch bản. SpecialToDate có thể là '2018-10-26 00:00:00'một ví dụ.
dấu gạch chéo ngược

312

Bạn có thể sử dụng isSamechức năng:

var iscurrentDate = startTime.isSame(new Date(), "day");
if(iscurrentDate) {

}

Điều này có phù hợp với năm và tháng không?
SuperUberDuper 15/03/2016

13
Nó phải phù hợp với năm và tháng. thời điểm ('2010-01-01'). isSame ('2011-01-01', 'tháng'); // sai, thời điểm năm khác nhau ('2010-01-01'). isSame ('2010 / 02-01', 'day'); // sai, tháng khác
Sói xám

6
Điều này thậm chí không trả lời câu hỏi của OP ... "hôm nay HOẶC TRONG TƯƠNG LAI", và đó là startTimegì? Đối tượng ngày không có isSamephương thức ...
Sharcoux

1
@Sharcoux Câu hỏi này là về khoảnh khắc, vì vậy rõ ràng nó là một đối tượng khoảnh khắc.
Nathan

157
// Returns true if it is today or false if it's not
moment(SpecialToDate).isSame(moment(), 'day');

85

Vì dường như chưa có ai đề cập đến nó, nên cách đơn giản nhất để kiểm tra xem một đối tượng ngày Moment có trong quá khứ không:

momentObj.isBefore()

Hoặc trong tương lai:

momentObj.isAfter()

Chỉ cần để trống các đối số - đó sẽ là mặc định cho đến bây giờ.

Cũng có isSameOrAfterisSameOrBefore.

NB các yếu tố này trong thời gian. Nếu bạn chỉ quan tâm đến ngày, hãy xem câu trả lời của Dipendu .


1
Các tài liệu giải thích rằng đây là hành vi không xác định, vì vậy bạn không nên làm điều này: momentjs.com/docs/#/query/is-before
Dancrumb

13
@Dancrumb Đọc lại lần nữa. "Nếu không có gì được chuyển đến thời điểm # isB Before, nó sẽ mặc định theo thời gian hiện tại." Trong momentObjví dụ của tôi là một ví dụ về một ngày thời điểm. Các tài liệu đang nói cụ thể về việc tạo một thể hiện mới (thời gian hiện tại) và sau đó kiểm tra xem nó có trong quá khứ không, trong một tuyên bố. Tôi không gợi ý bạn làm điều moment().isBefore()đó hoàn toàn vô nghĩa - tại sao bạn sẽ kiểm tra xem bây giờ có phải là quá khứ (hoặc tương lai) không?
mở

83

Bạn có thể sử dụng isAfter()chức năng truy vấn của Momentjs:

Kiểm tra nếu một khoảnh khắc là sau một khoảnh khắc khác.

moment('2010-10-20').isAfter('2010-10-19'); // true

Nếu bạn muốn giới hạn độ chi tiết ở một đơn vị khác ngoài mili giây, hãy chuyển các đơn vị làm tham số thứ hai.

moment('2010-10-20').isAfter('2010-01-01', 'year'); // false

moment('2010-10-20').isAfter('2009-12-31', 'year'); // true

http://momentjs.com/docs/#/query/is-after/


Hàm tạo lấy chuỗi ngày không được dùng nữa.
Vahid Amiri

@VahidAmiri Các tài liệu không đề cập đến điều này. Tuy nhiên, họ đề nghị chúng tôi sử dụng hàm tạo định dạng chuỗi + nếu chúng tôi không sử dụng ISO 8601 . Vì vậy, trừ khi người ta đang sử dụng một số định dạng ngày kỳ lạ, chỉ cần sử dụng một chuỗi.
johndodo

15

đảo ngược isB Before phương pháp thời điểm để kiểm tra xem một ngày giống như ngày hôm nay hoặc trong tương lai như thế này:

!moment(yourDate).isBefore(moment(), "day");

10

Chỉ trong trường hợp người khác cần điều này, chỉ cần làm điều này:

const isToday = moment(0, "HH").diff(date, "days") == 0;

hoặc nếu bạn muốn một chức năng:

isToday = date => moment(0,"HH").diff(date, "days") == 0;

Trong trường hợp ngày là ngày bạn muốn kiểm tra.

Giải trình

moment(0, "HH") trở lại ngày hôm nay lúc nửa đêm.

date1.diff(date2, "days") trả về số ngày giữa ngày1 và ngày2.

Cập nhật

Kể từ đó, tôi đã tìm thấy hàm isSame , trong đó tôi tin là hàm chính xác được sử dụng để tìm ra nếu một ngày là ngày hôm nay:

moment().isSame('2010-02-01', 'day'); // Return true if we are the 2010-02-01

8

Để kiểm tra nếu hôm nay là :

Nếu chúng ta so sánh hai ngày có chứa thông tin thời gian isSamerõ ràng sẽ thất bại. diffsẽ thất bại trong trường hợp hai ngày kéo dài trong ngày mới:

var date1 = moment("01.01.2016 23:59:00", "DD.MM.YYYY HH.mm.ss");
var date2 = moment("02.01.2016 00:01:00", "DD.MM.YYYY HH.mm.ss");
var diff = date2.diff(date1); // 2seconds

Tôi nghĩ rằng cách tốt nhất, ngay cả khi nó không nhanh và ngắn, là như sau:

var isSame = date1.date() == date2.date() && date1.month() == date2.month() && date1.year() == date2.year()

Để kiểm tra xem nó có trong tương lai không :

Theo đề xuất của người dùng khác, diffphương pháp hoạt động.

var isFuture = now.diff(anotherDate) < 0 

7

Nếu bạn chỉ cần biết cái nào lớn hơn, bạn cũng có thể so sánh chúng trực tiếp:

var SpecialToDate = '31/01/2014'; // DD/MM/YYYY

var SpecialTo = moment(SpecialToDate, "DD/MM/YYYY");
if (moment() > SpecialTo) {
    alert('date is today or in future');
} else {
    alert('date is in the past');
}

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


4

nếu FirstDate giống hoặc sau (tương lai) secondDate trả về true khác return return false. Toda là FirstDate = ngày mới ();

  static isFirstDateSameOrAfterSecondDate(firstDate: Date, secondDate: Date): boolean {
    var date1 = moment(firstDate);
    var date2 = moment(secondDate);
    if(date1 && date2){
      return date1.isSameOrBefore(date2,'day');
    }
    return false;
  }

Có isSame, isB Before và isSau cho ví dụ so sánh thời điểm trong ngày;

  static isFirstDateSameSecondDate(firstDate: Date, secondDate: Date): boolean {
    var date1 = moment(firstDate);
    var date2 = moment(secondDate);
    if (date1 && date2) {
      return date1.isSame(date2,'day');
    }
    return false;
  }

  static isFirstDateAfterSecondDate(firstDate: Date, secondDate: Date): boolean {
    var date1 = moment(firstDate);
    var date2 = moment(secondDate);
    if(date1 && date2){
      return date1.isAfter(date2,'day');
    }
    return false;
  }

  static isFirstDateBeforeSecondDate(firstDate: Date, secondDate: Date): boolean {
    var date1 = moment(firstDate);
    var date2 = moment(secondDate);
    if(date1 && date2){
      return date1.isBefore(date2,'day');
    }
    return false;
  }

3

Sử dụng đơn giản nhất để kiểm tra ngày trong tương lai

if(moment().diff(yourDate) >=  0)
     alert ("Past or current date");
else
     alert("It is a future date");

2
function isTodayOrFuture(date){
  date = stripTime(date);
  return date.diff(stripTime(moment.now())) >= 0;
}

function stripTime(date){
  date = moment(date);
  date.hours(0);
  date.minutes(0);
  date.seconds(0);
  date.milliseconds(0);
  return date;
}

Và sau đó chỉ cần sử dụng nó dòng này:

isTodayOrFuture(YOUR_TEST_DATE_HERE)

1

Chọn ngày hôm qua để kiểm tra những ngày qua hoặc không với sự giúp đỡ của moment().subtract(1, "day");

Tham khảo: - http://momentjs.com/docs/#/manipulation/subtract/

function myFunction() {
  var yesterday = moment().subtract(1, "day").format("YYYY-MM-DD");
  var SpecialToDate = document.getElementById("theDate").value;

  if (moment(SpecialToDate, "YYYY-MM-DD", true).isAfter(yesterday)) {
    alert("date is today or in future");
    console.log("date is today or in future");
  } else {
    alert("date is in the past");
    console.log("date is in the past");
  }
}
<script src="http://momentjs.com/downloads/moment.js"></script>
<input type="date" id="theDate" onchange="myFunction()">


1

Nếu chúng tôi muốn khác biệt mà không có thời gian, bạn có thể lấy ngày khác (chỉ ngày không có thời gian) như bên dưới, sử dụng định dạng của khoảnh khắc.

Như, tôi đã phải đối mặt với vấn đề với sự khác biệt trong khi làm;

moment().diff([YOUR DATE])

Vì vậy, đã đưa ra sau đây;

const dateValidate = moment(moment().format('YYYY-MM-DD')).diff(moment([YOUR SELECTED DATE HERE]).format('YYYY-MM-DD'))

IF dateValidate > 0 
   //it's past day
else
   //it's current or future

Xin vui lòng bình luận nếu có bất cứ điều gì để cải thiện.

Cảm ơn,


3
Vui lòng xem lại Làm thế nào để viết một câu trả lời tốt . Các câu trả lời chỉ có mã không được khuyến khích vì chúng không giải thích cách chúng giải quyết vấn đề. Bạn nên cập nhật câu trả lời của mình để giải thích điều này làm gì và nó cải thiện như thế nào trên nhiều câu trả lời mà câu hỏi này đã có .
FluffyKitten

0

tôi muốn nó cho thứ khác nhưng cuối cùng đã tìm thấy một mẹo mà bạn có thể thử

somedate.calendar(compareDate, { sameDay: '[Today]'})=='Today'

var d = moment();
 var today = moment();
 
 console.log("Usign today's date, is Date is Today? ",d.calendar(today, {
    sameDay: '[Today]'})=='Today');
    
 var someRondomDate = moment("2012/07/13","YYYY/MM/DD");
 
 console.log("Usign Some Random Date, is Today ?",someRondomDate.calendar(today, {
    sameDay: '[Today]'})=='Today');
    
  
 var anotherRandomDate =  moment("2012/07/13","YYYY/MM/DD");
 
 console.log("Two Random Date are same date ? ",someRondomDate.calendar(anotherRandomDate, {
    sameDay: '[Today]'})=='Today');
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>


0

kiểm tra như sau:

let isContinue = moment().diff('2020-04-04T20:06:11+05:30')/1000

nó sẽ trở lại sau vài giây ..

Nếu sẽ kiểm tra như điều kiện 2 phút thì

if (isContinue < 120) {
  ..To check otp details or further logic
} else {
   // otp is getting invalid
}

0

Câu trả lời đơn giản nhất sẽ là:

const firstDate = moment('2020/10/14'); // the date to be checked
const secondDate = moment('2020/10/15'); // the date to be checked

firstDate.startOf('day').diff(secondDate.startOf('day'), 'days'); // result = -1
secondDate.startOf('day').diff(firstDate.startOf('day'), 'days'); // result = 1

Nó sẽ kiểm tra với giá trị nửa đêm và sẽ trả về một kết quả chính xác. Nó cũng sẽ hoạt động khi thời gian khác nhau giữa hai ngày cũng ít hơn 24 giờ.

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.