Moment JS - ตรวจสอบว่าวันนี้เป็นวันนี้หรือในอนาคต


222

ฉันพยายามที่จะใช้momentjsเพื่อตรวจสอบว่าวันที่กำหนดเป็นวันนี้หรือในอนาคต

นี่คือสิ่งที่ฉันมี:

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

รหัสกำลังประเมินวันที่ของฉัน (31 มกราคม 2014) เป็นวันที่ในอดีต

มีความคิดอะไรที่ฉันกำลังทำผิดหรือเปล่า?

คำตอบ:


197

หลังจากอ่านเอกสาร: http://momentjs.com/docs/#/displaying/difference/คุณจะต้องพิจารณาdiffฟังก์ชั่นเช่นตัวดำเนินการลบ

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

ดังนั้นคุณต้องย้อนกลับเงื่อนไขของคุณ

หากคุณต้องการตรวจสอบว่าทุกอย่างเรียบร้อยคุณสามารถเพิ่มพารามิเตอร์พิเศษลงในฟังก์ชัน:

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

75
สิ่งนี้จะไม่ทำงานถ้ามันเป็นวันที่แตกต่างกัน แต่ความแตกต่างน้อยกว่า 24 ชั่วโมง
galki

1
ทำงานโดยไม่คำนึงว่าเวลาต่างกันน้อยกว่า 24 ชั่วโมงหรือไม่
zanderwar

3
ไม่ทำงานสำหรับฉัน หากวันเป็น +1 ในช่วงเวลาในอนาคต () diff (พิเศษถึง 'วัน') ให้ฉัน -0 (ศูนย์ติดลบ)
gavroche

2
วันนี้ไม่ได้หมายความว่าใน 24 ชั่วโมงข้างหน้า isSame เป็นทางออกที่ดี
Kasper Ziemianek

1
moment().diff(SpecialToDate)จะให้ผลต่างโดยตรงเป็นมิลลิวินาที 'days'ไม่จำเป็น สิ่งนี้จะใช้ได้กับทุกสถานการณ์ SpecialToDate สามารถ'2018-10-26 00:00:00'เป็นตัวอย่างได้
backslashN

312

คุณสามารถใช้isSameฟังก์ชั่น:

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

}

จับคู่ปีและเดือนนี้ด้วยหรือไม่
SuperUberDuper

13
ต้องตรงกับปีและเดือน ช่วงเวลา ('2010-01-01'). isSame ('2011-01-01', 'เดือน'); // false ช่วงเวลาของปีที่แตกต่างกัน ('2010-01-01'). isSame ('2010-02-01', 'วัน'); // false, เดือนอื่น
Grey Wolf

6
สิ่งนี้ไม่แม้แต่จะตอบคำถามของ OP ... "วันนี้หรือในอนาคต" และอะไรคือstartTimeอะไร วัตถุวันที่ไม่ได้มีisSameวิธีการ ...
Sharcoux

1
@Sharcoux คำถามนี้เกี่ยวกับ momentjs ดังนั้นชัดเจนว่าเป็นช่วงเวลาที่วัตถุ
นาธาน


85

เนื่องจากยังไม่มีใครพูดถึงมันวิธีที่ง่ายที่สุดในการตรวจสอบว่าวัตถุวันที่ช่วงเวลาเป็นอดีตหรือไม่:

momentObj.isBefore()

หรือในอนาคต:

momentObj.isAfter()

เพียงปล่อยให้ args blank - ซึ่งจะเป็นค่าเริ่มต้นในขณะนี้

นอกจากนี้ยังมีและisSameOrAfterisSameOrBefore

NB ปัจจัยนี้ในเวลา หากคุณสนใจเฉพาะเกี่ยวกับวันให้ดูคำตอบของ Dipendu


1
เอกสารอธิบายว่านี่เป็นพฤติกรรมที่ไม่ได้กำหนดดังนั้นคุณไม่ควรทำสิ่งนี้: momentjs.com/docs/#/query/is-before
Dancrumb

13
@Dancrumb อ่านอีกครั้ง "ถ้าไม่มีอะไรถูกส่งไปยังช่วงเวลา # isBefore มันจะเริ่มต้นเป็นเวลาปัจจุบัน" momentObjในตัวอย่างของฉันเป็นตัวอย่างของวันสักครู่ เอกสารกำลังพูดถึงการสร้างอินสแตนซ์ใหม่ (เวลาปัจจุบัน) โดยเฉพาะจากนั้นตรวจสอบว่ามันเคยเป็นอดีตในหนึ่งคำสั่ง ฉันไม่แนะนำให้คุณทำสิ่งใดmoment().isBefore()ที่ไม่มีจุดหมายอย่างที่สุด - ทำไมคุณถึงตรวจสอบว่าตอนนี้เป็นอดีต (หรือในอนาคต) หรือไม่?
mpen

83

คุณสามารถใช้isAfter()ฟังก์ชันการค้นหาของ momentjs:

ตรวจสอบว่าช่วงเวลาหลังจากช่วงเวลาอื่น

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

