การเปรียบเทียบส่วนวันที่เท่านั้นโดยไม่มีการเปรียบเทียบเวลาใน JavaScript


397

เกิดอะไรขึ้นกับรหัสด้านล่าง

อาจเป็นการง่ายกว่าที่จะเปรียบเทียบวันที่และเวลา ฉันไม่แน่ใจว่าจะทำสิ่งนี้ได้อย่างไรและฉันค้นหา แต่ฉันไม่พบปัญหาที่แน่นอน

BTW เมื่อฉันแสดงวันที่ทั้งสองในการแจ้งเตือนพวกเขาจะแสดงเหมือนกันทุกประการ

รหัสของฉัน:

window.addEvent('domready', function() {
    var now = new Date();
    var input = $('datum').getValue();
    var dateArray = input.split('/');
    var userMonth = parseInt(dateArray[1])-1;
    var userDate = new Date();
    userDate.setFullYear(dateArray[2], userMonth, dateArray[0], now.getHours(), now.getMinutes(), now.getSeconds(), now.getMilliseconds());

    if (userDate > now)
    {
        alert(now + '\n' + userDate);
    }
});

มีวิธีที่ง่ายกว่าในการเปรียบเทียบวันที่และไม่รวมเวลาหรือไม่

คำตอบ:


781

ฉันยังคงเรียนรู้ JavaScript และวิธีเดียวที่ฉันพบว่าสิ่งที่ใช้ได้ผลในการเปรียบเทียบสองวันที่ไม่มีเวลาคือการใช้setHoursวิธีการของวัตถุ Date และตั้งค่าชั่วโมงนาทีวินาทีและมิลลิวินาทีเป็นศูนย์ จากนั้นเปรียบเทียบทั้งสองวัน

ตัวอย่างเช่น,

date1 = new Date()
date2 = new Date(2011,8,20)

date2จะถูกตั้งค่าด้วยชั่วโมงนาทีวินาทีและมิลลิวินาทีเป็นศูนย์ แต่ date1 จะตั้งค่าตามเวลาที่ date1 ถูกสร้างขึ้น หากต้องการกำจัดชั่วโมงนาทีวินาทีและมิลลิวินาทีในวันที่ 1 ให้ทำดังนี้:

date1.setHours(0,0,0,0)

ตอนนี้คุณสามารถเปรียบเทียบสองวันเป็น DATES เท่านั้นโดยไม่ต้องกังวลกับองค์ประกอบเวลา


63
โปรดทราบว่าการทดสอบโดยdate1 === date2ดูเหมือนจะไม่ให้พฤติกรรมที่สอดคล้องกัน มันจะดีกว่าที่จะทำหรือแม้กระทั่งdate1.valueOf() === b.valueOf() date1.getTime() === date2.getTime()ความไม่ชอบมาพากล
Erwin Wessels

4
ระวัง: ถ้าวันที่ 1 และวันที่ 2 อยู่ในฤดูหนาวและฤดูร้อนและคุณวางแผนที่จะทำซ้ำจากที่หนึ่งไปที่อื่นด้วย addDays (1) ปัญหาคือพวกเขาจะไม่ได้มีเขตเวลาเดียวกันเพราะการปรับเวลาตามฤดูกาลดังนั้นสุดท้าย การเปรียบเทียบที่ควรให้วันที่เท่ากันจะไม่ทำงานเพราะทั้งสองวันนั้นไม่ได้อยู่ที่ 00: 00: 00: 0
โอลิเวอร์

9
ฉันรู้ว่านี่เป็นคำถามเก่า แต่มาก่อนใน google เมื่อค้นหา ระวังด้วยคำตอบนี้ สิ่งนี้จะให้คำตอบที่ไม่ถูกต้องหากผู้ใช้ไม่ได้อยู่ในเขตเวลาเดียวกันกับผู้สร้างวัตถุวันที่ ตัวอย่างเช่นเปลี่ยนเขตเวลาในระบบปฏิบัติการของคอมพิวเตอร์เป็นเวลาฝั่งตะวันออก (US) var date2 = new Date(2011,8,20)เปิดคอนโซลของเบราว์เซอร์และประเภทของคุณ ตอนนี้เปลี่ยนเขตเวลาของระบบปฏิบัติการเป็นเวลาแปซิฟิก (สหรัฐฯ) ในคอนโซลของเบราว์เซอร์ชนิดเดียวกันdate2.toDateString()คุณจะได้รับMon Sep 19 2011มากกว่าวันอังคารที่ 20!
อดัม

