วิธีที่ดีที่สุดในการเริ่มต้นวันที่จาวาสคริปต์ถึงเที่ยงคืนคืออะไร?


439

วิธีที่ง่ายที่สุดในการรับอินสแตนซ์ของ Date ใหม่ () แต่ตั้งเวลาตอนเที่ยงคืนคืออะไร

คำตอบ:


874

setHoursวิธีสามารถใช้ตัวเลือกminutes, secondsและmsข้อโต้แย้งตัวอย่างเช่น:

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

ที่จะตั้งเวลาในการ00:00:00.000ของเขตเวลาปัจจุบันของคุณถ้าคุณต้องการที่จะทำงานในเวลา UTC คุณสามารถใช้setUTCHoursวิธีการ


41
FYI ฉันใช้วิธีนี้ (d.setHours (0,0,0,0)) ในการลดฟังก์ชั่นในแถว 270K และมันเร็วกว่า 20 วินาทีกว่าทำ d.setHours (0); d.setMinutes (0); d.setSeconds (0); คำตอบที่ยอดเยี่ยม @CMS!
jbnunn

32
สิ่งนี้จะต้องทำในสองบรรทัดเพื่อให้ d เป็นวัตถุวันที่ ฉันเพิ่งแก้ไขข้อบกพร่องที่ทำไว้ในหนึ่งบรรทัด: var d = new Date (). setHours (0, 0, 0, 0) อย่างไรก็ตาม d เป็นตัวเลขไม่ใช่วันที่เนื่องจาก setHours ส่งคืนตัวเลข
Jason

9
ฉันเพิ่งเจอสิ่งนี้ (ไปงานปาร์ตี้ที่ฉันรู้จัก) และต้องการโซลูชันหนึ่งบรรทัดที่ส่งคืนวันที่ สำหรับใครที่กำลังมองหานี้@ คำตอบของ Zonnew Date(new Date().setHours(0,0,0,0))ทำงานอย่างสมบูรณ์แบบ:
SRack

226

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

var d = new Date();
d.setHours(0,0,0,0); // last midnight

หากคุณต้องการรับเที่ยงคืนที่ใกล้ที่สุดในอนาคตให้ใช้รหัสต่อไปนี้:

var d = new Date();
d.setHours(24,0,0,0); // next midnight

6
จะเกิดอะไรขึ้นถ้าวันนี้มีความยาว 25 ชั่วโมง (นาฬิกาปรับไปข้างหน้าสำหรับการปรับเวลาตามฤดูกาล)
qntm

8
นี่คือสคริปต์ฝั่งไคลเอ็นต์เที่ยงคืนคือเที่ยงคืนแม้จะมีการออมแสง .. นอกจากนี้ยังมีการกล่าวถึงที่สำคัญ .. ไม่ใช่ทุกที่ในโลกที่ใช้ DST (เวลาออมแสง)
chris

2
@qntm: การเปลี่ยนแปลงการปรับเวลาตามฤดูกาลมักจะใช้เวลา 2:00 - 04:00 น. ดังนั้นจะมีเพียงหนึ่งเที่ยงคืนในระหว่างวันนั้น :) แต่ใช่ 03:00 สามารถเกิดขึ้นได้สองครั้งในระหว่างวัน (ใบหน้า)
ด่าน

@chris ไม่ฉันหมายถึงตัวอย่างที่สอง "24 ชั่วโมงหลังเที่ยงคืนวันนี้" ไม่ใช่สิ่งเดียวกับ "เที่ยงคืนพรุ่งนี้" ในกรณีเหล่านี้ข้อมูลโค้ดที่สองใช้งานได้หรือไม่
qntm

3
@qntm: Date.setHours ไม่เพิ่มสุ่มสี่สุ่มห้า 24 ชั่วโมงมันฉลาดมากขึ้น แต่จะส่งคืนการประทับเวลาในขณะที่นาฬิกาจะแสดง 24 ครั้งถัดไป คำนึงถึงการประหยัดเวลา ลองเล่นในคอนโซลด้วยตัวเอง สิ่งที่น่าสนใจ setHours (25) จะส่งกลับค่าเวลาประทับของวันพรุ่งนี้ 01.00 น.
Dan

68

ซับในสำหรับการกำหนดค่าวัตถุ:

new Date(new Date().setHours(0,0,0,0));

เมื่อสร้างองค์ประกอบ:

dateFieldConfig = {
      name: "mydate",
      value: new Date(new Date().setHours(0, 0, 0, 0)),
}

6
ขอบคุณ! ฉันสงสัยว่าฉันสามารถทำได้ในบรรทัดเดียวเพราะฉันตั้งค่าคุณสมบัติวัตถุ! คำตอบที่ดี
เปาโลโรแบร์โตโรซา

ขอบคุณ Zon สิ่งนี้ช่วยให้ฉันเขียนบรรทัดเดียว
HungrySoul

22

เพิ่งจะเพิ่มที่นี่เพราะฉันมีที่ดินในหน้านี้มองหาวิธีการทำในmoment.jsและคนอื่น ๆ อาจทำเช่นกัน

[เหตุผล: คำว่า " โมฆะ " ปรากฏที่อื่นในหน้านี้แล้วดังนั้นเสิร์ชเอ็นจิ้นตรงนี้และmoment.jsจึงมานั้นแพร่หลายมากพอที่จะรับประกันว่าจะครอบคลุมถึงความถี่ที่กล่าวถึงในคำถาม SO ที่เกี่ยวเนื่องกับวันอื่น ๆ ]

ดังนั้นในเวอร์ชัน 2.0.0 ขึ้นไป:

date.startOf('day');

