Moment.js: วันที่ระหว่างวันที่


118

ฉันพยายามตรวจจับด้วย Moment.js หากวันที่ระบุอยู่ระหว่างวันที่สองวัน ตั้งแต่เวอร์ชัน 2.0.0 Tim ได้เพิ่มisBefore()และisAfter()สำหรับการเปรียบเทียบวันที่

เนื่องจากไม่มีisBetween()วิธีการใดฉันจึงคิดว่าจะได้ผล:

var date = moment("15/02/2013", "DD/MM/YYYY");
var startDate = moment("12/01/2013", "DD/MM/YYYY");
var endDate = moment("15/01/2013", "DD/MM/YYYY");

if (date.isBefore(endDate) && date.isAfter(startDate) || (date.isSame(startDate) || date.isSame(endDate)) ) { alert("Yay!"); } else { alert("Nay! :("); }

ฉันเชื่อว่าต้องมีวิธีที่ดีกว่านี้ ความคิดใด ๆ ?


ฉันมั่นใจว่าคุณต้องการ? isBetween || isStart || isEnd
Bergi

ใช่พิมพ์ผิดขออภัย!
Joel A. Villarreal Bertoldi

คำตอบ:


81

คุณสามารถใช้หนึ่งในปลั๊กอินช่วงเวลา -> ช่วงเวลาเพื่อจัดการกับช่วงวันที่:

var startDate = new Date(2013, 1, 12)
  , endDate   = new Date(2013, 1, 15)
  , date  = new Date(2013, 2, 15)
  , range = moment().range(startDate, endDate);

range.contains(date); // false

1
คุณรวมปลั๊กอินได้อย่างไร?

2
คุณควรใส่ <script src = "/ javascripts / moment-range.js"> </script> หลังจากนั้นสักครู่ js
Lukasz Koziara

54
date.isBetween (startDate, endDate); ง่ายกว่ามากและหลีกเลี่ยงการต้องใช้ปลั๊กอินเพิ่มเติม
Brendan Nee

ช่วงเวลาและช่วงเวลาให้ตัวเลือกในการจัดรูปแบบเวลาวันที่ในขณะที่เตรียมช่วงจากนั้นเปรียบเทียบวันที่สำหรับประกอบด้วย / ภายใน / ทับซ้อน / ตัดกัน / เพิ่ม / ลบ หากมีการเรียกข้อมูลวันที่ในรูปแบบพิเศษบางอย่างก็สามารถจัดเตรียมช่วงวันที่ภายในอาร์เรย์ได้โดยการแปลงวันที่เหล่านั้นด้วยรูปแบบที่ต้องการจากนั้นเราสามารถเปรียบเทียบได้
Sajjad Ali Khan

278

ในเวอร์ชัน 2.9+มีisBetweenฟังก์ชั่น แต่เป็นเอกสิทธิ์เฉพาะ:

var compareDate = moment("15/02/2013", "DD/MM/YYYY");
var startDate   = moment("12/01/2013", "DD/MM/YYYY");
var endDate     = moment("15/01/2013", "DD/MM/YYYY");

// omitting the optional third parameter, 'units'
compareDate.isBetween(startDate, endDate); //false in this case

มีวิธีแก้ปัญหารวม ...
x.isBetween(a, b) || x.isSame(a) || x.isSame(b)

... ซึ่งมีเหตุผลเทียบเท่ากับ
!(x.isBefore(a) || x.isAfter(b))


ในรุ่น 2.13ฟังก์ชั่นที่มีพารามิเตอร์ตัวที่สี่isBetweeninclusivity

ใช้แบบนี้:

target.isBetween(start, finish, 'days', '()') // default exclusive
target.isBetween(start, finish, 'days', '(]') // right inclusive
target.isBetween(start, finish, 'days', '[)') // left inclusive
target.isBetween(start, finish, 'days', '[]') // all inclusive

หน่วยเพิ่มเติมที่ต้องพิจารณา: years, months, days, hours, minutes, seconds, milliseconds

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

เยี่ยมชมเอกสารอย่างเป็นทางการ


4
โปรดทราบว่าตามที่ระบุไว้ในเอกสาร isBetween เป็นเอกสิทธิ์เฉพาะ
Joaquín L. Robles

x.isBetween(moment(a).subtract(1, 'day'), b)ดูเหมือนจะทำเคล็ดลับเช่นกัน
James Donnelly

