การเปรียบเทียบเวลาวันที่ของช่วงเวลา js


384

ฉันใช้ moment.js เพื่อจัดรูปแบบเวลาวันที่ของฉันที่นี่ฉันมีสองค่าวันที่และฉันต้องการบรรลุฟังก์ชั่นเฉพาะเมื่อวันหนึ่งมากกว่าวันอื่น ฉันอ่านเอกสารส่วนใหญ่ของพวกเขาแล้ว แต่ไม่พบฟังก์ชันที่จะทำให้บรรลุผล ฉันรู้ว่ามันจะมี

นี่คือรหัสของฉัน:

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 {

}

แก้ไข

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

ที่นี่ฉันกำลังเปรียบเทียบสองวันคือ2014-03-24T01:15:000 > 2014-03-24T01:14:000คาดว่าวันแรกจะดีกว่าวันที่สอง แต่มันจะไปที่เงื่อนไขอื่นเสมอ ฉันไม่รู้ว่าทำไม

คำตอบ:


540

ผมเชื่อว่าคุณกำลังมองหาฟังก์ชั่นการสอบถาม , isBefore, และisSameisAfter

แต่มันก็ยากที่จะบอกว่าคุณกำลังพยายามอะไรอยู่ บางทีคุณแค่ต้องการรับความแตกต่างระหว่างเวลาอินพุทและเวลาปัจจุบัน? ถ้าเป็นเช่นนั้นให้พิจารณาฟังก์ชั่นความแตกต่าง , diff. ตัวอย่างเช่น:

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

สิ่งอื่น ๆ :

  • มีข้อผิดพลาดในบรรทัดแรก:

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

    นั่นจะไม่ทำงาน ฉันคิดว่าคุณหมายถึง:

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

    แน่นอนคุณอาจจะ:

    var date_time = '2013-03-24T10:15:20:12Z';
  • คุณใช้: .tz('UTC')ไม่ถูกต้อง .tzเป็นช่วงเวลาที่-เขตเวลา คุณไม่จำเป็นต้องใช้ว่าถ้าคุณกำลังทำงานกับโซนเวลาอื่น ๆ America/Los_Angelesเช่น

    หากคุณต้องการแยกค่าเป็น UTC ให้ใช้:

    moment.utc(theStringToParse)

    หรือถ้าคุณต้องการแยกค่าโลคัลและแปลงเป็น UTC ให้ใช้:

    moment(theStringToParse).utc()

    หรือบางทีคุณอาจไม่ต้องการมันเลย เพียงเพราะค่าอินพุตอยู่ใน UTC ไม่ได้หมายความว่าคุณต้องทำงานใน UTC ตลอดการทำงานของคุณ

  • คุณดูเหมือนจะได้รับ "ตอนนี้" moment(new Date())อินสแตนซ์โดย moment()คุณสามารถแทนเพียงแค่ใช้

Updated

จากการแก้ไขของคุณฉันคิดว่าคุณสามารถทำได้:

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

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

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
ขอบคุณสำหรับความคิดเห็นที่มีค่าของคุณ ฉันได้แก้ไขรหัสเพื่อรวมความคิดเห็นของคุณ แต่ไม่ได้รับความแตกต่างอย่างถูกต้อง คุณช่วยตรวจสอบรหัสที่แก้ไขได้ของฉันได้
ไหม

3
ดูคำตอบที่อัปเดต ดูจำนวนหลักในฟิลด์วินาทีด้วย และจะreq.body.timezoneมีอะไรอื่นนอกเหนือจากนี้อีกZหรือ ถ้าเป็นเช่นนั้นอะไร
Matt Johnson-Pint

ขอบคุณมากสำหรับโค้ดที่แก้ไขของคุณฉันเกือบจะถึงแล้ว .. ในกรณีของฉันฉันมีหมายเลขโซนเวลาจากด้านผู้ใช้เช่น date_time = 2014-03-25T23: 10 + 5: 30 เมื่อฉันใช้ช่วงเวลา (date_time) .utc () บางครั้งที่ฉันได้รับวันที่ไม่ถูกต้อง
Dibish

1
เมื่อฉันใส่ +05: 30 มันใช้งานได้ดี ขอบคุณอีกครั้งสำหรับความมีน้ำใจของคุณอีกครั้ง
Dibish

.isSame () เป็นสิ่งที่ฉันกำลังมองหา อย่างใดพลาดมันในเอกสารก่อน
Will Strohl