9
นอกจากนี้โปรดทราบว่าsetHours()ตั้งค่าเวลาตามเขตเวลาปัจจุบันซึ่งตรวจพบโดยเบราว์เซอร์โดยอัตโนมัติ ลอง: t = new Date("2016-02-29T01:45:49.098Z"); t.setHours(0,0,0,0); console.log(t.toJSON());จะพิมพ์"2016-02-28T15:00:00.000Z"วันที่ 28 แต่ไม่ใช่ 29 เขตเวลาปัจจุบันของฉันคือAsia/Tokyo
transang

8
คำตอบนี้ควรได้รับการปรับปรุงให้ใช้setUTCxxxวิธีการแทนการรับรู้ตัวแปรท้องถิ่น / เขตเวลา
Stijn de Witt

136

ระวังไทม์โซน

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

วันที่จาวาสคริปต์มี ความคิดของการไม่มีการเขต มันเป็นช่วงเวลาในเวลา (เห็บตั้งแต่ยุค) ที่มีฟังก์ชั่นที่มีประโยชน์ (คงที่) สำหรับการแปลไปยังและจากสตริงการใช้ตามค่าเริ่มต้นเขตเวลา "ท้องถิ่น" ของอุปกรณ์หรือถ้าระบุ UTC หรือเขตเวลาอื่น ในการแสดง just-a-date ™พร้อมวัตถุวันที่คุณต้องการให้วันที่ของคุณเป็นตัวแทน UTC เที่ยงคืนที่จุดเริ่มต้นของวันที่เป็นปัญหา นี่เป็นแบบแผนทั่วไปและจำเป็นที่ช่วยให้คุณทำงานกับวันที่โดยไม่คำนึงถึงฤดูกาลหรือเขตเวลาของการสร้าง ดังนั้นคุณต้องมีความระมัดระวังในการจัดการความคิดของเขตเวลาทั้งเมื่อคุณสร้างวัตถุ UTC Date เที่ยงคืนและเมื่อคุณทำให้เป็นอนุกรม

ผู้คนจำนวนมากสับสนโดยพฤติกรรมเริ่มต้นของคอนโซล หากคุณสเปรย์วันที่ไปยังคอนโซลเอาต์พุตที่คุณเห็นจะรวมเขตเวลาของคุณ นี่เป็นเพียงเพราะคอนโซลโทรถึงtoString()วันที่ของคุณและtoString()ให้การตอบโต้ในพื้นที่ของคุณ วันที่พื้นฐานไม่มีเขตเวลา ! (ตราบใดที่เวลาตรงกับเขตเวลาชดเชยคุณยังคงมีวัตถุวันที่เที่ยงคืน UTC)

Deserializing (หรือสร้างวัตถุ UTC Date เที่ยงคืน)

นี่คือขั้นตอนการปัดเศษด้วยเคล็ดลับที่มีสองคำตอบ "ถูกต้อง" ส่วนใหญ่คุณจะต้องการวันที่ของคุณเพื่อสะท้อนเขตเวลาของผู้ใช้ คลิกถ้าวันนี้เป็นวันเกิดของคุณคลิกที่ถ้าวันนี้เป็นวันเกิดของคุณผู้ใช้ในนิวซีแลนด์และสหรัฐอเมริกาคลิกในเวลาเดียวกันและรับวันที่แตกต่างกัน ในกรณีนี้ให้ทำ ...

// create a date (utc midnight) reflecting the value of myDate and the environment's timezone offset.
new Date(Date.UTC(myDate.getFullYear(),myDate.getMonth(), myDate.getDate()));

บางครั้งการเปรียบเทียบระหว่างประเทศอาจทำให้ความแม่นยำของท้องถิ่นแย่ ในกรณีนี้ให้ทำ ...

// the date in London of a moment in time. Device timezone is ignored.
new Date(Date.UTC(myDate.getUTCFullYear(), myDate.getUTCMonth(), myDate.getUTCDate()));

ยกเลิกการจัดทำวันที่

บ่อยครั้งที่วันที่ลวดจะอยู่ในรูปแบบ YYYY-MM-DD หากต้องการกำจัดพวกเขาให้ทำเช่นนี้ ...

var midnightUTCDate = new Date( dateString + 'T00:00:00Z');

serializing