หากคุณต้องการ จำกัด ความละเอียดเป็นหน่วยอื่นที่ไม่ใช่มิลลิวินาทีให้ส่งหน่วยเป็นพารามิเตอร์ที่สอง

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/


ตัวสร้างที่ใช้สตริงวันที่ถูกคัดค้าน
Vahid Amiri

@VahidAmiri เอกสารไม่พูดถึงเรื่องนี้ แต่พวกเขาไม่แนะนำให้เราใช้รูปแบบของสตริง +คอนสตรัคถ้าเราไม่ได้ใช้มาตรฐาน ISO 8601 ดังนั้นหากไม่มีใครใช้รูปแบบวันที่แปลก ๆ มันก็โอเคที่จะใช้เพียงแค่สตริง
johndodo

15

invert isBefore ใช้เวลาในการตรวจสอบว่าวันเหมือนในวันนี้หรือในอนาคตเช่นนี้:

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

10

ในกรณีที่คนอื่นต้องการสิ่งนี้ให้ทำสิ่งนี้:

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

หรือถ้าคุณต้องการฟังก์ชั่น:

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

โดยที่ dateคือวันที่คุณต้องการตรวจสอบ

คำอธิบาย

moment(0, "HH") ส่งคืนวันนี้เวลาเที่ยงคืน

date1.diff(date2, "days") ส่งคืนจำนวนวันระหว่าง date1 ถึง date2

ปรับปรุง

ฉันได้พบฟังก์ชั่นisSameซึ่งในฉันเชื่อว่าเป็นฟังก์ชั่นที่ถูกต้องที่จะใช้สำหรับการหาว่าวันที่วันนี้:

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

8

วิธีตรวจสอบว่าเป็นวันนี้หรือไม่ :

หากเราเปรียบเทียบสองวันที่มีข้อมูลเวลาisSameก็จะล้มเหลวอย่างเห็นได้ชัด diffจะล้มเหลวในกรณีที่วันที่สองช่วงครอบคลุมวันใหม่:

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

ฉันคิดว่าวิธีที่ดีที่สุดแม้ว่าจะไม่เร็วและสั้น แต่ก็เป็นดังต่อไปนี้:

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

หากต้องการตรวจสอบว่าเป็นอนาคตหรือไม่ :

ตามที่แนะนำโดยผู้ใช้รายอื่นdiffวิธีการทำงาน

var isFuture = now.diff(anotherDate) < 0 

7

หากคุณต้องการรู้ว่าอันไหนที่ใหญ่กว่าคุณสามารถเปรียบเทียบได้โดยตรง:

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

หวังว่านี่จะช่วยได้!


4

ถ้า firstDate เหมือนกันหรือหลังจาก (ในอนาคต) secondDate return trueมิฉะนั้น return false Toda คือ firstDate = new Date ();

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

มี isSame, isBefore และ isAfter สำหรับวันเปรียบเทียบช่วงเวลาตัวอย่าง;

  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

ใช้อันที่ง่ายที่สุดเพื่อตรวจสอบวันที่ในอนาคต

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

จากนั้นใช้บรรทัดนี้:

isTodayOrFuture(YOUR_TEST_DATE_HERE)

1

เลือกเมื่อวานนี้เพื่อตรวจสอบวันที่ผ่านมาหรือไม่ด้วยความช่วยเหลือ moment().subtract(1, "day");

การอ้างอิง: - http://momentjs.com/docs/#/manipulating/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

หากเราต้องการความแตกต่างโดยไม่มีเวลาคุณจะได้รับวันที่แตกต่างกัน (เฉพาะวันที่ไม่มีเวลา) เช่นด้านล่างโดยใช้รูปแบบของช่วงเวลา

ในขณะที่ฉันกำลังเผชิญปัญหากับความแตกต่างขณะทำ

moment().diff([YOUR DATE])

ดังนั้นขึ้นมาด้วยดังต่อไปนี้

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

โปรดแสดงความคิดเห็นหากมีอะไรที่ต้องปรับปรุง

ขอบคุณ


3
โปรดตรวจสอบวิธีการเขียนคำตอบที่ดี คำตอบที่เป็นรหัสเท่านั้นจะหมดกำลังใจเพราะพวกเขาไม่ได้อธิบายวิธีที่พวกเขาแก้ไขปัญหา คุณควรปรับปรุงคำตอบของคุณที่จะอธิบายสิ่งนี้ไม่และวิธีที่จะช่วยเพิ่มคำตอบหลายคำถามนี้มีอยู่แล้ว
FluffyKitten

0

ฉันต้องการมันเพื่อสิ่งอื่น แต่ในที่สุดก็พบเคล็ดลับที่คุณสามารถลองได้

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

ตรวจสอบกับต่อไปนี้:

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

มันจะกลับมาในไม่กี่วินาที ..

ถ้าจะตรวจสอบสภาพ 2 นาทีแล้ว

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

0

คำตอบที่ง่ายที่สุดคือ:

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

มันจะตรวจสอบกับค่าเที่ยงคืนและจะส่งกลับผลลัพธ์ที่ถูกต้อง มันจะทำงานด้วยเมื่อเวลาต่างกันระหว่างสองวันน้อยกว่า 24 ชั่วโมงด้วย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.