ฉันจะรับการประทับเวลาใน JavaScript ได้อย่างไร
สิ่งที่คล้ายกับการประทับเวลา Unixนั่นคือตัวเลขเดียวที่แทนเวลาและวันที่ปัจจุบัน อาจเป็นตัวเลขหรือสตริงก็ได้
ฉันจะรับการประทับเวลาใน JavaScript ได้อย่างไร
สิ่งที่คล้ายกับการประทับเวลา Unixนั่นคือตัวเลขเดียวที่แทนเวลาและวันที่ปัจจุบัน อาจเป็นตัวเลขหรือสตริงก็ได้
คำตอบ:
+ new Date()
โอเปอเรเตอร์ unary เช่นplus
ทริกเกอร์valueOf
เมธอดในDate
วัตถุและส่งกลับค่าการประทับเวลา
รายละเอียด:
เบราว์เซอร์ในปัจจุบันเกือบทั้งหมดที่คุณสามารถใช้Date.now()
เพื่อให้ได้รับการประทับเวลา UTC ในมิลลิวินาที ; ข้อยกเว้นที่น่าสังเกตคือ IE8 และรุ่นก่อนหน้า (ดูตารางความเข้ากันได้ )
คุณสามารถทำสิ่งนี้ได้อย่างง่ายดายแม้ว่า:
if (!Date.now) {
Date.now = function() { return new Date().getTime(); }
}
ในการรับการประทับเวลาในไม่กี่วินาทีคุณสามารถใช้:
Math.floor(Date.now() / 1000)
หรืออีกวิธีหนึ่งคุณสามารถใช้:
Date.now() / 1000 | 0
ซึ่งควรจะเร็วกว่าเล็กน้อย แต่ก็อ่านได้น้อยกว่าด้วย ( ดูคำตอบนี้ด้วย )
ฉันจะแนะนำให้ใช้Date.now()
(กับ shim ความเข้ากันได้) มันจะดีกว่าเล็กน้อยเพราะสั้นกว่าและไม่ได้สร้างDate
วัตถุใหม่ อย่างไรก็ตามหากคุณไม่ต้องการความเข้ากันได้สูงสุดคุณสามารถใช้วิธี "เก่า" เพื่อรับการประทับเวลาเป็นมิลลิวินาที :
new Date().getTime()
ซึ่งคุณสามารถแปลงเป็นวินาทีเช่นนี้:
Math.round(new Date().getTime()/1000)
และคุณยังสามารถใช้valueOf
วิธีการที่เราแสดงไว้ด้านบน:
new Date().valueOf()
เวลาประทับเป็นมิลลิวินาที
var timeStampInMs = window.performance && window.performance.now && window.performance.timing && window.performance.timing.navigationStart ? window.performance.now() + window.performance.timing.navigationStart : Date.now();
console.log(timeStampInMs, Date.now());
~~(Date.now() / 1000)
Date.now()
+new Data
ฉลาด แต่ devs อื่นไม่สามารถอ่านได้ Date.now()
ชัดเจนและทำให้ทุกคนรู้ว่าเกิดอะไรขึ้น
ฉันชอบสิ่งนี้เพราะมันเล็ก:
+new Date
ฉันก็ชอบสิ่งนี้เพราะมันสั้นและเข้ากันได้กับเบราว์เซอร์ที่ทันสมัยและมีคนมากกว่า 500 คนโหวตว่ามันดีกว่า:
Date.now()
new Date().getTime()
) โชคดีสำหรับฉันทางออกที่เร็วกว่านั้นเป็นโซลูชันที่อ่านง่ายแล้ว!
new Date().toString()
นั้นเรียกว่า
+
ผู้ประกอบการทำเพื่อให้มันออกมาเหมือนสตริง?
JavaScript ทำงานร่วมกับจำนวนมิลลิวินาทีนับตั้งแต่ยุคในขณะที่ภาษาอื่น ๆ ส่วนใหญ่ทำงานกับวินาที คุณสามารถทำงานกับมิลลิวินาที แต่ทันทีที่คุณส่งค่าเพื่อบอก PHP ฟังก์ชั่นพื้นฐานของ PHP อาจจะล้มเหลว ดังนั้นเพื่อให้แน่ใจว่าฉันใช้เวลาวินาทีเสมอไม่ใช่มิลลิวินาที
สิ่งนี้จะให้การประทับเวลา Unix แก่คุณ (เป็นวินาที):
var unix = Math.round(+new Date()/1000);
สิ่งนี้จะให้มิลลิวินาทีแก่คุณตั้งแต่ยุค (ไม่ใช่ Unix timestamp):
var milliseconds = new Date().getTime();
Unix timestamp
Seconds since the Epoch
VS สองคนนี้ไม่ควรจะหมายถึงสิ่งเดียวกันหรือไม่
var time = Date.now || function() {
return +new Date;
};
time();
ฉันให้คำอธิบายหลายคำตอบในคำตอบนี้ อย่าลังเลที่จะถามคำถามหากมีสิ่งใดที่ไม่ชัดเจน
PS: น่าเศร้าที่มีคนรวมคำตอบนี้เข้าไว้ด้วยกัน
วิธีแก้ปัญหาที่รวดเร็วและสกปรก:
Date.now() /1000 |0
คำเตือน : มันอาจจะแตกในปี 2038 และคืนค่าลบหากคุณทำ
|0
เวทย์มนตร์ ใช้Math.floor()
แทนในเวลานั้น
Math.floor()
สารละลาย:
Math.floor(Date.now() /1000);
ทางเลือกบางอย่างโง่โดยDerek 朕會功夫นำมาจากความคิดเห็นด้านล่างคำตอบนี้:
new Date/1e3|0
Polyfill เพื่อDate.now()
ทำงาน:
เพื่อให้มันทำงานใน IE คุณสามารถทำได้ (Polyfill จากMDN ):
if (!Date.now) {
Date.now = function now() {
return new Date().getTime();
};
}
หากคุณไม่สนใจเกี่ยวกับปี / วันของสัปดาห์ / เวลาออมแสงคุณสามารถถอดมันออกและใช้มันหลังจาก 2038:
var now = (function () {
var year = new Date(new Date().getFullYear().toString()).getTime();
return function () {
return Date.now() - year
}
})();
ผลลัพธ์บางส่วนของรูปลักษณ์:
new Date() Thu Oct 29 2015 08:46:30 GMT+0100 (Mitteleuropäische Zeit ) new Date(now()) Thu Oct 29 1970 09:46:30 GMT+0100 (Mitteleuropäische Zeit )
แน่นอนว่ามันจะแตกเวลาตามฤดูกาล แต่ขึ้นอยู่กับสิ่งที่คุณกำลังสร้างสิ่งนี้อาจเป็นประโยชน์กับคุณถ้าคุณจำเป็นต้องดำเนินการแบบไบนารีในการประทับเวลาหลังจาก int32 จะแตกในปี 2038
สิ่งนี้จะส่งคืนค่าลบ แต่ถ้าผู้ใช้พีซีที่คุณใช้รหัสของคุณกำลังเปลี่ยนนาฬิกาของพีซีอย่างน้อยเป็น 31 ธันวาคมของปีก่อน
หากคุณต้องการทราบเวลาที่สัมพันธ์กันจากจุดที่รหัสถูกเรียกใช้ครั้งแรกคุณสามารถใช้สิ่งนี้:
var relativeTime = (function () {
var start = Date.now();
return function () {
return Date.now() - start
}
})();
ในกรณีที่คุณใช้ jQuery คุณสามารถใช้$.now()
ตามที่อธิบายไว้ในเอกสารของ jQueryซึ่งทำให้ polyfill ล้าสมัยเนื่องจาก$.now()
ภายในทำสิ่งเดียวกัน:(new Date).getTime()
หากคุณเพียงแค่มีความสุขกับรุ่นของ jQuery ให้พิจารณาการถอนคำตอบนี้เนื่องจากฉันไม่พบตัวเอง
ตอนนี้เป็นการอธิบายเล็ก ๆ น้อย ๆ เกี่ยวกับสิ่งที่|0
ทำ:
โดยการให้|
คุณบอกล่ามที่จะทำไบนารีหรือการดำเนินงาน การทำงานของบิตต้องการตัวเลขแบบสัมบูรณ์ซึ่งจะแปลงผลลัพธ์ทศนิยมให้Date.now() / 1000
เป็นจำนวนเต็ม
ในระหว่างการแปลงนั้นทศนิยมจะถูกลบออกทำให้เกิดผลลัพธ์เช่นเดียวกับการใช้Math.floor()
แต่ใช้รหัสน้อย
ได้รับคำเตือนว่า:มันจะแปลง 64 บิตเป็น 32 บิตเป็นจำนวนเต็ม ซึ่งจะส่งผลให้ข้อมูลสูญหายเมื่อต้องรับมือกับจำนวนมาก การประทับเวลาจะหยุดทำงานหลังจากปี 2038 เนื่องจากการล้นจำนวนเต็ม 32 บิต
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับDate.now
ลิงค์นี้: Date.now()
@ MDN
Date.now()
อ้างอิง: developer.mozilla.org/en-US/docs/JavaScript/Reference/
new Date/1e3|0
สำหรับการอ้างอิงขนาดกะทัดรัดที่สุดที่คุณสามารถได้รับคือ
var timestamp = Number(new Date()); // current time as number
jQueryมีวิธีการของตนเองในการรับการประทับเวลา:
var timestamp = $.now();
(นอกจากนั้นยังใช้การ(new Date).getTime()
แสดงออกเท่านั้น)
ข้อมูลอ้างอิง: http://api.jquery.com/jQuery.now/
parseInt
Number
console.log(new Date().valueOf()); // returns the number of milliseconds since the epoch
+new Date
.. :)
Date.now()
นอกเหนือจากตัวเลือกอื่น ๆ หากคุณต้องการ ISO รูปแบบวันที่คุณจะได้รับโดยตรง
console.log(new Date().toISOString());
new Date("2017-05-04T07:11:28.940Z") - new Date("2017-05-04T07:11:14.092Z")
เพียงเพิ่มค่าต่อไปนี้เป็นฟังก์ชันเพื่อส่งคืนสตริงการประทับเวลาใน Javascript ตัวอย่าง: 15:06:38 PM
function displayTime() {
var str = "";
var currentTime = new Date()
var hours = currentTime.getHours()
var minutes = currentTime.getMinutes()
var seconds = currentTime.getSeconds()
if (minutes < 10) {
minutes = "0" + minutes
}
if (seconds < 10) {
seconds = "0" + seconds
}
str += hours + ":" + minutes + ":" + seconds + " ";
if(hours > 11){
str += "PM"
} else {
str += "AM"
}
return str;
}
วันที่เป็นวัตถุพื้นเมืองใน JavaScript เป็นวิธีการที่เราได้รับข้อมูลทั้งหมดเกี่ยวกับเวลา
เพียงใช้ความระมัดระวังใน JavaScript การประทับเวลาขึ้นอยู่กับชุดคอมพิวเตอร์ไคลเอนต์ดังนั้นจึงไม่ใช่การประทับเวลาที่แม่นยำ 100% เพื่อให้ได้ผลลัพธ์ที่ดีที่สุดคุณต้องได้รับการประทับเวลาจากที่ฝั่งเซิร์ฟเวอร์
อย่างไรก็ตามวิธีที่ฉันชอบคือใช้วานิลลา นี่เป็นวิธีการทั่วไปใน JavaScript:
Date.now(); //return 1495255666921
ใน MDN มีการกล่าวถึงดังต่อไปนี้:
เมธอด Date.now () ส่งคืนจำนวนมิลลิวินาทีที่ผ่านไปตั้งแต่วันที่ 1 มกราคม 1970 00:00:00 UTC
เนื่องจาก now () เป็นวิธีคงที่ของ Date คุณจึงใช้เป็น Date.now () เสมอ
หากคุณใช้เวอร์ชันต่ำกว่า ES5 Date.now();
ไม่ได้ผลและคุณต้องใช้:
new Date().getTime();
หนึ่งฉันยังไม่เห็น
Math.floor(Date.now() / 1000); // current time in seconds
อีกอันที่ฉันยังไม่เคยเห็นก็คือ
var _ = require('lodash'); // from here https://lodash.com/docs#now
_.now();
Date.now() /1000 |0
ทำสิ่งเดียวกันและได้รับคำตอบก่อนหน้า
Math.floor()
เป็นมัน |0
แต่เพียงเพื่อให้ชัดเจนว่ามันมีผลเช่นเดียวกับ ฉันไม่ต้องการทำร้ายคุณหรืออะไร ฉันแค่อยากจะบอกคุณว่าคำตอบของคุณมีอยู่แล้ว โดยการดูคำตอบที่ให้ทั้งหมดมีบางอย่างที่สังเกตเห็นชั้นในทางใดทางหนึ่ง
_.now()
เป็นค่าใช้จ่ายที่มากเกินไป ฉันจะแนะนำเฉพาะการนำเข้าฟังก์ชันการทำงานของ Lodash ที่คุณต้องใช้ (ในกรณีนี้คือ_.now () บน NPM ) แต่ถึงกระนั้นDate.now()
ก็ตาม
Date.getTime()
วิธีการที่สามารถใช้กับบิดน้อย:
ค่าที่ส่งคืนโดยเมธอด getTime คือจำนวนมิลลิวินาทีตั้งแต่ 1 มกราคม 1970 00:00:00 UTC
หารผลลัพธ์ด้วย 1,000 เพื่อให้ได้เวลา Unix floor
หากจำเป็น:
(new Date).getTime() / 1000
Date.valueOf()
วิธีคือหน้าที่เทียบเท่าDate.getTime()
ซึ่งจะทำให้มันเป็นไปได้ที่จะใช้ดำเนินการทางคณิตศาสตร์บนวัตถุวันเพื่อให้บรรลุผลเหมือนกัน ในความคิดของฉันวิธีการนี้มีผลต่อความสามารถในการอ่าน
new Date().getTime() / 1000
()
หลังจากnew Date
และ.getTime()
ตั้งแต่/
จะเหวี่ยงวัตถุวันที่ลงจำนวนอยู่แล้ว
รหัสMath.floor(new Date().getTime() / 1000)
สามารถย่อให้new Date / 1E3 | 0
เล็กสุด
พิจารณาข้ามการgetTime()
เรียกใช้โดยตรงและใช้| 0
แทนMath.floor()
ฟังก์ชัน นอกจากนี้ยังเป็นการดีที่จะจำไว้ว่า1E3
จะเทียบเท่าสั้นกว่าสำหรับ1000
(ตัวพิมพ์ใหญ่ E เป็นที่ต้องการมากกว่าตัวพิมพ์เล็กเพื่อระบุ1E3
ว่าเป็นค่าคงที่)
ดังนั้นคุณจะได้รับสิ่งต่อไปนี้:
var ts = new Date / 1E3 | 0;
console.log(ts);
"Math.floor(new Date().getTime()/1000)".length == 37;
"new Date/1E3|0".length == 14;
37 -14 = 23ไบต์;
Math.floor()
โดย|0
ทำให้รหัสนี้ "ชัดเจนและเข้าใจ" อธิบายให้ฉันสิ่งที่เป็นจุดที่จะบันทึก 1 ไบต์โดยการแทนที่โดย1000
1E3
นี่มันไร้สาระ ฉันเห็นโค้ดที่ไม่ดี
วันนี้ - 2020.04.23 ฉันทำการทดสอบเพื่อหาวิธีแก้ปัญหาที่เลือก ฉันทดสอบบน MacOs High Sierra 10.13.6 บน Chrome 81.0, Safari 13.1, Firefox 75.0
Date.now()
(E) เร็วที่สุดใน Chrome และ Safari และเร็วเป็นอันดับที่สองใน Firefox และนี่อาจเป็นทางเลือกที่ดีที่สุดสำหรับโซลูชันข้ามเบราว์เซอร์ที่รวดเร็วperformance.now()
(G) สิ่งที่น่าแปลกใจคือเร็วกว่า 100 เท่ากว่าโซลูชันอื่น ๆ ใน Firefox แต่ช้าที่สุดใน Chromeผลลัพธ์สำหรับ chrome
คุณสามารถทำการทดสอบบนเครื่องของคุณที่นี่
โค้ดที่ใช้ในการทดสอบแสดงไว้ในตัวอย่างด้านล่าง
performance.now()
ตามที่ควรจะเป็นแม่นยำที่สุดในแง่ของการประทับตรา
privacy.reduceTimerPrecision
ซึ่งจะปัดเศษผลลัพธ์เป็นมิลลิวินาทีที่ใกล้ที่สุด นอกจากนี้ยังเปิดใช้งานตามค่าเริ่มต้น แต่สามารถปิดใช้งานได้ developer.mozilla.org/en-US/docs/Web/API/Performance/now
moment.js
ผมขอแนะนำให้ใช้ ในการรับจำนวนมิลลิวินาทีนับตั้งแต่ยุค UNIX ให้ทำ
moment().valueOf()
ในการรับจำนวนวินาทีตั้งแต่ UNIX ยุคให้ทำ
moment().unix()
นอกจากนี้คุณยังสามารถแปลงเวลาเป็นดังนี้:
moment('2015-07-12 14:59:23', 'YYYY-MM-DD HH:mm:ss').valueOf()
ฉันทำอย่างนั้นตลอดเวลา เล่นสำนวนไม่มีเจตนา
วิธีใช้moment.js
ในเบราว์เซอร์:
<script src="moment.js"></script>
<script>
moment().valueOf();
</script>
สำหรับรายละเอียดเพิ่มเติมรวมถึงวิธีอื่น ๆ ในการติดตั้งและใช้ MomentJS ดูเอกสารของพวกเขา
สำหรับการประทับเวลาด้วยความละเอียดระดับไมโครวินาทีมีperformance.now
:
function time() {
return performance.now() + performance.timing.navigationStart;
}
นี้อาจยกตัวอย่างเช่นอัตราผลตอบแทน1436140826653.139
ในขณะที่Date.now
เพียง 1436140826653
แต่ช่วยให้
คุณสามารถใช้ได้
var timestamp = new Date().getTime();
console.log(timestamp);
เพื่อรับการประทับเวลาปัจจุบัน ไม่จำเป็นต้องทำอะไรพิเศษ
นี่เป็นฟังก์ชั่นง่าย ๆ ในการสร้างการประทับเวลาในรูปแบบ: mm / dd / yy hh: mi: ss
function getTimeStamp() {
var now = new Date();
return ((now.getMonth() + 1) + '/' +
(now.getDate()) + '/' +
now.getFullYear() + " " +
now.getHours() + ':' +
((now.getMinutes() < 10)
? ("0" + now.getMinutes())
: (now.getMinutes())) + ':' +
((now.getSeconds() < 10)
? ("0" + now.getSeconds())
: (now.getSeconds())));
}
(new (chain (-date) (to-i-s-o-string)))
นี่คือเสียงกระเพื่อมรุ่น:
// The Current Unix Timestamp
// 1443534720 seconds since Jan 01 1970. (UTC)
// seconds
console.log(Math.floor(new Date().valueOf() / 1000)); // 1443534720
console.log(Math.floor(Date.now() / 1000)); // 1443534720
console.log(Math.floor(new Date().getTime() / 1000)); // 1443534720
// milliseconds
console.log(Math.floor(new Date().valueOf())); // 1443534720087
console.log(Math.floor(Date.now())); // 1443534720087
console.log(Math.floor(new Date().getTime())); // 1443534720087
// jQuery
// seconds
console.log(Math.floor($.now() / 1000)); // 1443534720
// milliseconds
console.log($.now()); // 1443534720087
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
เบราว์เซอร์ใด ๆ ที่ไม่รองรับ Date.now คุณสามารถใช้เพื่อรับวันที่ปัจจุบัน:
currentTime = Date.now() || +new Date()
Date.now
มีอยู่จริง (และฟังก์ชั่น) currentTime = typeof Date.now === "function" ? Date.now() : +new Date()
ก่อนที่จะพยายามที่จะเรียกมัน
อันนี้มีทางออก: ซึ่งจะทำการแปลง unixtime ให้เป็น tim ใน js ลองดู
var a = new Date(UNIX_timestamp*1000);
var hour = a.getUTCHours();
var min = a.getUTCMinutes();
var sec = a.getUTCSeconds();
ฉันได้เรียนรู้วิธีที่ยอดเยี่ยมในการแปลงอ็อบเจกต์ Date ให้เป็น Unix timestamp จากซอร์สโค้ดของJQuery Cookieในวันอื่น
นี่คือตัวอย่าง:
var date = new Date();
var timestamp = +date;
หากต้องการวิธีพื้นฐานในการสร้างการประทับเวลาใน Node.js สิ่งนี้จะทำงานได้ดี
var time = process.hrtime();
var timestamp = Math.round( time[ 0 ] * 1e3 + time[ 1 ] / 1e6 );
ทีมของเราใช้สิ่งนี้เพื่อแคชแคชในสภาพแวดล้อมแบบโลคอลโฮสต์ เอาท์พุทเป็น/dist/css/global.css?v=245521377
สถานที่ที่มีการประทับเวลาที่สร้างขึ้นโดย245521377
hrtime()
หวังว่านี่จะช่วยได้วิธีการข้างต้นสามารถใช้ได้เช่นกัน แต่ฉันพบว่านี่เป็นวิธีที่ง่ายที่สุดสำหรับความต้องการของเราใน Node.js
ดูเหมือนว่าจะใช้งานได้
console.log(clock.now);
// returns 1444356078076
console.log(clock.format(clock.now));
//returns 10/8/2015 21:02:16
console.log(clock.format(clock.now + clock.add(10, 'minutes')));
//returns 10/8/2015 21:08:18
var clock = {
now:Date.now(),
add:function (qty, units) {
switch(units.toLowerCase()) {
case 'weeks' : val = qty * 1000 * 60 * 60 * 24 * 7; break;
case 'days' : val = qty * 1000 * 60 * 60 * 24; break;
case 'hours' : val = qty * 1000 * 60 * 60; break;
case 'minutes' : val = qty * 1000 * 60; break;
case 'seconds' : val = qty * 1000; break;
default : val = undefined; break;
}
return val;
},
format:function (timestamp){
var date = new Date(timestamp);
var year = date.getFullYear();
var month = date.getMonth() + 1;
var day = date.getDate();
var hours = date.getHours();
var minutes = "0" + date.getMinutes();
var seconds = "0" + date.getSeconds();
// Will display time in xx/xx/xxxx 00:00:00 format
return formattedTime = month + '/' +
day + '/' +
year + ' ' +
hours + ':' +
minutes.substr(-2) +
':' + seconds.substr(-2);
}
};
หากมีวัตถุประสงค์เพื่อการบันทึกคุณสามารถใช้ISOString
new Date().toISOString()
"2019-05-18T20: 02: 36.694Z"
Moment.jsสามารถสรุปความเจ็บปวดมากมายในการจัดการกับ Javascript Dates
ดู: http://momentjs.com/docs/#/displaying/unix-timestamp/
moment().unix();
moment().valueOf()
หากคุณต้องการมิลลิวินาทีให้ใช้ ดูคำตอบของฉัน
เมื่อเขียนสิ่งนี้คำตอบยอดนิยมคือ 9 ปีและมีการเปลี่ยนแปลงมากมายตั้งแต่นั้นมา - ไม่น้อยเราได้รับการสนับสนุนอย่างทั่วถึงสำหรับโซลูชันที่ไม่แฮ็ค:
Date.now()
หากคุณต้องการที่จะมั่นใจอย่างแน่นอนว่าสิ่งนี้จะไม่ทำลายในเบราว์เซอร์โบราณ (ก่อน IE9) บางอย่างคุณสามารถวางไว้ด้านหลังเช็คเช่น:
const currentTimestamp = (!Date.now ? +new Date() : Date.now());
การดำเนินการนี้จะส่งคืนมิลลิวินาทีนับตั้งแต่เวลาที่แน่นอนไม่ใช่วินาที
วิธีที่ง่ายกว่า:
var timeStamp=event.timestamp || new Date().getTime();
event
มาจากไหน คุณต้องให้คำอธิบายที่ดีกว่าเกี่ยวกับวิธีการแก้ปัญหาแทนที่จะเขียนคำตอบ โปรด!