ตอนนี้คุณต้องแน่ใจว่าได้จัดการเขตเวลาเมื่อคุณแปลงกลับไปเป็นตัวแทนสตริง ดังนั้นคุณสามารถใช้ ...

  • toISOString()
  • getUTCxxx()
  • getTime() //returns a number with no time or timezone.
  • .toLocaleDateString("fr",{timezone:"UTC"}) // whatever locale you want, but ALWAYS UTC.

และหลีกเลี่ยงสิ่งอื่นโดยสิ้นเชิงโดยเฉพาะ ...

  • getYear(),getMonth() ,getDate()

ดังนั้นเพื่อตอบคำถามของคุณ 7 ปีสายเกินไป ...

<input type="date" onchange="isInPast(event)">
<script>
var isInPast = function(event){
  var userEntered = new Date(event.target.valueAsNumber); // valueAsNumber has no time or timezone!
  var now = new Date();
  var today = new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate() ));
  if(userEntered.getTime() < today.getTime())
    alert("date is past");
  else if(userEntered.getTime() == today.getTime())
    alert("date is today");
  else
    alert("date is future");

}
</script>

เห็นมันกำลังทำงาน ...

อัปเดต 2019 ... ของฟรี ...

ด้วยความนิยมของคำตอบนี้ฉันได้ใส่ทั้งหมดไว้ในโค้ด ฟังก์ชั่นต่อไปนี้คืนค่าอ็อบเจกต์วันที่ถูกห่อและแสดงเฉพาะฟังก์ชั่นที่ปลอดภัยที่จะใช้กับ just-a-date ™

เรียกว่ามีวัตถุวันที่และจะแก้ไขให้ JustADate สะท้อนถึงเขตเวลาของผู้ใช้ เรียกมันว่าสตริง: ถ้าสตริงนั้นเป็น ISO 8601 โดยระบุเขตเวลาเราจะปัดเศษส่วนเวลาออก หากไม่ได้ระบุเขตเวลาเราจะแปลงให้เป็นวันที่ซึ่งสะท้อนถึงเขตเวลาท้องถิ่นเช่นเดียวกับวัตถุวันที่

function JustADate(initDate){
  var utcMidnightDateObj = null
  // if no date supplied, use Now.
  if(!initDate)
    initDate = new Date();

  // if initDate specifies a timezone offset, or is already UTC, just keep the date part, reflecting the date _in that timezone_
  if(typeof initDate === "string" && initDate.match(/((\+|-)\d{2}:\d{2}|Z)$/gm)){  
     utcMidnightDateObj = new Date( initDate.substring(0,10) + 'T00:00:00Z');
  } else {
    // if init date is not already a date object, feed it to the date constructor.
    if(!(initDate instanceof Date))
      initDate = new Date(initDate);
      // Vital Step! Strip time part. Create UTC midnight dateObj according to local timezone.
      utcMidnightDateObj = new Date(Date.UTC(initDate.getFullYear(),initDate.getMonth(), initDate.getDate()));
  }

  return {
    toISOString:()=>utcMidnightDateObj.toISOString(),
    getUTCDate:()=>utcMidnightDateObj.getUTCDate(),
    getUTCDay:()=>utcMidnightDateObj.getUTCDay(),
    getUTCFullYear:()=>utcMidnightDateObj.getUTCFullYear(),
    getUTCMonth:()=>utcMidnightDateObj.getUTCMonth(),
    setUTCDate:(arg)=>utcMidnightDateObj.setUTCDate(arg),
    setUTCFullYear:(arg)=>utcMidnightDateObj.setUTCFullYear(arg),
    setUTCMonth:(arg)=>utcMidnightDateObj.setUTCMonth(arg),
    addDays:(days)=>{
      utcMidnightDateObj.setUTCDate(utcMidnightDateObj.getUTCDate + days)
    },
    toString:()=>utcMidnightDateObj.toString(),
    toLocaleDateString:(locale,options)=>{
      options = options || {};
      options.timezone = "UTC";
      locale = locale || "en-EN";
      return utcMidnightDateObj.toLocaleDateString(locale,options)
    }
  }
}


// if initDate already has a timezone, we'll just use the date part directly
console.log(JustADate('1963-11-22T12:30:00-06:00').toLocaleDateString())


3
คำตอบของคุณมีข้อมูลที่มีค่าจริง ๆ ! น่าเสียดายที่คุณไม่ได้เพิ่มคำตอบลงในคำถามที่แท้จริงของ OP ทำให้ฉันไม่สามารถ upvoting ได้ ลองเพิ่มในโค้ดขนาดเล็กที่ตอบคำถามของ OP
Stijn de Witt