สำหรับรุ่นก่อนหน้า:

date.sod();

เอกสาร:

http://momentjs.com/docs/#/manipulating/start-of/


เพื่อรับวัตถุวันที่กลับมาใช้สิ่งนี้moment(DATE_OBJECT).startOf('day').toDate();
xinthose

2
ใช่ให้เพิ่มไลบรารี javascript 52kb เพื่อทำสิ่งที่คุณสามารถทำได้ 2 บรรทัด
Bruce Lim

19
และถ้าคุณใช้ moment.js อยู่แล้วด้วยเหตุผลดีๆหลายข้อคุณอาจจะ ... ? วิธีการเกี่ยวกับการอ่านเหตุผลที่ฉันให้ก่อนเพิ่มความคิดเห็นเหน็บแนม?
andyhasit

11

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

new Date().setUTCHours(0,0,0,0)

หากคุณต้องการค่าเพียงครั้งเดียว


1
สิ่งนี้ไม่ได้รับอินสแตนซ์ของวันที่ตามที่ OP ต้องการ
cobberboy

นี่เป็นคำตอบที่ดีที่สุดอย่างไม่มีกำหนด แต่ต้องการการแก้ไขเล็กน้อยเพื่อส่งคืนอินสแตนซ์ของวันที่ ใหม่วันที่ (ใหม่วันที่ (). setUTCHours (0, 0, 0, 0));
VitFL

4

การเพิ่มความมีประโยชน์ให้กับตัวอย่างของ @ Dan ฉันต้องการค้นหาเที่ยงวันหรือเที่ยงคืนถัดไป

var d = new Date();
if(d.getHours() < 12) {
   d.setHours(12,0,0,0); // next midnight/midday is midday
} else {
   d.setHours(24,0,0,0); // next midnight/midday is midnight
}

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


4

หากคำนวณด้วยวันที่ฤดูร้อนมักจะทำให้ 1 uur มากกว่าหรือหนึ่งชั่วโมงน้อยกว่าเที่ยงคืน (CEST) สิ่งนี้ทำให้เกิดความแตกต่าง 1 วันเมื่อวันที่กลับมา ดังนั้นวันที่จะต้องไปรอบเที่ยงคืนที่ใกล้ที่สุด ดังนั้นรหัสจะเป็น (ths to jamisOn):

    var d = new Date();
    if(d.getHours() < 12) {
    d.setHours(0,0,0,0); // previous midnight day
    } else {
    d.setHours(24,0,0,0); // next midnight day
    }

3

ฉันได้สร้างต้นแบบสองสามตัวเพื่อจัดการเรื่องนี้ให้ฉัน

// This is a safety check to make sure the prototype is not already defined.
Function.prototype.method = function (name, func) {
    if (!this.prototype[name]) {
        this.prototype[name] = func;
        return this;
    }
};

Date.method('endOfDay', function () {
    var date = new Date(this);
    date.setHours(23, 59, 59, 999);
    return date;
});

Date.method('startOfDay', function () {
    var date = new Date(this);
    date.setHours(0, 0, 0, 0);
    return date;
});

หากคุณไม่ต้องการการตรวจสอบความปลอดภัยจากนั้นคุณสามารถใช้

Date.prototype.startOfDay = function(){
  /*Method body here*/
};

ตัวอย่างการใช้งาน:

var date = new Date($.now()); // $.now() requires jQuery
console.log('startOfDay: ' + date.startOfDay());
console.log('endOfDay: ' + date.endOfDay());

2

ในกรณีที่คุณมีอยู่แล้วเป็น d3.js พึ่งพาในโครงการของคุณหรือไม่คิดนำมันในd3 เวลา ( ห้องสมุด d3.js เป็น modular ณ v4.0.0 ) ได้มีช่วงเวลาที่

อาจพิสูจน์ว่ามีประโยชน์เมื่อตั้งค่าวันที่เป็น "ค่าเริ่มต้น" เช่นเที่ยงคืน 0.00 วินาทีในช่วงเดือนแรกเป็นต้น

var d = new Date(); // Wed Aug 02 2017 15:01:07 GMT+0200 (CEST)
d3.timeHour(d) // Wed Aug 02 2017 00:00:00 GMT+0200 (CEST)
d3.timeMonth(d) // Tue Aug 01 2017 00:00:00 GMT+0200 (CEST)

ดังนั้นฉันจึงสังเกตเห็นแนวโน้มของคำถามที่เกี่ยวข้องกับ JavaScript ที่โพสต์ไว้ใน SO: ไม่ว่าความซับซ้อนของโซลูชันจะถูกนำมาใช้โดยใช้ Native JS คำตอบใด ๆ ที่ตอบปัญหาด้วยความช่วยเหลือของไลบรารีภายนอกจะหลีกเลี่ยงไม่ได้ ตระหนักถึงนี้ผมเอาให้ระมัดระวังในการโพสต์คำตอบของฉันกับคำนำอย่างรวดเร็ว: ในกรณีที่คุณมีอยู่แล้วเป็น example.js พึ่งพา และยังเป็น downvote ผู้ใช้ SO แบบไม่ระบุชื่อใช่หรือไม่ ที่เจ็บชาย: '- (
Peemster

ฉันรู้สึกว่าคำตอบนี้ไม่ควรถูกโหวตโดยเฉพาะอย่างยิ่งเนื่องจากการใช้หนึ่งข้อเสนอของ moment.js มีคะแนน 16 คะแนนขึ้นไป (ในขณะที่เขียนความคิดเห็นนี้) มันแก้ปัญหาได้อย่างกระชับและไม่ใช่วิธีที่ชัดเจน
lukeatdesignworks
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.