พบกับวัตถุในตัวใหม่: วันที่ โดยจะจัดเก็บวันที่ เวลา และจัดเตรียมวิธีการจัดการวันที่/เวลา
ตัวอย่างเช่น เราสามารถใช้เพื่อจัดเก็บเวลาในการสร้าง/แก้ไข วัดเวลา หรือเพียงเพื่อพิมพ์วันที่ปัจจุบัน
หากต้องการสร้างวัตถุ Date
ใหม่ ให้เรียก new Date()
ด้วยอาร์กิวเมนต์ข้อใดข้อหนึ่งต่อไปนี้:
new Date()
ไม่มีข้อโต้แย้ง – สร้างวัตถุ Date
สำหรับวันที่และเวลาปัจจุบัน:
ให้ตอนนี้ = วันที่ใหม่ (); แจ้งเตือน(ตอนนี้); // แสดงวันที่/เวลาปัจจุบัน
new Date(milliseconds)
สร้างวัตถุ Date
โดยมีเวลาเท่ากับจำนวนมิลลิวินาที (1/1000 วินาที) ที่ผ่านไปหลังจากวันที่ 1 มกราคม 1970 UTC+0
// 0 หมายถึง 01.01.1970 UTC+0 ให้ Jan01_1970 = วันที่ใหม่ (0); การแจ้งเตือน ( ม.ค. 01_1970 ); // ตอนนี้เพิ่ม 24 ชั่วโมง รับ 02.01.1970 UTC+0 ให้ Jan02_1970 = วันที่ใหม่ (24 * 3600 * 1,000); การแจ้งเตือน ( ม.ค. 02_1970 );
ตัวเลขจำนวนเต็มที่แสดงถึงจำนวนมิลลิวินาทีที่ผ่านไปตั้งแต่ต้นปี 1970 เรียกว่า การประทับเวลา
เป็นการแสดงวันที่ในรูปแบบตัวเลขน้ำหนักเบา เราสามารถสร้างวันที่จากการประทับเวลาได้เสมอโดยใช้ new Date(timestamp)
และแปลงวัตถุ Date
ที่มีอยู่เป็นการประทับเวลาโดยใช้เมธอด date.getTime()
(ดูด้านล่าง)
วันที่ก่อน 01.01.1970 มีการประทับเวลาติดลบ เช่น:
// 31 ธ.ค. 2512 ให้ Dec31_1969 = วันที่ใหม่ (-24 * 3600 * 1,000); การแจ้งเตือน (31 ธ.ค._1969 );
new Date(datestring)
หากมีอาร์กิวเมนต์เดียวและเป็นสตริง อาร์กิวเมนต์นั้นจะถูกแยกวิเคราะห์โดยอัตโนมัติ อัลกอริธึมเหมือนกับที่ Date.parse
ใช้ เราจะกล่าวถึงในภายหลัง
ให้วันที่ = วันที่ใหม่ ("2017-01-26"); การแจ้งเตือน (วันที่); // ไม่ได้ตั้งเวลา ดังนั้นจึงถือว่าเป็นเวลาเที่ยงคืน GMT และ // ถูกปรับตามเขตเวลาที่เรียกใช้โค้ด // ดังนั้นผลลัพธ์อาจเป็นได้ // พฤหัสบดีที่ 26 มกราคม 2017 11:00:00 GMT+1100 (เวลาออมแสงตะวันออกของออสเตรเลีย) // หรือ // วันพุธที่ 25 มกราคม 2560 16:00:00 GMT-0800 (เวลามาตรฐานแปซิฟิก)
new Date(year, month, date, hours, minutes, seconds, ms)
สร้างวันที่ด้วยส่วนประกอบที่กำหนดในเขตเวลาท้องถิ่น จำเป็นต้องมีข้อโต้แย้งสองข้อแรกเท่านั้น
year
ควรมีตัวเลข 4 หลัก เพื่อความเข้ากันได้ จะยอมรับตัวเลข 2 หลักและถือเป็น 19xx
เช่น 98
จะเหมือนกับ 1998
ที่นี่ แต่ขอแนะนำให้ใช้ตัวเลข 4 หลักเสมอ
การนับ month
เริ่มต้นด้วย 0
(ม.ค.) ไปจนถึง 11
(ธ.ค.)
พารามิเตอร์ date
จริงๆ แล้วคือวันของเดือน หากไม่มี จะถือว่าเป็น 1
หากไม่มี hours/minutes/seconds/ms
จะถือว่ามีค่าเท่ากับ 0
ตัวอย่างเช่น:
วันที่ใหม่ (2011, 0, 1, 0, 0, 0, 0); // 1 มกราคม 2554, 00:00:00 น วันที่ใหม่ (2011, 0, 1); // เช่นเดียวกัน ชั่วโมง ฯลฯ จะเป็น 0 โดยค่าเริ่มต้น
ความแม่นยำสูงสุดคือ 1 ms (1/1000 วินาที):
ให้วันที่ = วันที่ใหม่ (2011, 0, 1, 2, 3, 4, 567); การแจ้งเตือน (วันที่); // 1.01.2011, 02:03:04.567
มีวิธีการในการเข้าถึงปี เดือน และอื่นๆ จากอ็อบเจ็กต์ Date
:
รับเต็มปี()
รับปี (4 หลัก)
รับเดือน()
รับเดือน ตั้งแต่ 0 ถึง 11
รับวันที่()
รับวันของเดือนตั้งแต่ 1 ถึง 31 ชื่อวิธีดูแปลกๆ นิดหน่อย
getHours(), getMinutes(), getSeconds(), getMilliseconds()
รับส่วนประกอบเวลาที่สอดคล้องกัน
ไม่ใช่ getYear()
แต่ getFullYear()
เอ็นจิ้น JavaScript จำนวนมากใช้เมธอด getYear()
ที่ไม่เป็นไปตามมาตรฐาน วิธีการนี้เลิกใช้แล้ว บางครั้งจะส่งกลับปี 2 หลัก กรุณาอย่าใช้มัน มี getFullYear()
สำหรับปี
นอกจากนี้ เรายังได้รับวันในสัปดาห์ด้วย:
รับวัน()
รับวันในสัปดาห์ตั้งแต่ 0
(วันอาทิตย์) ถึง 6
(วันเสาร์) วันแรกจะเป็นวันอาทิตย์เสมอ ในบางประเทศอาจไม่เป็นเช่นนั้นแต่ไม่สามารถเปลี่ยนแปลงได้
วิธีการทั้งหมดข้างต้นส่งคืนส่วนประกอบที่สัมพันธ์กับเขตเวลาท้องถิ่น
นอกจากนี้ยังมีคู่เวลา UTC เช่น วัน เดือน ปี และอื่นๆ สำหรับเขตเวลา UTC+0: getUTCFullYear(), getUTCMonth(), getUTCDay() เพียงใส่ "UTC"
หลัง "get"
หากเขตเวลาท้องถิ่นของคุณเปลี่ยนไปโดยสัมพันธ์กับ UTC โค้ดด้านล่างจะแสดงเวลาที่แตกต่างกัน:
//วันที่ปัจจุบัน ให้วันที่ = วันที่ใหม่ (); // ชั่วโมงในเขตเวลาปัจจุบันของคุณ การแจ้งเตือน( date.getHours() ); // ชั่วโมงในเขตเวลา UTC+0 (เวลาลอนดอนที่ไม่มีการปรับเวลาตามฤดูกาล) การแจ้งเตือน ( date.getUTCHours() );
นอกจากวิธีการที่กำหนดแล้ว ยังมีวิธีพิเศษอีกสองวิธีที่ไม่มีตัวแปร UTC:
รับเวลา()
ส่งกลับการประทับเวลาสำหรับวันที่ ซึ่งเป็นจำนวนมิลลิวินาทีที่ผ่านไปตั้งแต่วันที่ 1 มกราคม 1970 UTC+0
รับเขตเวลาออฟเซ็ต()
ส่งกลับความแตกต่างระหว่าง UTC และเขตเวลาท้องถิ่นในหน่วยนาที:
// หากคุณอยู่ในเขตเวลา UTC-1 เอาต์พุตจะเป็น 60 // หากคุณอยู่ในเขตเวลา UTC+3 เอาต์พุต -180 การแจ้งเตือน ( วันที่ใหม่ ().getTimezoneOffset() );
วิธีการต่อไปนี้อนุญาตให้ตั้งค่าองค์ประกอบวันที่/เวลา:
setFullYear(year, [month], [date])
setMonth(month, [date])
setDate(date)
setHours(hour, [min], [sec], [ms])
setMinutes(min, [sec], [ms])
setSeconds(sec, [ms])
setMilliseconds(ms)
setTime(milliseconds)
(ตั้งค่าวันที่ทั้งหมดเป็นมิลลิวินาทีตั้งแต่ 01.01.1970 UTC)
ทุกรายการยกเว้น setTime()
มีตัวแปร UTC เช่น: setUTCHours()
ดังที่เราเห็น บางวิธีสามารถตั้งค่าองค์ประกอบหลายรายการพร้อมกันได้ เช่น setHours
ส่วนประกอบที่ไม่ได้กล่าวถึงจะไม่ได้รับการแก้ไข
ตัวอย่างเช่น:
ให้วันนี้ = วันที่ใหม่ (); วันนี้.setHours(0); การแจ้งเตือน(วันนี้); // ยังคงเป็นวันนี้ แต่ชั่วโมงเปลี่ยนเป็น 0 วันนี้.setHours(0, 0, 0, 0); การแจ้งเตือน(วันนี้); // วันนี้ยังอยู่ ตอนนี้ 00:00:00 เฉียบ
การแก้ไขอัตโนมัติ เป็นคุณสมบัติที่มีประโยชน์มากของวัตถุ Date
เราสามารถตั้งค่านอกช่วงได้ และมันจะปรับเองอัตโนมัติ
ตัวอย่างเช่น:
ให้วันที่ = วันที่ใหม่ (2013, 0, 32); // 32 ม.ค. 2556 ?!? การแจ้งเตือน (วันที่); // ...คือวันที่ 1 กุมภาพันธ์ 2013!
คอมโพเนนต์วันที่ที่อยู่นอกช่วงจะถูกแจกจ่ายโดยอัตโนมัติ
สมมติว่าเราต้องเพิ่มวันที่ "28 กุมภาพันธ์ 2559" ขึ้น 2 วัน อาจเป็น “2 มี.ค.” หรือ “1 มี.ค.” ในกรณีที่เป็นปีอธิกสุรทิน เราไม่จำเป็นต้องคิดเกี่ยวกับมัน เพิ่มแค่ 2 วัน.. วัตถุ Date
จะดำเนินการส่วนที่เหลือ:
ให้วันที่ = วันที่ใหม่ (2016, 1, 28); date.setDate(date.getDate() + 2); การแจ้งเตือน (วันที่); // 1 มี.ค. 2559
คุณลักษณะนั้นมักใช้เพื่อรับวันที่หลังจากช่วงระยะเวลาที่กำหนด ตัวอย่างเช่น ลองหาวันที่ของ “70 วินาทีหลังจากนี้”:
ให้วันที่ = วันที่ใหม่ (); date.setSeconds(date.getSeconds() + 70); การแจ้งเตือน (วันที่); // แสดงวันที่ที่ถูกต้อง
นอกจากนี้เรายังสามารถตั้งค่าเป็นศูนย์หรือค่าลบได้ด้วย ตัวอย่างเช่น:
ให้วันที่ = วันที่ใหม่ (2016, 0, 2); // 2 มกราคม 2559 date.setDate(1); // ตั้งวันที่ 1 ของเดือน การแจ้งเตือน (วันที่); date.setDate(0); // วันขั้นต่ำคือ 1 ดังนั้นจึงถือว่าวันสุดท้ายของเดือนก่อนหน้า การแจ้งเตือน (วันที่); // 31 ธันวาคม 2558
เมื่อวัตถุ Date
ถูกแปลงเป็นตัวเลข มันจะกลายเป็นการประทับเวลาเหมือนกับ date.getTime()
:
ให้วันที่ = วันที่ใหม่ (); การแจ้งเตือน (+วันที่); // จำนวนมิลลิวินาที เช่นเดียวกับ date.getTime()
ผลข้างเคียงที่สำคัญ: สามารถลบวันที่ได้ ผลลัพธ์คือผลต่างมีหน่วยเป็น ms
ที่สามารถใช้สำหรับการวัดเวลา:
ให้เริ่มต้น = วันที่ใหม่ (); //เริ่มจับเวลา //ทำงาน สำหรับ (ให้ i = 0; i < 100,000; i++) { ให้ทำอะไรสักอย่าง = i * i * i; - ให้สิ้นสุด = วันที่ใหม่ (); // สิ้นสุดเวลาการวัด alert( `การวนซ้ำใช้เวลา ${end - start} ms` );
หากเราต้องการเพียงการวัดเวลา เราก็ไม่จำเป็นต้องใช้วัตถุ Date
มีเมธอดพิเศษ Date.now()
ที่ส่งคืนการประทับเวลาปัจจุบัน
มันมีความหมายเทียบเท่ากับ new Date().getTime()
แต่จะไม่สร้างอ็อบเจ็กต์ Date
ระดับกลาง จึงเร็วกว่าและไม่กดดันการเก็บขยะ
ส่วนใหญ่จะใช้เพื่อความสะดวกหรือเมื่อประสิทธิภาพมีความสำคัญ เช่น ในเกมใน JavaScript หรือแอปพลิเคชันพิเศษอื่นๆ
ดังนั้นนี่น่าจะดีกว่า:
เริ่มกันเลย = Date.now(); // มิลลิวินาทีนับจากวันที่ 1 มกราคม 1970 //ทำงาน สำหรับ (ให้ i = 0; i < 100,000; i++) { ให้ทำอะไรสักอย่าง = i * i * i; - ให้จบ = Date.now(); // เสร็จแล้ว alert( `การวนซ้ำใช้เวลา ${end - start} ms` ); // ลบตัวเลข ไม่ใช่วันที่
หากเราต้องการเกณฑ์มาตรฐานที่เชื่อถือได้ของฟังก์ชันที่ใช้ CPU มาก เราควรระมัดระวัง
ตัวอย่างเช่น ลองวัดสองฟังก์ชันที่คำนวณความแตกต่างระหว่างวันที่สองวัน อันไหนเร็วกว่ากัน
การวัดประสิทธิภาพดังกล่าวมักเรียกว่า "เกณฑ์มาตรฐาน"
// เรามี date1 และ date2 ฟังก์ชันใดที่คืนค่าความแตกต่างเป็น ms ได้เร็วกว่า ฟังก์ชั่น diffSubtract (วันที่ 1, วันที่ 2) { กลับ date2 - date1; - // หรือ ฟังก์ชั่น diffGetTime (วันที่ 1, วันที่ 2) { กลับ date2.getTime() - date1.getTime(); -
ทั้งสองทำสิ่งเดียวกันทุกประการ แต่หนึ่งในนั้นใช้ date.getTime()
ที่ชัดเจนเพื่อรับวันที่ในหน่วย ms และอีกอันอาศัยการแปลงวันที่เป็นตัวเลข ผลลัพธ์ของพวกเขาจะเหมือนเดิมเสมอ
แล้วอันไหนเร็วกว่ากัน?
แนวคิดแรกอาจเป็นการดำเนินการหลายๆ ครั้งติดต่อกันและวัดผลต่างของเวลา สำหรับกรณีของเรา ฟังก์ชันนั้นง่ายมาก ดังนั้นเราจึงต้องทำอย่างน้อย 100,000 ครั้ง
มาวัดกัน:
ฟังก์ชั่น diffSubtract (วันที่ 1, วันที่ 2) { กลับ date2 - date1; - ฟังก์ชั่น diffGetTime (วันที่ 1, วันที่ 2) { กลับ date2.getTime() - date1.getTime(); - ม้านั่งทำงาน (f) { ให้ date1 = วันที่ใหม่ (0); ให้ date2 = วันที่ใหม่ (); เริ่มกันเลย = Date.now(); สำหรับ (ให้ i = 0; i < 100000; i++) f(date1, date2); กลับ Date.now() - เริ่มต้น; - alert( 'เวลาของ diffSubtract: ' + bench(diffSubtract) + 'ms' ); alert( 'เวลาของ diffGetTime: ' + ม้านั่ง (diffGetTime) + 'ms' );
ว้าว! การใช้ getTime()
เร็วขึ้นมาก! นั่นเป็นเพราะว่าไม่มีการแปลงประเภท เครื่องยนต์จึงเพิ่มประสิทธิภาพได้ง่ายกว่ามาก
โอเค เรามีอะไรบางอย่าง แต่นั่นยังไม่ใช่เกณฑ์มาตรฐานที่ดี
ลองนึกภาพว่าในขณะที่รัน bench(diffSubtract)
CPU กำลังทำบางสิ่งแบบขนาน และกำลังใช้ทรัพยากร และเมื่อถึงเวลาที่ bench(diffGetTime)
งานนั้นก็เสร็จสิ้น
สถานการณ์ที่ค่อนข้างจริงสำหรับระบบปฏิบัติการหลายกระบวนการสมัยใหม่
ผลที่ได้คือการวัดประสิทธิภาพครั้งแรกจะมีทรัพยากร CPU น้อยกว่าการวัดประสิทธิภาพครั้งที่สอง นั่นอาจนำไปสู่ผลลัพธ์ที่ผิด
เพื่อให้การวัดประสิทธิภาพมีความน่าเชื่อถือมากขึ้น ควรเรียกใช้การวัดประสิทธิภาพทั้งชุดซ้ำหลายครั้ง
ตัวอย่างเช่นเช่นนี้:
ฟังก์ชั่น diffSubtract (วันที่ 1, วันที่ 2) { กลับ date2 - date1; - ฟังก์ชั่น diffGetTime (วันที่ 1, วันที่ 2) { กลับ date2.getTime() - date1.getTime(); - ม้านั่งทำงาน (f) { ให้ date1 = วันที่ใหม่ (0); ให้ date2 = วันที่ใหม่ (); เริ่มกันเลย = Date.now(); สำหรับ (ให้ i = 0; i < 100000; i++) f(date1, date2); กลับ Date.now() - เริ่มต้น; - ให้เวลา 1 = 0; ให้ time2 = 0; // run bench(diffSubtract) และ bench(diffGetTime) สลับกัน 10 ครั้ง สำหรับ (ให้ i = 0; i < 10; i++) { time1 += ม้านั่ง (diffSubtract); time2 += ม้านั่ง (diffGetTime); - alert( 'เวลาทั้งหมดสำหรับ diffSubtract: ' + time1 ); alert( 'เวลาทั้งหมดสำหรับ diffGetTime: ' + time2 );
เอ็นจิ้น JavaScript สมัยใหม่เริ่มใช้การเพิ่มประสิทธิภาพขั้นสูงเฉพาะกับ "โค้ดร้อน" ที่ดำเนินการหลายครั้ง (ไม่จำเป็นต้องปรับสิ่งที่ไม่ค่อยได้ดำเนินการให้เหมาะสม) ดังนั้น ในตัวอย่างข้างต้น การดำเนินการครั้งแรกไม่ได้รับการปรับให้เหมาะสมอย่างเหมาะสม เราอาจต้องการเพิ่มการอุ่นเครื่อง:
// เพิ่มสำหรับ "การทำความร้อน" ก่อนลูปหลัก ม้านั่ง(diffSubtract); ม้านั่ง (diffGetTime); // ตอนนี้เป็นเกณฑ์มาตรฐาน สำหรับ (ให้ i = 0; i < 10; i++) { time1 += ม้านั่ง (diffSubtract); time2 += ม้านั่ง (diffGetTime); -
ระมัดระวังในการทำ microbenchmarking
เอ็นจิ้น JavaScript สมัยใหม่ทำการเพิ่มประสิทธิภาพหลายอย่าง พวกเขาอาจปรับแต่งผลลัพธ์ของ "การทดสอบเทียม" เมื่อเปรียบเทียบกับ "การใช้งานปกติ" โดยเฉพาะอย่างยิ่งเมื่อเราเปรียบเทียบบางสิ่งที่เล็กมาก เช่น วิธีการทำงานของผู้ปฏิบัติงาน หรือฟังก์ชันในตัว ดังนั้น หากคุณต้องการเข้าใจประสิทธิภาพอย่างจริงจัง โปรดศึกษาวิธีการทำงานของกลไก JavaScript จากนั้นคุณก็อาจจะไม่จำเป็นต้องมี Microbenchmarks เลย
บทความดีๆ เกี่ยวกับ V8 สามารถพบได้ที่ https://mrale.ph
เมธอด Date.parse(str) สามารถอ่านวันที่จากสตริงได้
รูปแบบสตริงควรเป็น: YYYY-MM-DDTHH:mm:ss.sssZ
โดยที่:
YYYY-MM-DD
– คือวันที่: ปี-เดือน-วัน
อักขระ "T"
ถูกใช้เป็นตัวคั่น
HH:mm:ss.sss
– คือเวลา: ชั่วโมง นาที วินาที และมิลลิวินาที
ส่วนตัวเลือก 'Z'
จะแสดงเขตเวลาในรูปแบบ +-hh:mm
ตัวอักษร Z
ตัวเดียวจะหมายถึง UTC+0
รูปแบบที่สั้นกว่าก็สามารถทำได้เช่นกัน เช่น YYYY-MM-DD
หรือ YYYY-MM
หรือแม้แต่ YYYY
การเรียก Date.parse(str)
จะแยกวิเคราะห์สตริงในรูปแบบที่กำหนดและส่งกลับการประทับเวลา (จำนวนมิลลิวินาทีตั้งแต่วันที่ 1 มกราคม 1970 UTC+0) หากรูปแบบไม่ถูกต้อง จะส่งกลับ NaN
ตัวอย่างเช่น:
ให้ ms = Date.parse('2012-01-26T13:51:50.417-07:00'); การแจ้งเตือน (มิลลิวินาที); // 1327611110417 (ประทับเวลา)
เราสามารถสร้างวัตถุ new Date
ได้ทันทีจากการประทับเวลา:
ให้วันที่ = วันที่ใหม่ ( Date.parse('2012-01-26T13:51:50.417-07:00') ); การแจ้งเตือน (วันที่);
วันที่และเวลาใน JavaScript จะแสดงด้วยวัตถุ Date เราไม่สามารถสร้าง "เฉพาะวันที่" หรือ "เฉพาะเวลา" ได้: วัตถุ Date
จะมีทั้งสองอย่างเสมอ
เดือนนับจากศูนย์ (ใช่ มกราคมเป็นเดือนศูนย์)
วันในสัปดาห์ใน getDay()
จะนับจากศูนย์ด้วย (นั่นคือวันอาทิตย์)
Date
จะแก้ไขตัวเองโดยอัตโนมัติเมื่อมีการตั้งค่าส่วนประกอบที่อยู่นอกขอบเขต เหมาะสำหรับการบวก/ลบ วัน/เดือน/ชั่วโมง
วันที่สามารถลบออกได้ โดยให้ผลต่างเป็นมิลลิวินาที นั่นเป็นเพราะ Date
จะกลายเป็นการประทับเวลาเมื่อแปลงเป็นตัวเลข
ใช้ Date.now()
เพื่อรับการประทับเวลาปัจจุบันอย่างรวดเร็ว
โปรดทราบว่าการประทับเวลาใน JavaScript แตกต่างจากระบบอื่นๆ ตรงที่มีหน่วยเป็นมิลลิวินาที ไม่ใช่หน่วยวินาที
บางครั้งเราต้องการการวัดเวลาที่แม่นยำกว่านี้ JavaScript เองไม่มีวิธีวัดเวลาเป็นไมโครวินาที (1 ล้านวินาที) แต่สภาพแวดล้อมส่วนใหญ่มีให้ ตัวอย่างเช่น เบราว์เซอร์มี Performance.now() ที่ให้จำนวนมิลลิวินาทีนับจากจุดเริ่มต้นของการโหลดหน้าเว็บด้วยความแม่นยำระดับไมโครวินาที (ตัวเลข 3 หลักหลังจุด):
alert(`กำลังโหลด ${Performance.now()}ms ago`); // บางอย่างเช่น: "กำลังโหลดเมื่อ 34731.26000000001ms ที่แล้ว" // .26 คือไมโครวินาที (260 ไมโครวินาที) // ตัวเลขหลังจุดทศนิยมมากกว่า 3 หลักถือเป็นข้อผิดพลาดที่แม่นยำ มีเพียง 3 หลักแรกเท่านั้นที่ถูกต้อง
Node.js มีโมดูล microtime
และวิธีอื่นๆ ในทางเทคนิคแล้ว อุปกรณ์และสภาพแวดล้อมเกือบทุกประเภทช่วยให้ได้รับความแม่นยำมากขึ้น ไม่ใช่เพียงแค่ Date
เท่านั้น
ความสำคัญ: 5
สร้างวัตถุ Date
สำหรับวันที่: 20 ก.พ. 2555, 03:12 น. โซนเวลาเป็นท้องถิ่น
แสดงโดยใช้ alert
ตัวสร้าง new Date
ใช้โซนเวลาท้องถิ่น สิ่งสำคัญเพียงอย่างเดียวที่ต้องจำคือเดือนต่างๆ เริ่มต้นจากศูนย์
กุมภาพันธ์จึงมีอันดับ 1
นี่คือตัวอย่างที่มีตัวเลขเป็นส่วนประกอบของวันที่:
//วันที่ใหม่ (ปี, เดือน, วันที่, ชั่วโมง, นาที, วินาที, มิลลิวินาที) ให้ d1 = วันที่ใหม่ (2012, 1, 20, 3, 12); แจ้งเตือน(d1);
เรายังสามารถสร้างวันที่จากสตริงได้ เช่นนี้
//วันที่ใหม่(สตริงข้อมูล) ให้ d2 = วันที่ใหม่ ("2012-02-20T03:12"); แจ้งเตือน(d2);
ความสำคัญ: 5
เขียนฟังก์ชัน getWeekDay(date)
เพื่อแสดงวันธรรมดาในรูปแบบย่อ: 'MO', 'TU', 'WE', 'TH', 'FR', 'SA', 'SU'
ตัวอย่างเช่น:
ให้วันที่ = วันที่ใหม่ (2012, 0, 3); // 3 มกราคม 2555 การแจ้งเตือน (getWeekDay(วันที่) ); // ควรส่งออก "TU"
เปิดแซนด์บ็อกซ์พร้อมการทดสอบ
เมธอด date.getDay()
ส่งคืนตัวเลขของวันในสัปดาห์ โดยเริ่มจากวันอาทิตย์
มาสร้างอาร์เรย์ของวันธรรมดาเพื่อที่เราจะได้ชื่อวันที่ถูกต้องตามหมายเลข:
ฟังก์ชั่น getWeekDay (วันที่) { ให้วัน = ['SU', 'MO', 'TU', 'WE', 'TH', 'FR', 'SA']; วันกลับ[date.getDay()]; - ให้วันที่ = วันที่ใหม่ (2014, 0, 3); // 3 มกราคม 2557 การแจ้งเตือน (getWeekDay(วันที่) ); // ฝรั่งเศส
เปิดโซลูชันพร้อมการทดสอบในแซนด์บ็อกซ์
ความสำคัญ: 5
ประเทศในยุโรปมีวันในสัปดาห์โดยเริ่มจากวันจันทร์ (หมายเลข 1) วันอังคาร (หมายเลข 2) และจนถึงวันอาทิตย์ (หมายเลข 7) เขียนฟังก์ชัน getLocalDay(date)
ที่ส่งคืนวันในสัปดาห์ “European” สำหรับ date
ให้วันที่ = วันที่ใหม่ (2012, 0, 3); // 3 มกราคม 2555 การแจ้งเตือน (getLocalDay(วันที่) ); // วันอังคาร น่าจะแสดง 2
เปิดแซนด์บ็อกซ์พร้อมการทดสอบ
ฟังก์ชั่น getLocalDay (วันที่) { ให้วัน = date.getDay(); if (day == 0) { // วันธรรมดา 0 (วันอาทิตย์) คือ 7 ในภาษายุโรป วัน = 7; - วันเดินทางกลับ; -
เปิดโซลูชันพร้อมการทดสอบในแซนด์บ็อกซ์
ความสำคัญ: 4
สร้างฟังก์ชัน getDateAgo(date, days)
เพื่อส่งคืนวันของเดือน days
แล้วจาก date
ตัวอย่างเช่น หากวันนี้เป็นวันที่ 20 ดังนั้น getDateAgo(new Date(), 1)
ควรเป็นวันที่ 19 และ getDateAgo(new Date(), 2)
ควรเป็นวันที่ 18
ควรทำงานได้อย่างน่าเชื่อถือเป็นเวลา days=365
หรือมากกว่า:
ให้วันที่ = วันที่ใหม่ (2015, 0, 2); การแจ้งเตือน (getDateAgo (วันที่, 1) ); // 1, (1 มกราคม 2558) การแจ้งเตือน (getDateAgo (วันที่, 2) ); // 31, (31 ธ.ค. 2557) การแจ้งเตือน(getDateAgo(วันที่, 365) ); // 2, (2 มกราคม 2557)
PS ฟังก์ชั่นไม่ควรแก้ไข date
ที่กำหนด
เปิดแซนด์บ็อกซ์พร้อมการทดสอบ
แนวคิดนั้นง่ายมาก: เพื่อลบจำนวนวันที่กำหนดจาก date
:
ฟังก์ชั่น getDateAgo (วันที่, วัน) { date.setDate(date.getDate() - วัน); วันที่กลับ.getDate(); -
…แต่ฟังก์ชันไม่ควรเปลี่ยน date
นั่นเป็นสิ่งสำคัญ เพราะโค้ดภายนอกที่ให้วันที่นั้นไม่ได้คาดหวังให้มีการเปลี่ยนแปลง
หากต้องการนำไปใช้ ให้ทำการโคลนวันที่ดังนี้:
ฟังก์ชั่น getDateAgo (วันที่, วัน) { ให้ dateCopy = วันที่ใหม่ (วันที่); dateCopy.setDate(date.getDate() - วัน); กลับ dateCopy.getDate(); - ให้วันที่ = วันที่ใหม่ (2015, 0, 2); การแจ้งเตือน (getDateAgo (วันที่, 1) ); // 1, (1 มกราคม 2558) การแจ้งเตือน (getDateAgo (วันที่, 2) ); // 31, (31 ธ.ค. 2557) การแจ้งเตือน(getDateAgo(วันที่, 365) ); // 2, (2 มกราคม 2557)
เปิดโซลูชันพร้อมการทดสอบในแซนด์บ็อกซ์
ความสำคัญ: 5
เขียนฟังก์ชัน getLastDayOfMonth(year, month)
ที่ส่งคืนวันสุดท้ายของเดือน บางครั้งอาจเป็นวันที่ 30, 31 หรือ 28/29 สำหรับเดือนกุมภาพันธ์
พารามิเตอร์:
year
– ปีที่เป็นตัวเลขสี่หลัก เช่น 2012
month
– เดือน ตั้งแต่ 0 ถึง 11
ตัวอย่างเช่น getLastDayOfMonth(2012, 1) = 29
(ปีอธิกสุรทิน ก.พ.)
เปิดแซนด์บ็อกซ์พร้อมการทดสอบ
มาสร้างวันที่โดยใช้เดือนถัดไป แต่ให้ผ่านศูนย์เป็นวัน:
ฟังก์ชั่น getLastDayOfMonth (ปี, เดือน) { ให้วันที่ = วันที่ใหม่ (ปี, เดือน + 1, 0); วันที่กลับ.getDate(); - การแจ้งเตือน (getLastDayOfMonth(2012, 0) ); // 31 การแจ้งเตือน (getLastDayOfMonth(2012, 1) ); // 29 การแจ้งเตือน (getLastDayOfMonth(2013, 1) ); // 28
โดยปกติวันที่จะเริ่มต้นจาก 1 แต่ในทางเทคนิคแล้วเราสามารถส่งผ่านตัวเลขใดๆ ก็ได้ วันที่จะปรับเองอัตโนมัติ ดังนั้นเมื่อเราผ่าน 0 ก็หมายความว่า "หนึ่งวันก่อนวันที่ 1 ของเดือน" หรืออีกนัยหนึ่งคือ "วันสุดท้ายของเดือนก่อนหน้า"
เปิดโซลูชันพร้อมการทดสอบในแซนด์บ็อกซ์
ความสำคัญ: 5
เขียนฟังก์ชัน getSecondsToday()
ซึ่งจะคืนค่าจำนวนวินาทีนับจากจุดเริ่มต้นของวันนี้
ตัวอย่างเช่น หากตอนนี้เป็นเวลา 10:00 am
และไม่มีการเปลี่ยนแปลงเวลาออมแสง ดังนั้น:
getSecondsToday() == 36000 // (3600 * 10)
ฟังก์ชั่นควรใช้งานได้ในวันใดก็ได้ นั่นคือไม่ควรมีค่าฮาร์ดโค้ดเป็น "วันนี้"
หากต้องการทราบจำนวนวินาที เราสามารถสร้างวันที่โดยใช้วันและเวลาปัจจุบัน 00:00:00 จากนั้นลบออกจาก "ตอนนี้"
ความแตกต่างคือจำนวนมิลลิวินาทีตั้งแต่เริ่มต้นวัน ซึ่งเราควรหารด้วย 1,000 เพื่อให้ได้วินาที:
ฟังก์ชั่น getSecondsToday() { ให้ตอนนี้ = วันที่ใหม่ (); // สร้างวัตถุโดยใช้วัน/เดือน/ปีปัจจุบัน ให้วันนี้ = วันที่ใหม่(now.getFullYear(), now.getMonth(), now.getDate()); ให้แตกต่าง = ตอนนี้ - วันนี้; // ms ความแตกต่าง กลับ Math.round (diff / 1,000); // ทำวินาที - การแจ้งเตือน( getSecondsToday() );
ทางเลือกอื่นคือหาค่าชั่วโมง/นาที/วินาทีแล้วแปลงเป็นวินาที:
ฟังก์ชั่น getSecondsToday() { ให้ d = วันที่ใหม่ (); กลับ d.getHours() * 3600 + d.getMinutes() * 60 + d.getSeconds(); - การแจ้งเตือน( getSecondsToday() );
ความสำคัญ: 5
สร้างฟังก์ชัน getSecondsToTomorrow()
ซึ่งจะคืนค่าจำนวนวินาทีจนถึงวันพรุ่งนี้
ตัวอย่างเช่น หากตอนนี้คือ 23:00
ดังนั้น:
getSecondsToTomorrow() == 3600
ป.ล. ฟังก์ชั่นควรใช้งานได้ทุกวัน "วันนี้" ไม่ใช่ฮาร์ดโค้ด
หากต้องการทราบจำนวนมิลลิวินาทีจนถึงวันพรุ่งนี้ เราสามารถลบวันที่ปัจจุบันตั้งแต่ “พรุ่งนี้ 00:00:00” ได้
ขั้นแรก เราสร้าง "วันพรุ่งนี้" จากนั้นจึงทำ:
ฟังก์ชั่น getSecondsToTomorrow() { ให้ตอนนี้ = วันที่ใหม่ (); //พรุ่งนี้เดท ให้พรุ่งนี้ = วันใหม่(now.getFullYear(), now.getMonth(), now.getDate()+1); ให้ความแตกต่าง = พรุ่งนี้ - ตอนนี้; // ความแตกต่างในหน่วย ms กลับ Math.round (diff / 1,000); // แปลงเป็นวินาที -
ทางเลือกอื่น:
ฟังก์ชั่น getSecondsToTomorrow() { ให้ตอนนี้ = วันที่ใหม่ (); ให้ชั่วโมง = now.getHours(); ให้นาที = now.getMinutes(); ให้วินาที = now.getSeconds(); ให้ TotalSecondsToday = (ชั่วโมง * 60 + นาที) * 60 + วินาที; ให้ TotalSecondsInADay = 86400; ส่งคืน TotalSecondsInADay - TotalSecondsToday; -
โปรดทราบว่าหลายประเทศมีเวลาออมแสง (DST) ดังนั้นอาจมีวันที่ 23 หรือ 25 ชั่วโมง เราอาจต้องการรักษาวันดังกล่าวแยกกัน
ความสำคัญ: 4
เขียนฟังก์ชัน formatDate(date)
ที่ควรจัดรูปแบบ date
ที่ดังนี้:
หากนับตั้งแต่ date
ที่ผ่านไปน้อยกว่า 1 วินาที แสดงว่า "right now"
มิฉะนั้น หากนับตั้งแต่ date
ผ่านไปน้อยกว่า 1 นาที แสดงว่า "n sec. ago"
มิฉะนั้น หากน้อยกว่าหนึ่งชั่วโมง ให้แสดง "m min. ago"
มิฉะนั้น วันที่เต็มจะอยู่ในรูปแบบ "DD.MM.YY HH:mm"
นั่นคือ: "day.month.year hours:minutes"
ทั้งหมดอยู่ในรูปแบบ 2 หลัก เช่น 31.12.16 10:00
ตัวอย่างเช่น:
การแจ้งเตือน ( formatDate (วันที่ใหม่ (วันที่ใหม่ - 1)) ); // "ตอนนี้" การแจ้งเตือน( formatDate(วันที่ใหม่(วันที่ใหม่ - 30 * 1,000)) ); // "30 วินาทีที่แล้ว" การแจ้งเตือน ( formatDate (วันที่ใหม่ (วันที่ใหม่ - 5 * 60 * 1,000)) ); // "5 นาทีที่แล้ว" // วันที่เมื่อวาน เช่น 31.12.16 20:00 การแจ้งเตือน ( formatDate (วันที่ใหม่ (วันที่ใหม่ - 86400 * 1,000)) );
เปิดแซนด์บ็อกซ์พร้อมการทดสอบ
หากต้องการทราบเวลานับจาก date
จนถึงขณะนี้ ให้ลบวันที่ออก
ฟังก์ชั่น formatDate (วันที่) { ให้ diff = วันที่ใหม่ () - วันที่; // ความแตกต่างในหน่วยมิลลิวินาที if (diff < 1,000) { // น้อยกว่า 1 วินาที กลับ 'ตอนนี้'; - ให้วินาที = Math.floor (diff / 1,000); // แปลงส่วนต่างเป็นวินาที ถ้า (วินาที < 60) { กลับวินาที + ' วินาที ที่ผ่านมา'; - ให้ min = Math.floor(diff / 60000); // แปลงค่าต่างเป็นนาที ถ้า (ขั้นต่ำ < 60) { กลับนาที + ' นาที ที่ผ่านมา'; - // จัดรูปแบบวันที่ // เพิ่มศูนย์นำหน้าให้กับวัน/เดือน/ชั่วโมง/นาทีด้วยหลักเดียว ให้ d = วันที่; ง = [ '0' + d.getDate(), '0' + (d.getMonth() + 1), '' + d.getFullYear(), '0' + d.getHours() '0' + d.getMinutes() ].map(ส่วนประกอบ => องค์ประกอบ.slice(-2)); // ใช้เลข 2 หลักสุดท้ายของทุกส่วนประกอบ // รวมส่วนประกอบเข้ากับวันที่ กลับ d.slice(0, 3).join('.') + ' ' + d.slice(3).join(':'); - การแจ้งเตือน ( formatDate (วันที่ใหม่ (วันที่ใหม่ - 1)) ); // "ตอนนี้" การแจ้งเตือน( formatDate(วันที่ใหม่(วันที่ใหม่ - 30 * 1,000)) ); // "30 วินาทีที่แล้ว" การแจ้งเตือน( formatDate(วันที่ใหม่(วันที่ใหม่ - 5 * 60 * 1,000)) ); // "5 นาทีที่แล้ว" // เมื่อวาน เช่น 31.12.2016 20:00 การแจ้งเตือน ( formatDate (วันที่ใหม่ (วันที่ใหม่ - 86400 * 1,000)) );
ทางเลือกอื่น:
ฟังก์ชั่น formatDate (วันที่) { ให้ dayOfMonth = date.getDate(); ให้เดือน = date.getMonth() + 1; ให้ปี = date.getFullYear(); ให้ชั่วโมง = date.getHours(); ให้นาที = date.getMinutes(); ให้ diffMs = วันที่ใหม่ () - วันที่; ให้ diffSec = Math.round(diffMs / 1,000); ให้ diffMin = diffSec / 60; ให้ diffHour = diffMin / 60; // การจัดรูปแบบ ปี = year.toString().slice(-2); เดือน = เดือน < 10 ? '0' + เดือน : เดือน; dayOfMonth = วันของเดือน < 10 ? '0' + dayOfMonth : วันของเดือน; ชั่วโมง = ชั่วโมง < 10 ? '0' + ชั่วโมง : ชั่วโมง; นาที = นาที < 10 ? '0' + นาที : นาที; ถ้า (diffSec < 1) { กลับ 'ตอนนี้'; } อื่นถ้า (diffMin < 1) { ส่งกลับ `${diffSec} วินาที มาแล้ว` } อื่นถ้า (ส่วนต่างชั่วโมง < 1) { ส่งคืน `${diffMin} นาที มาแล้ว` } อื่น { ส่งคืน `${dayOfMonth}.${month}.${year} ${hour}:${ minutes}` - -
เปิดโซลูชันพร้อมการทดสอบในแซนด์บ็อกซ์