ฮ่าฮ่าฮ่า @ '7 ปีสายเกินไป! ฉันชอบสไตล์ของคุณ user1585345! คุณได้รับคะแนนของฉัน!
Stijn de Witt

ฉันพบว่าสิ่งนี้มีประโยชน์ โปรดทราบว่ามีคำสะกดผิดในตัวอย่าง "การเปรียบเทียบระหว่างประเทศ" ฉันคิดว่ามันควรจะเป็น: ใหม่วันที่ (Date.UTC (myDate.getUTCFullYear (), myDate.getUTCMonth (), myDate.getUTCDate ()));
RikRak

1
ฉันหวังว่าฉันจะตอบคำถามนี้ได้ 100 ครั้ง !!!
Sнаđошƒаӽ

77

แล้วเรื่องนี้ล่ะ

Date.prototype.withoutTime = function () {
    var d = new Date(this);
    d.setHours(0, 0, 0, 0);
    return d;
}

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

var date1 = new Date(2014,1,1);
new Date().withoutTime() > date1.withoutTime(); // true

นี่คือคำตอบที่ดีที่สุดในการโพสต์ต้นฉบับ ฉันไม่ได้สร้างฟังก์ชั่นแยกต่างหากเพื่อจุดประสงค์ของฉันเพียงแค่รวมโค้ดสองบรรทัด
Danimal Reks

25

ใช้Moment.js

ถ้าคุณมีตัวเลือกในการรวมทั้งห้องสมุดของบุคคลที่สามก็แน่นอนคุ้มค่าการดูที่Moment.js มันทำให้การทำงานกับDateและDateTimeง่ายขึ้นมาก

ตัวอย่างเช่นการดูว่าวันหนึ่งมาหลังจากวันที่อื่น แต่ไม่รวมเวลาของพวกเขาคุณจะทำสิ่งนี้:

var date1 = new Date(2016,9,20,12,0,0); // October 20, 2016 12:00:00
var date2 = new Date(2016,9,20,12,1,0); // October 20, 2016 12:01:00

// Comparison including time.
moment(date2).isAfter(date1); // => true

// Comparison excluding time.
moment(date2).isAfter(date1, 'day'); // => false

พารามิเตอร์ที่สองคุณผ่านเข้าไปในisAfterความแม่นยำในการทำเปรียบเทียบและสามารถใด ๆyear, month, week, day, hour, หรือminutesecond


4
มีการเร่งความเร็ว 100 เท่าที่ย้ายจากโซลูชัน momentjs ไปเป็น Date () + sethours solution เพื่อนระวัง :-)
2c2c

@ 2c2c น่าสนใจ ดีแน่นอนที่จะรู้ว่าผลกระทบต่อประสิทธิภาพ คุณใช้การปฏิบัติการกี่ครั้งสำหรับการวัดประสิทธิภาพของคุณ
Joshua Pinter

1
ฉันอยู่ที่การเปรียบเทียบประมาณ 1mil ไม่ได้ตั้งค่ามาตรฐานที่แท้จริง
2c2c

17

เพียงเปรียบเทียบโดยใช้. toDateString เหมือนด้านล่าง:

new Date().toDateString();

สิ่งนี้จะส่งคืนวันที่คุณเท่านั้นและไม่ใช่เวลาหรือเขตเวลาเช่นนี้

"ศุกร์ 3 กุมภาพันธ์ 2017"

ดังนั้นวันที่ทั้งสองสามารถเปรียบเทียบในรูปแบบนี้ได้เช่นกันโดยไม่มีเวลา


2
เป็นการเริ่มต้นที่ดี แต่มันไม่อนุญาตให้มีการเปรียบเทียบเพราะตอนนี้มันเป็นสตริง ในการเปรียบเทียบให้เปลี่ยนกลับไปเป็นวัตถุวันที่โดยทำ new Date(new Date().toDateString());
Grid Trekkor

@GridTrekkor จริง แต่ถ้าคุณต้องการทดสอบความเท่าเทียมกันอย่างรวดเร็วนี่เป็นทางออกที่ง่ายที่สุด
CM

8

นี่อาจเป็นเวอร์ชั่นที่สะอาดกว่านี้อีกโปรดทราบว่าคุณควรใช้ radix เสมอเมื่อใช้ parseInt