@ThisClark นั่นเป็นวิธีแก้ปัญหาที่ดี ฉันขอแนะนำอีกอันที่มีการเรียกใช้ฟังก์ชันน้อยลง:!(x.isBefore(a) || x.isAfter(b))
tavnab

อะไรexclusiveหมายถึง?
Batman

2
@ แบทแมนพิจารณารายชื่อ 1,2,3,4,5 เฉพาะ 1 และ 5 ไม่อยู่ระหว่างค่าของรายการนี้ โดยรวมแล้ว 1 และ 5 อยู่ระหว่างค่าของรายการนี้ การรวมด้านซ้าย (เช่นเดียวกับสิทธิพิเศษเฉพาะด้านขวา) ประกอบด้วย 1 แต่ไม่ใช่ 5 การรวมด้านขวา (เช่นเดียวกับด้านซ้ายพิเศษ) รวม 5 แต่ไม่ใช่ 1
ThisClark

27

คุณสามารถใช้ได้

moment().isSameOrBefore(Moment|String|Number|Date|Array);
moment().isSameOrAfter(Moment|String|Number|Date|Array);

หรือ

moment().isBetween(moment-like, moment-like);

ดูที่นี่: http://momentjs.com/docs/#/query/


2
หมายเหตุด่วน: isBetweenต้องการช่วงเวลา 2.13.0 momentjs.com/docs/#/query/is-between
Alex Johnson

16

ฉันเชื่ออย่างนั้น

if (startDate <= date && date <= endDate) {
  alert("Yay");
} else {
  alert("Nay! :("); 
}

ได้ผลด้วย ...


การคำนวณนี้จะไม่สนใจปีเสมอ ตัวอย่างเช่นถ้าฉันให้ startDate = '05 -01-2019 ', endDate = '05 -31-2019' และวันที่เป็น '05 -21-2017 'มันจะให้ผลลัพธ์เป็น "Yay" แม้ว่าจะเป็นเท็จ .
Aakash Maurya

1
@AakashMaurya คุณกำลังเปรียบเทียบสตริงไม่ใช่วันที่ ตรวจสอบให้แน่ใจว่าคุณได้กำหนด startDate / endDate เป็น startDate = new Date ("05-01-2019")
Tiele Declercq

13

ข่าวดีทุกคนมีisBetweenฟังก์ชั่น! อัปเดตห้องสมุดของคุณ;)

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


2
จริง แต่isBetweenไม่รวม
Epoc

4
เวอร์ชัน 2.13.0 แนะนำความพิเศษ A [หมายถึงการรวมค่า A (หมายถึงการยกเว้นหากใช้พารามิเตอร์การรวมจะต้องส่งผ่านตัวบ่งชี้ทั้งสองmoment('2016-10-30').isBetween('2016-10-30', '2016-10-30', null, '[]'); //true
Ramratan Gupta

8

โปรดใช้พารามิเตอร์ที่ 4 ของฟังก์ชัน moment.isBetween (inclusivity) ตัวอย่าง:

var startDate = moment("15/02/2013", "DD/MM/YYYY");
var endDate = moment("20/02/2013", "DD/MM/YYYY");

var testDate = moment("15/02/2013", "DD/MM/YYYY");

testDate.isBetween(startDate, endDate, 'days', true); // will return true
testDate.isBetween(startDate, endDate, 'days', false); // will return false

5
if (date.isBefore(endDate) 
 && date.isAfter(startDate) 
 || (date.isSame(startDate) || date.isSame(endDate))

มีเหตุผลเหมือนกับ

if (!(date.isBefore(startDate) || date.isAfter(endDate)))

ซึ่งช่วยให้คุณประหยัดรหัสสองสามบรรทัดและ (ในบางกรณี) การเรียกใช้เมธอด

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


1

ตามเอกสารของช่วงเวลา js

มีปลั๊กอิน Precise Range ซึ่งเขียนโดย Rob Dawson สามารถใช้เพื่อแสดงการแสดงช่วงวันที่ / เวลาที่แน่นอนที่มนุษย์สามารถอ่านได้ url: http://codebox.org.uk/pages/moment-date-range-plugin

moment("2014-01-01 12:00:00").preciseDiff("2015-03-04 16:05:06");
// 1 year 2 months 3 days 4 hours 5 minutes 6 seconds

moment.preciseDiff("2014-01-01 12:00:00", "2014-04-20 12:00:00");
// 3 months 19 days
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.