231

คุณควรจะสามารถเปรียบเทียบพวกเขาโดยตรง

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

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


87
ฉันรู้สึกว่ามันคุ้มค่าที่จะอธิบายว่ามันใช้งานได้เพราะจาวาสคริปต์ทำการรวมวัตถุเข้ากับสิ่งดั้งเดิมผ่านObject.prototype.valueOfสิ่งที่ถูกแทนที่ในต้นแบบช่วงเวลาเพื่อคืนค่าการประทับเวลาของยุคเป็นตัวเลข now.format('x') > date.format('x')ดังนั้นนี้จะคล้ายกับ
tandrewnichols

ไม่มันไม่ทำงาน ... นี่คือสิ่งที่ฉันพยายาม // newDate สูงกว่าตอนนี้เป็นวันที่ ... ดังนั้นมันจะพิมพ์ล้มเหลวทั้งในเงื่อนไขที่มากขึ้นและน้อยลง const resDate = res.url.expiryDate; const newDate = สักครู่ (resDate); var now = moment (). format ("DD / MM / YYYY"); if (ตอนนี้ <newDate) {console.log ("สำเร็จ"); } else {console.log ("fail")}
steve

3
@steve moment().format("DD/MM/YYYY")จะส่งคืนสตริงแล้วคุณจะเปรียบเทียบตามลำดับตัวอักษรและวันที่ 1 ธันวาคมจะมาก่อน 2 มกราคมเนื่องจากคุณเป็นผู้นำด้วยเช่นกัน อย่าใช้format()ถ้าคุณต้องการที่จะเปรียบเทียบช่วงเวลาที่ objcts โดยตรง
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"));

วิธีการส่งกลับ 1 ถ้า dateTimeA มากกว่า dateTimeB

วิธีการคืน 0 ถ้า dateTimeA เท่ากับ dateTimeB

วิธีการคืน -1 ถ้า dateTimeA น้อยกว่า dateTimeB


1
ฟังก์ชั่นเปรียบเทียบ 1 (dateTimeA, dateTimeB) {ช่วงเวลาที่คืน (dateTimeA, 'MM / DD / YYYY') diff (dateTimeB, 'MM / DD / YYYY') }
Shamseer

23

มันเป็นสิ่งสำคัญที่วันที่และเวลาของคุณอยู่ในที่ถูกต้องISO รูปแบบเมื่อใช้ใด ๆ ของคำสั่ง momentjs : isBefore, isAfter, isSameOrBefore, isSameOrAfter,isBetween

ดังนั้นแทนที่จะ 2014-03-24T01: 14: 000, วันที่และเวลาของคุณควรเป็น:

2014-03-24T01: 14: 00หรือ2014-03-24T01: 14: 00.000Z

มิฉะนั้นคุณอาจได้รับคำเตือนการเลิกใช้งานต่อไปนี้และเงื่อนไขจะประเมินเป็นเท็จ:

คำเตือนการเลิกใช้: ค่าที่ให้ไม่ได้อยู่ในรูปแบบ RFC2822 หรือ ISO ที่รู้จัก การสร้างช่วงเวลาตกไปถึง js Date () ซึ่งไม่น่าเชื่อถือในทุกเบราว์เซอร์และทุกเวอร์ชั่น รูปแบบวันที่ที่ไม่ใช่ RFC2822 / ISO จะหมดกำลังใจและจะถูกลบออกในรุ่นใหญ่ที่กำลังจะมาถึง โปรดดู http://momentjs.com/guides/#/warnings/js-date/สำหรับข้อมูลเพิ่มเติม

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

ผ่านวันที่ไปยังช่วงเวลาเช่นนี้มันจะทำการเปรียบเทียบและให้ผลลัพธ์ ถ้าคุณไม่ต้องการรูปแบบลบมัน

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

6
Be carefulนี่คือไม่มีอะไรนอกจากการเปรียบเทียบสองสาย
Pranoy Sarkar

@PanoySarkar คุณช่วยบอกฉันหน่อยได้ไหมว่าทำไมเราถึงต้องระวังให้มากขึ้น?
ลึก KUMAR R


2

สำหรับการเปรียบเทียบวันที่และเวลาคุณสามารถใช้valueOfฟังก์ชันของช่วงเวลาที่ให้มิลลิวินาทีของวันที่ซึ่งดีที่สุดสำหรับการเปรียบเทียบ:

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