window.addEvent('domready', function() {
    // Create a Date object set to midnight on today's date
    var today = new Date((new Date()).setHours(0, 0, 0, 0)),
    input = $('datum').getValue(),
    dateArray = input.split('/'),
    // Always specify a radix with parseInt(), setting the radix to 10 ensures that
    // the number is interpreted as a decimal.  It is particularly important with
    // dates, if the user had entered '09' for the month and you don't use a
    // radix '09' is interpreted as an octal number and parseInt would return 0, not 9!
    userMonth = parseInt(dateArray[1], 10) - 1,
    // Create a Date object set to midnight on the day the user specified
    userDate = new Date(dateArray[2], userMonth, dateArray[0], 0, 0, 0, 0);

    // Convert date objects to milliseconds and compare
    if(userDate.getTime() > today.getTime())
    {
            alert(today+'\n'+userDate);
    }
});

ชำระเงินที่หน้าMDC parseIntสำหรับข้อมูลเพิ่มเติมเกี่ยวกับ radix

JSLintเป็นเครื่องมือที่ยอดเยี่ยมสำหรับการจับสิ่งต่าง ๆ เช่น radix ที่หายไปและสิ่งอื่น ๆ อีกมากมายที่อาจทำให้เกิดข้อผิดพลาดที่คลุมเครือและยากที่จะแก้ไขข้อผิดพลาด มันบังคับให้คุณใช้มาตรฐานการเข้ารหัสที่ดีกว่าดังนั้นคุณจึงหลีกเลี่ยงอาการปวดหัวในอนาคต ฉันใช้มันในทุกโครงการ JavaScript ฉันรหัส


@EmKay นี่ไม่ควรเป็นปัญหาใหญ่ในขณะนี้เนื่องจาก ES5 นั้นค่อนข้างมาตรฐานในเบราว์เซอร์ส่วนใหญ่และห้ามการตีความแบบแปดฐานแต่เบราว์เซอร์บางตัวอาจยังใช้การตีความแบบแปดด้านด้วยเหตุผลด้านความเข้ากันได้แบบย้อนหลัง สำหรับอนาคตอันใกล้
รหัสที่ไร้ประโยชน์

หากคุณใช้การตีความฐานแปดของโหมดเข้มงวดจะทำให้เกิดข้อผิดพลาดซึ่งเป็นสิ่งที่ดีเพราะจะช่วยให้คุณพบข้อผิดพลาดที่อาจตีความผิด
รหัสที่ไร้ประโยชน์

4

date.jsห้องสมุดที่มีประโยชน์สำหรับสิ่งเหล่านี้ มันทำให้การ Scriping ที่เกี่ยวข้องกับวันที่ของ JS ทั้งหมดง่ายขึ้นมาก


11
คุณสามารถเพิ่มข้อมูลเพิ่มเติมเกี่ยวกับวิธีที่ห้องสมุดนี้ทำให้มันง่ายขึ้นได้หรือไม่?
Mahmoud Hanafy

4

หากคุณกำลังเปรียบเทียบวันที่อย่างแท้จริงโดยไม่มีองค์ประกอบเวลาโซลูชันอื่นที่อาจรู้สึกผิด แต่ใช้งานได้และหลีกเลี่ยงDate()อาการปวดหัวตลอดเวลาและเขตเวลาคือการเปรียบเทียบวันที่สตริง ISO โดยตรงโดยใช้การเปรียบเทียบสตริง:

> "2019-04-22" <= "2019-04-23"
true
> "2019-04-22" <= "2019-04-22"
true
> "2019-04-22" <= "2019-04-21"
false
> "2019-04-22" === "2019-04-22"
true

คุณสามารถรับวันที่ปัจจุบัน (วันที่ UTC ไม่ใช่วันที่ท้องถิ่นของผู้ใช้) โดยใช้:

> new Date().toISOString().split("T")[0]
"2019-04-22"

ข้อโต้แย้งของฉันคือมันเป็นความเรียบง่ายของโปรแกรมเมอร์ - คุณมีโอกาสน้อยมากที่จะทำสิ่งนี้ได้ดีกว่าการพยายามจัดการชุดข้อมูลและออฟเซ็ตอย่างถูกต้องซึ่งอาจเป็นต้นทุนของความเร็ว (ฉันไม่ได้เปรียบเทียบประสิทธิภาพ)


new Date().toISOString().substr(0, 10) // "2019-04-22"นอกจากนี้คุณยังสามารถทำ
stomy

สำหรับวันท้องถิ่นวันที่ (ไม่ใช่ UTC) new Date().toLocaleDateString() // "8/26/2019"คุณสามารถใช้ แต่จากนั้นการเปรียบเทียบข้อความจะไม่ถูกต้อง (เหมือน"8/26/2019" >= "9/29/2001"เป็นเท็จ) ดังนั้นคุณจะต้องแปลงnew Date(new Date().toLocaleDateString())ให้ถูกต้องเพื่อเปรียบเทียบกับวันที่อื่น
stomy

4

เพียงใช้ toDateString () ทั้งสองวัน toDateString ไม่รวมเวลาดังนั้นสำหรับ 2 ครั้งในวันเดียวกันค่าจะเท่ากันดังที่แสดงด้านล่าง

var d1 = new Date(2019,01,01,1,20)
var d2 = new Date(2019,01,01,2,20)
console.log(d1==d2) // false
console.log(d1.toDateString() == d2.toDateString()) // true

เห็นได้ชัดว่าความกังวลเกี่ยวกับเขตเวลาบางส่วนที่ปรากฏในคำถามนี้นั้นถูกต้อง แต่ในหลาย ๆ สถานการณ์สิ่งเหล่านั้นไม่เกี่ยวข้องกัน


1
ในกรณีของฉันโซลูชันนี้ดีกว่าคำตอบที่เลือกและคำตอบที่โหวตมากขึ้น มีการระบุไว้อย่างชัดเจนในชื่อ "โดยไม่ต้องเปรียบเทียบเวลา" โซลูชันนี้ทำอย่างนั้นช่วยประหยัดความจำเป็นในการตั้งเวลาเพื่อจัดการการเปรียบเทียบ ในการตอบว่า "เหตุการณ์ X และเหตุการณ์ Y เกิดขึ้นในวันเดียวกัน" มันสมเหตุสมผลกว่าที่จะเปรียบเทียบเพียงแค่วันที่แทนที่จะตอบว่า "คือ 00: 00: 00.00 AM ของวันที่ของเหตุการณ์ X เหมือนกันกับ 00:00: 00.00 ของวันที่ของเหตุการณ์ Y? " ซึ่งเป็นสิ่งที่ผู้ตอบ
คำถาม

3

นี่คือวิธีที่ฉันทำ:

var myDate  = new Date($('input[name=frequency_start]').val()).setHours(0,0,0,0);
var today   = new Date().setHours(0,0,0,0);
if(today>myDate){
    jAlert('Please Enter a date in the future','Date Start Error', function(){
        $('input[name=frequency_start]').focus().select();
    });
}

ขณะนี้ฉันใช้สิ่งนี้ในการผลิตและฉันไม่มีปัญหาหรือความเข้ากันไม่ได้ของเบราว์เซอร์อื่น ๆ ... ด้วยเหตุผลใดก็ตามที่คุณพูดว่าgetTime()จำเป็น
Fabrizio

5
โปรดทราบว่าการsetHours()ปรับเปลี่ยนวัตถุที่ถูกเรียกและส่งคืนวันที่เป็นจำนวนมิลลิวินาที (เทียบเท่ากับการโทรgetTime()) ดังนั้นtodayตัวแปรของคุณไม่ใช่Dateวัตถุอย่างที่บางคนคาดหวัง แต่จริง ๆ แล้วเป็นจำนวนเต็มเป็นมิลลิวินาที ผลข้างเคียงนี่คือสาเหตุที่คุณไม่จำเป็นต้องโทรหาgetTime()ก่อนทำการเปรียบเทียบเนื่องจากคุณมีพฤติกรรมที่คลุมเครืออยู่แล้ว
Timothy Walters

3

เนื่องจากฉันไม่เห็นวิธีที่คล้ายกันที่นี่และฉันไม่เพลิดเพลินกับการตั้งค่า h / m / s / ms เป็น 0 เนื่องจากอาจทำให้เกิดปัญหากับการเปลี่ยนที่ถูกต้องเป็นเขตเวลาท้องถิ่นด้วยdateวัตถุที่เปลี่ยนแปลง(ฉันคิดว่า) แนะนำที่นี่สิ่งนี้เขียนเมื่อไม่นานมานี้ฟังก์ชัน lil:

+: ใช้งานง่ายทำให้การดำเนินการเปรียบเทียบขั้นพื้นฐานเสร็จสิ้น (เปรียบเทียบวันเดือนและปีโดยไม่มีเวลา)
-: ดูเหมือนว่านี่เป็นสิ่งที่ตรงกันข้ามกับการคิด "ออกนอกกรอบ" อย่างสมบูรณ์

function datecompare(date1, sign, date2) {
    var day1 = date1.getDate();
    var mon1 = date1.getMonth();
    var year1 = date1.getFullYear();
    var day2 = date2.getDate();
    var mon2 = date2.getMonth();
    var year2 = date2.getFullYear();
    if (sign === '===') {
        if (day1 === day2 && mon1 === mon2 && year1 === year2) return true;
        else return false;
    }
    else if (sign === '>') {
        if (year1 > year2) return true;
        else if (year1 === year2 && mon1 > mon2) return true;
        else if (year1 === year2 && mon1 === mon2 && day1 > day2) return true;
        else return false;
    }    
}

การใช้งาน:

datecompare(date1, '===', date2)สำหรับการตรวจสอบความเท่าเทียมกันสำหรับการตรวจสอบที่
datecompare(date1, '>', date2)มากขึ้นสำหรับการตรวจสอบ
!datecompare(date1, '>', date2)น้อยลงหรือเท่ากัน

นอกจากนี้เห็นได้ชัดว่าคุณสามารถสลับdate1และdate2ในสถานที่เพื่อให้ได้การเปรียบเทียบแบบง่าย ๆ


Nice หนึ่งบวกบวกช่วยฉันตอนนี้หวังว่าการแปลง iso ไม่กัดฮ่าฮ่าขอบคุณ
edencorbin

3

วิธีที่มีประสิทธิภาพและถูกต้องในการเปรียบเทียบวันที่คือ:

Math.floor(date1.getTime() / 86400000) > Math.floor(date2.getTime() / 86400000);

มันไม่สนใจส่วนของเวลามันใช้ได้กับเขตเวลาที่แตกต่างกันและคุณสามารถเปรียบเทียบเพื่อความเท่าเทียมกัน==ได้ 86400000 คือจำนวนมิลลิวินาทีในหนึ่งวัน ( = 24*60*60*1000)

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

> date1;
outputs: Thu Mar 08 2018 00:00:00 GMT+1300

> date2;
outputs: Thu Mar 08 2018 00:00:00 GMT+1300

> date1 == date2;
outputs: false

> Math.floor(date1.getTime() / 86400000) == Math.floor(date2.getTime() / 86400000);
outputs: true

หมายเหตุ: หากคุณกำลังเปรียบเทียบออบเจ็กต์วันที่ที่มีส่วนของเวลาที่กำหนดเป็นศูนย์คุณสามารถใช้date1.getTime() == date2.getTime()แต่มันก็คุ้มค่าที่จะเพิ่มประสิทธิภาพ คุณสามารถใช้<,> , <=หรือ>=เมื่อเปรียบเทียบกับวันที่วัตถุโดยตรงเพราะผู้ประกอบการเหล่านี้ก่อนแปลงวัตถุวันโดยการเรียก.valueOf()ก่อนที่ผู้ประกอบการจะเปรียบเทียบ


2

หลังจากอ่านคำถามนี้ในเวลาเดียวกันหลังจากที่โพสต์แล้วฉันตัดสินใจที่จะโพสต์โซลูชันอื่นเนื่องจากฉันไม่พบว่ามันค่อนข้างน่าพอใจอย่างน้อยก็ตามความต้องการของฉัน:

ฉันได้ใช้สิ่งนี้:

var currentDate= new Date().setHours(0,0,0,0);

var startDay = new Date(currentDate - 86400000 * 2);
var finalDay = new Date(currentDate + 86400000 * 2);

ด้วยวิธีนี้ฉันสามารถใช้วันที่ในรูปแบบที่ฉันต้องการสำหรับการประมวลผลในภายหลัง แต่นี่เป็นเพียงความต้องการของฉัน แต่ฉันได้ตัดสินใจที่จะโพสต์ต่อไปอาจจะช่วยใครซักคน


1
โปรดทราบว่าcurrentDateตัวแปรของคุณไม่ใช่วันที่ แต่เป็นจำนวนมิลลิวินาทีตั้งแต่ 1970-01-01 setHours()วิธีการปรับเปลี่ยนวัตถุวันที่มันถูกเรียกบนและผลตอบแทนเทียบเท่าของgetTime()(มูลค่าของวันที่ในมิลลิวินาทีตั้งแต่ 1970/01/01)
Timothy Walters


1

คุณสามารถใช้เลขคณิตกับจำนวนรวมของ ms

var date = new Date(date1);
date.setHours(0, 0, 0, 0);

var diff = date2.getTime() - date.getTime();
return diff >= 0 && diff < 86400000;

ฉันชอบสิ่งนี้เพราะไม่มีการอัพเดทวันที่ดั้งเดิมและทำให้น้ำหอมเร็วกว่าการแยกและเปรียบเทียบสตริง

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


1

JS นี้จะเปลี่ยนเนื้อหาหลังจากวันที่กำหนด นี่คือสิ่งเดียวกัน แต่ใน w3schools

date1 = new Date()
date2 = new Date(2019,5,2) //the date you are comparing

date1.setHours(0,0,0,0)

var stockcnt = document.getElementById('demo').innerHTML;
if (date1 > date2){
document.getElementById('demo').innerHTML="yes"; //change if date is > set date (date2)
}else{
document.getElementById('demo').innerHTML="hello"; //change if date is < set date (date2)
}
<p id="demo">hello</p> <!--What will be changed-->
<!--if you check back in tomorrow, it will say yes instead of hello... or you could change the date... or change > to <-->


1

สิ่งนี้ใช้ได้กับฉัน:

 export default (chosenDate) => {
  const now = new Date();
  const today = new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate()));
  const splitChosenDate = chosenDate.split('/');

  today.setHours(0, 0, 0, 0);
  const fromDate = today.getTime();
  const toDate = new Date(splitChosenDate[2], splitChosenDate[1] - 1, splitChosenDate[0]).getTime();

  return toDate < fromDate;
};

ในคำตอบที่ยอมรับมีปัญหาเกี่ยวกับเขตเวลาและในเวลาอื่นไม่ใช่ 00:00:00


0

ฉันรู้ว่าคำถามนี้ได้รับการตอบแล้วและนี่อาจไม่ใช่วิธีที่ดีที่สุด แต่ในสถานการณ์ของฉันมันทำงานได้อย่างสมบูรณ์แบบดังนั้นฉันคิดว่ามันอาจช่วยคนอย่างฉัน

ถ้าคุณมีความdate stringเป็น

String dateString="2018-01-01T18:19:12.543";

และคุณเพียงต้องการเปรียบเทียบส่วนวันที่กับวัตถุวันที่อื่นใน JS

var anotherDate=new Date(); //some date

แล้วคุณจะต้องไปconvertstringDateวัตถุโดยใช้new Date("2018-01-01T18:19:12.543");

และนี่คือเคล็ดลับ: -

var valueDate =new Date(new Date(dateString).toDateString());

            return valueDate.valueOf() == anotherDate.valueOf(); //here is the final result

ฉันได้ใช้toDateString()ของDate objectของ JS ซึ่งจะส่งกลับสตริงวันเท่านั้น

หมายเหตุ: อย่าลืมใช้ .valueOf()ฟังก์ชั่นในขณะที่เปรียบเทียบวันที่

ข้อมูลเพิ่มเติมเกี่ยวกับการอ้างอิง.valeOf()อยู่ที่นี่

มีความสุข codding


0

สิ่งนี้จะช่วยได้ ฉันจัดการเพื่อให้เป็นเช่นนี้

var currentDate = new Date(new Date().getFullYear(), new Date().getMonth() , new Date().getDate())

0

เมื่อเปรียบเทียบกับsetHours()จะเป็นทางออก ตัวอย่าง:

var d1 = new Date();
var d2 = new Date("2019-2-23");
if(d1.setHours(0,0,0,0) == d2.setHours(0,0,0,0)){
    console.log(true)
}else{
    console.log(false)
}

0
var fromdate = new Date(MM/DD/YYYY);
var todate = new Date(MM/DD/YYYY);
if (fromdate > todate){
    console.log('False');
}else{
    console.log('True');
}

หากรูปแบบวันที่ของคุณแตกต่างจากนั้นใช้ห้องสมุดmoment.jsเพื่อแปลงรูปแบบวันที่ของคุณแล้วใช้รหัสด้านบนเพื่อเปรียบเทียบสองวันที่

ตัวอย่าง:

หากวันที่ของคุณอยู่ใน "DD / MM / YYYY" และต้องการแปลงเป็น "MM / DD / YYYY" จากนั้นดูตัวอย่างโค้ดด้านล่าง

var newfromdate = new Date(moment(fromdate, "DD/MM/YYYY").format("MM/DD/YYYY"));
console.log(newfromdate);
var newtodate = new Date(moment(todate, "DD/MM/YYYY").format("MM/DD/YYYY"));
console.log(newtodate);

0

คุณสามารถใช้ fp_incr (0) ซึ่งกำหนดส่วนของเขตเวลาเป็นเที่ยงคืนและส่งคืนวัตถุวันที่

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