คุณจะได้รับการประทับเวลาใน JavaScript ได้อย่างไร


4013

ฉันจะรับการประทับเวลาใน JavaScript ได้อย่างไร

สิ่งที่คล้ายกับการประทับเวลา Unixนั่นคือตัวเลขเดียวที่แทนเวลาและวันที่ปัจจุบัน อาจเป็นตัวเลขหรือสตริงก็ได้


จะรับการประทับเวลา 64 บิตใน JS ได้อย่างไร
Alexander Mills

@AlexanderMills เนื่องจาก JavaScript ไม่รองรับจำนวนเต็ม 64 บิตคุณจะต้องได้รับจำนวนเต็ม 32 บิตสองตัว ถามคำถามอื่น
wizzwizz4

คำตอบ:


4912

สั้น & โก๋:

+ 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());


11
อีกข้อยกเว้นที่น่าสังเกตคือ node.js ฉันมาที่นี่จาก Google ที่ต้องการทำสิ่งเดียวกันในโหนด
Milan Babuškov

57
จะไม่Date.now() / 1000 | 0ประสบปัญหาปี 2038 ? new Date('Jan 1, 2039') / 1000 | 0 == -2117514496
gengkev

3
หรือแม้กระทั่งโดยไม่ใช้ Math.floor ..~~(Date.now() / 1000)
Matej

14
@ MilanBabuškov แต่ node.js รองรับDate.now()
OrangeDog

51
ในขณะที่+new Dataฉลาด แต่ devs อื่นไม่สามารถอ่านได้ Date.now()ชัดเจนและทำให้ทุกคนรู้ว่าเกิดอะไรขึ้น
Harry Sadler

514

ฉันชอบสิ่งนี้เพราะมันเล็ก:

+new Date

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

Date.now()

636
ตัวเลือกนี้เป็นความคิดที่ไม่ดี มันถูกมองข้ามอย่างง่ายดายดูเหมือนว่าเป็นตัวพิมพ์ผิดและในความเป็นจริงแล้วก็ขึ้นอยู่กับผลข้างเคียงของภาษา ฉันเห็นโค้ดที่ไม่ดี
inanutshellus

10
@Billy ขณะที่ฉันจำได้ฉันคำนวณเวลาประทับในสองวิธีแก้ปัญหาที่แนะนำ 1 ล้านครั้งต่อครั้งและคำนวณเวลาทำงานโดยเฉลี่ย ฉันวิ่งใน Firefox และ Chrome โดยที่ getTime จะเร็วกว่าในเบราว์เซอร์ทั้งสอง ที่กล่าวว่าแม้ว่าจะช้ากว่าเล็กน้อย (ฉันnew Date().getTime()) โชคดีสำหรับฉันทางออกที่เร็วกว่านั้นเป็นโซลูชันที่อ่านง่ายแล้ว!
inanutshellus

11
เห็นด้วยกับ @ FabrícioMatté พฤติกรรมผู้ดำเนินการที่ไม่ธรรมดาอาจไม่เป็นพื้นฐาน แต่ถ้าคุณยังไม่ได้ทำอะไรเลยอย่าคาดหวังว่าจะสามารถทำงานได้อย่างมีประสิทธิภาพในหลาย ๆ ทีม
Jason T Featheringham

9
@Niklaus นั่นเป็นเพราะคุณกำลังเชื่อมต่อกับสตริงอื่น ในกรณีnew Date().toString()นั้นเรียกว่า
kirb

7
จากความอยากรู้สิ่งที่+ผู้ประกอบการทำเพื่อให้มันออกมาเหมือนสตริง?
zadubz

276

JavaScript ทำงานร่วมกับจำนวนมิลลิวินาทีนับตั้งแต่ยุคในขณะที่ภาษาอื่น ๆ ส่วนใหญ่ทำงานกับวินาที คุณสามารถทำงานกับมิลลิวินาที แต่ทันทีที่คุณส่งค่าเพื่อบอก PHP ฟังก์ชั่นพื้นฐานของ PHP อาจจะล้มเหลว ดังนั้นเพื่อให้แน่ใจว่าฉันใช้เวลาวินาทีเสมอไม่ใช่มิลลิวินาที

สิ่งนี้จะให้การประทับเวลา Unix แก่คุณ (เป็นวินาที):

var unix = Math.round(+new Date()/1000);

สิ่งนี้จะให้มิลลิวินาทีแก่คุณตั้งแต่ยุค (ไม่ใช่ Unix timestamp):

var milliseconds = new Date().getTime();

4
PHP ควรทำงานได้ดีกับมิลลิวินาทีเนื่องจากมันใช้กับ microtime () ฟังก์ชั่น
Nico Burns

5
ในขณะที่ microtime () มีอยู่ฟังก์ชั่นที่เกี่ยวข้องกับเวลาส่วนใหญ่ใน php คาดว่าการประทับเวลาจะเป็นวินาทีและไม่มิลลิวินาที ยิ่งไปกว่านั้นคือ microtime () ส่งคืน float (ถ้าคุณผ่านจริง) โดยที่ส่วนทศนิยมคือเศษส่วนของวินาที (ถูกต้องกับ microsecond) ในขณะที่ newDate (). getTime () ส่งคืน int ซึ่งนับเพียงมิลลิวินาที ยุค ตัวอย่างเช่น (php) หากคุณต้องโทรหา floor (microtime (จริง)) สิ่งนี้จะมีประสิทธิภาพเหมือนกับเวลาโทร () ซึ่งเป็นวินาทีและไม่ใช่ micro หรือมิลลิวินาที หารด้วย 1,000 ดังกล่าวเป็นวิธีแก้ปัญหาที่ง่ายที่สุด
gregghz

49
แทนที่จะเป็นพื้นให้ใช้พื้น 700 ms ยังไม่ใช่วินาทีที่สอง
Anagmate

Unix timestampSeconds since the EpochVS สองคนนี้ไม่ควรจะหมายถึงสิ่งเดียวกันหรือไม่
Mudiaga Ejenavi

147
var time = Date.now || function() {
  return +new Date;
};

time();

6
ทำไม | | ผู้ประกอบการ? Date.now () ไม่สามารถใช้ได้กับเบราว์เซอร์ทั้งหมดหรือไม่
Chris Noe

67
Date.now ()มาจาก JavaScript 1.5 และไม่รองรับ IE 8
SørenLøvborg

9
เอ็นจิ้นที่ไม่ได้รับการอัพเดตเพื่อสนับสนุนเมธอด Date.now สามารถแก้ไขได้โดยใช้ shim ต่อไปนี้: if (! Date.now) {Date.now = function now () {return + (new Date); }; }
ต่อการค้นหา Aronsson

หรือ(Date.now||function(){return +new Date})();

130

ฉันให้คำอธิบายหลายคำตอบในคำตอบนี้ อย่าลังเลที่จะถามคำถามหากมีสิ่งใดที่ไม่ชัดเจน
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


12
| 0 คล้ายกับ Math.floor () เนื่องจากเป็นการดำเนินการบิต (ที่ไม่ทำงานกับการลอย) ปกติมันเร็วกว่า Math.floor () เนื่องจากไม่ใช่การเรียกใช้ฟังก์ชันมันเป็นตัวดำเนินการจาวาสคริปต์ดั้งเดิม
GottZ


@ Christophe ทำไมคุณถึงคิดอย่างนั้น? เพราะการแก้ไข IE? ยกเว้นส่วนนั้นมันค่อนข้างเรียบง่ายและปรับแต่งได้ฉันคิดว่า
GottZ

5
polyfills / shims ไม่ซับซ้อน พวกเขาเป็นผลมาจากการสนับสนุนเบราว์เซอร์ที่แตกต่างกัน 9 เวอร์ชันและอุตสาหกรรมตัดสินใจเลือกมาตรฐานที่พวกเขาใช้และที่พวกเขาทำขึ้นมา
rlemon

8
new Date/1e3|0สำหรับการอ้างอิงขนาดกะทัดรัดที่สุดที่คุณสามารถได้รับคือ
Derek 朕會功夫


61

jQueryมีวิธีการของตนเองในการรับการประทับเวลา:

var timestamp = $.now();

(นอกจากนั้นยังใช้การ(new Date).getTime()แสดงออกเท่านั้น)

ข้อมูลอ้างอิง: http://api.jquery.com/jQuery.now/


2
jQuery จะดูแลปัญหาความเข้ากันได้ข้ามเบราว์เซอร์กับ JavaScript API ที่แตกต่างกัน
Henry Heleine

4
@VisioN ฉันมองหาวิธีที่จะทำบันทึกเวลาใน Node.js ฉันพบคำถามจาวาสคริปต์ใน stackoverflow และได้รับคำตอบใน jQuery ซึ่งไม่ได้ช่วย Javascript และ jQuery เป็นสองสิ่ง หากเราให้คำตอบกับกรอบงานจาวาสคริปต์ทุกครั้งเราก็จะพบกับคำตอบที่ไม่ จำกัด จำนวนซึ่งอาจขัดต่อปรัชญาของ Q / A ใน stackoverflow นอกจากนี้: i.stack.imgur.com/Ledgt.gif : D
Pierre Arlaud

5
@VisioN ใครบอกว่าจาวาสคริปต์ต้องใช้ในเบราว์เซอร์?
Pierre Arlaud

5
@PierreArlaud และใครบอกว่าคำถามนี้เกี่ยวกับ NodeJS เท่านั้น?
VisioN

2
@KingRider ไม่จำเป็นต้องมีในไม่เป็นมูลค่าที่เกิดขึ้นจะเป็นparseInt Number
VisioN

46

console.log(new Date().valueOf()); // returns the number of milliseconds since the epoch


4
นี้เท่ากับ+new Date.. :)
19h

8
เพิ่งทำDate.now()
Orlando

@Orlando เห็นคำตอบอื่น ๆ ปัญหาที่เกิดขึ้นกับตอนนี้ () คือการสนับสนุนเบราว์เซอร์
Christophe


4
@Orlando ไม่เพียง แต่ทำ Date.now ()
Christophe

43

นอกเหนือจากตัวเลือกอื่น ๆ หากคุณต้องการ ISO รูปแบบวันที่คุณจะได้รับโดยตรง

console.log(new Date().toISOString());


มันจะไม่ส่งคืนจำนวนเต็มพร้อมกับคำถามที่ถาม!
alexventuraio

@AlexVentura ด้วยสตริงรูปแบบวันที่ ISO คุณสามารถยกตัวอย่างวัตถุวันที่และลบระหว่างพวกเขา ตัวอย่างเช่น:new Date("2017-05-04T07:11:28.940Z") - new Date("2017-05-04T07:11:14.092Z")
Joaquinglezsantos

41

เพียงเพิ่มค่าต่อไปนี้เป็นฟังก์ชันเพื่อส่งคืนสตริงการประทับเวลาใน 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;
}

11
OP กำลังถามเกี่ยวกับการประทับเวลาจำนวนเต็ม นี่คือการแทนค่าสตริงของเวลา
แบรดโคช์

3
"คล้ายกับการประทับเวลาของ Unix นั่นคือตัวเลขเดียวที่แสดงถึงเวลาปัจจุบัน"
Brad Koch

ฉันมีรหัสที่จะแสดงเวลา แต่บางส่วนของประเทศออสเตรเลียแสดงเต็มวันสคริปต์นี้ช่วยให้ฉันทำลายมันและแสดงถูกต้อง (+1 สำหรับสิ่งนั้น)
Syfer

40

วันที่เป็นวัตถุพื้นเมืองใน 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();

29

หนึ่งฉันยังไม่เห็น

Math.floor(Date.now() / 1000); // current time in seconds

อีกอันที่ฉันยังไม่เคยเห็นก็คือ

var _ = require('lodash'); // from here https://lodash.com/docs#now
_.now();

1
Date.now() /1000 |0ทำสิ่งเดียวกันและได้รับคำตอบก่อนหน้า
GottZ

3
ดี. ฉันแน่ใจว่าการแก้ไขMath.floor()เป็นมัน |0แต่เพียงเพื่อให้ชัดเจนว่ามันมีผลเช่นเดียวกับ ฉันไม่ต้องการทำร้ายคุณหรืออะไร ฉันแค่อยากจะบอกคุณว่าคำตอบของคุณมีอยู่แล้ว โดยการดูคำตอบที่ให้ทั้งหมดมีบางอย่างที่สังเกตเห็นชั้นในทางใดทางหนึ่ง
GottZ

ฉันคิดว่าการนำเข้าทั้งห้องสมุด Lodash เพียงเพื่อใช้_.now()เป็นค่าใช้จ่ายที่มากเกินไป ฉันจะแนะนำเฉพาะการนำเข้าฟังก์ชันการทำงานของ Lodash ที่คุณต้องใช้ (ในกรณีนี้คือ_.now () บน NPM ) แต่ถึงกระนั้นDate.now()ก็ตาม
mgthomas99

27

Date.getTime()วิธีการที่สามารถใช้กับบิดน้อย:

ค่าที่ส่งคืนโดยเมธอด getTime คือจำนวนมิลลิวินาทีตั้งแต่ 1 มกราคม 1970 00:00:00 UTC

หารผลลัพธ์ด้วย 1,000 เพื่อให้ได้เวลา Unix floorหากจำเป็น:

(new Date).getTime() / 1000

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


7
คุณไม่จำเป็นต้องใช้วงเล็บ:new Date().getTime() / 1000
Ry-

14
คุณไม่ต้องการพวกมัน แต่พวกมันทำให้โค้ดอ่านง่ายขึ้น (IMHO) เรื่องของรสนิยมฉันเดา
johndodo

คุณไม่จำเป็นต้องแม้()หลังจากnew Dateและ.getTime()ตั้งแต่/จะเหวี่ยงวัตถุวันที่ลงจำนวนอยู่แล้ว
ดีเร็ก朕會功夫

25

รหัส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);


3
@dchest "Math.floor(new Date().getTime()/1000)".length == 37; "new Date/1E3|0".length == 14; 37 -14 = 23ไบต์;
Valentin Podkamennyi

@MatthieuCharbonnier อะไรคือสิ่งที่อ่านไม่ได้? เครื่องหมายหาร 1E3 ท่อหรือศูนย์ โปรดดูข้อมูลโค้ดในคำตอบของฉันด้านบน
Valentin Podkamennyi

1
@Valentin คุณกำลังลดขนาด / ทำให้โค้ดง่าย ๆ แทบจะไม่มีประโยชน์เลย ฉันไม่เห็นจุดที่จะทำเช่นนั้น เราไม่ได้อยู่ใน Code Golf!
Matthieu Charbonnier

@MatthieuCharbonnier ไม่มีอะไรซับซ้อนเพียงแค่ไวยากรณ์พื้นฐานและตัวดำเนินการ จุดหลักคือการเขียนรหัสสั้นชัดเจนและเข้าใจได้
Valentin Podkamennyi

2
@Valentin โปรดอธิบายฉันว่าการแทนที่Math.floor()โดย|0ทำให้รหัสนี้ "ชัดเจนและเข้าใจ" อธิบายให้ฉันสิ่งที่เป็นจุดที่จะบันทึก 1 ไบต์โดยการแทนที่โดย1000 1E3นี่มันไร้สาระ ฉันเห็นโค้ดที่ไม่ดี
Matthieu Charbonnier

24

ประสิทธิภาพ

วันนี้ - 2020.04.23 ฉันทำการทดสอบเพื่อหาวิธีแก้ปัญหาที่เลือก ฉันทดสอบบน MacOs High Sierra 10.13.6 บน Chrome 81.0, Safari 13.1, Firefox 75.0

สรุปผลการวิจัย

  • สารละลาย Date.now() (E) เร็วที่สุดใน Chrome และ Safari และเร็วเป็นอันดับที่สองใน Firefox และนี่อาจเป็นทางเลือกที่ดีที่สุดสำหรับโซลูชันข้ามเบราว์เซอร์ที่รวดเร็ว
  • Solution performance.now()(G) สิ่งที่น่าแปลกใจคือเร็วกว่า 100 เท่ากว่าโซลูชันอื่น ๆ ใน Firefox แต่ช้าที่สุดใน Chrome
  • โซลูชัน C, D, F ค่อนข้างช้าในเบราว์เซอร์ทั้งหมด

ป้อนคำอธิบายรูปภาพที่นี่

รายละเอียด

ผลลัพธ์สำหรับ chrome

ป้อนคำอธิบายรูปภาพที่นี่

คุณสามารถทำการทดสอบบนเครื่องของคุณที่นี่

โค้ดที่ใช้ในการทดสอบแสดงไว้ในตัวอย่างด้านล่าง


ฉันสนใจถ้าคุณทดสอบperformance.now()ตามที่ควรจะเป็นแม่นยำที่สุดในแง่ของการประทับตรา
SamsonTheBrave

@SamsonTheBrave ขอบคุณสำหรับความคิดเห็นของคุณ - ฉันอัปเดตคำตอบ
Kamil Kiełczewski

เยี่ยมมากขอบคุณสำหรับการอัปเดตของคุณ! ฉันสังเกตเห็นว่าคุณเห็นความแตกต่างของประสิทธิภาพในขณะนี้เพิ่มความเร็วให้กับ Firefox นี่อาจเป็นผลลัพธ์ของ Firefox privacy.reduceTimerPrecisionซึ่งจะปัดเศษผลลัพธ์เป็นมิลลิวินาทีที่ใกล้ที่สุด นอกจากนี้ยังเปิดใช้งานตามค่าเริ่มต้น แต่สามารถปิดใช้งานได้ developer.mozilla.org/en-US/docs/Web/API/Performance/now
SamsonTheBrave

22

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 ดูเอกสารของพวกเขา


21

สำหรับการประทับเวลาด้วยความละเอียดระดับไมโครวินาทีมีperformance.now:

function time() { 
  return performance.now() + performance.timing.navigationStart;
}

นี้อาจยกตัวอย่างเช่นอัตราผลตอบแทน1436140826653.139ในขณะที่Date.nowเพียง 1436140826653แต่ช่วยให้



20

นี่เป็นฟังก์ชั่นง่าย ๆ ในการสร้างการประทับเวลาในรูปแบบ: 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())));
}

10
@ b123400 - (new (chain (-date) (to-i-s-o-string)))นี่คือเสียงกระเพื่อมรุ่น:
Inaimathi

20

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


16

เบราว์เซอร์ใด ๆ ที่ไม่รองรับ Date.now คุณสามารถใช้เพื่อรับวันที่ปัจจุบัน:

currentTime = Date.now() || +new Date()

3
(การลบความคิดเห็นของฉัน) รหัสของคุณมีปัญหา: จะดำเนินการตามวิธี Date.now แทนการตรวจสอบการสนับสนุนก่อน เมื่อเรียกดูแบบเก่าจะทำให้Date.now ไม่ใช่ข้อผิดพลาดของฟังก์ชัน
Salman A

บางทีอาจจะเป็นทางเลือกที่ดีที่จะใช้ประกอบการ ternary ที่จะยืนยันว่าDate.nowมีอยู่จริง (และฟังก์ชั่น) currentTime = typeof Date.now === "function" ? Date.now() : +new Date()ก่อนที่จะพยายามที่จะเรียกมัน
mgthomas99

14

อันนี้มีทางออก: ซึ่งจะทำการแปลง unixtime ให้เป็น tim ใน js ลองดู

var a = new Date(UNIX_timestamp*1000);
var hour = a.getUTCHours();
var min = a.getUTCMinutes();
var sec = a.getUTCSeconds();

14

ฉันได้เรียนรู้วิธีที่ยอดเยี่ยมในการแปลงอ็อบเจกต์ Date ให้เป็น Unix timestamp จากซอร์สโค้ดของJQuery Cookieในวันอื่น

นี่คือตัวอย่าง:

var date = new Date();
var timestamp = +date;

ฉันกำลังจะเขียนวัตถุ Date () ใหม่คุณสามารถคอนโซลบันทึก (ใหม่ Date ()) แล้วอ่านผ่านวิธีการที่เกี่ยวข้องภายใต้ Date / วัตถุ / ฟังก์ชันใหม่
sg28

14

หากต้องการวิธีพื้นฐานในการสร้างการประทับเวลาใน Node.js สิ่งนี้จะทำงานได้ดี

var time = process.hrtime();
var timestamp = Math.round( time[ 0 ] * 1e3 + time[ 1 ] / 1e6 );

ทีมของเราใช้สิ่งนี้เพื่อแคชแคชในสภาพแวดล้อมแบบโลคอลโฮสต์ เอาท์พุทเป็น/dist/css/global.css?v=245521377สถานที่ที่มีการประทับเวลาที่สร้างขึ้นโดย245521377hrtime()

หวังว่านี่จะช่วยได้วิธีการข้างต้นสามารถใช้ได้เช่นกัน แต่ฉันพบว่านี่เป็นวิธีที่ง่ายที่สุดสำหรับความต้องการของเราใน Node.js


13

ดูเหมือนว่าจะใช้งานได้

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

13

หากมีวัตถุประสงค์เพื่อการบันทึกคุณสามารถใช้ISOString

new Date().toISOString()

"2019-05-18T20: 02: 36.694Z"



10

Moment.jsสามารถสรุปความเจ็บปวดมากมายในการจัดการกับ Javascript Dates

ดู: http://momentjs.com/docs/#/displaying/unix-timestamp/

moment().unix();

2
โปรดทราบว่าสิ่งนี้ให้จำนวนวินาที (ไม่ใช่มิลลิวินาที) นับตั้งแต่ยุค UNIX moment().valueOf()หากคุณต้องการมิลลิวินาทีให้ใช้ ดูคำตอบของฉัน
FullStack

9

เมื่อเขียนสิ่งนี้คำตอบยอดนิยมคือ 9 ปีและมีการเปลี่ยนแปลงมากมายตั้งแต่นั้นมา - ไม่น้อยเราได้รับการสนับสนุนอย่างทั่วถึงสำหรับโซลูชันที่ไม่แฮ็ค:

Date.now()

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

const currentTimestamp = (!Date.now ? +new Date() : Date.now());

การดำเนินการนี้จะส่งคืนมิลลิวินาทีนับตั้งแต่เวลาที่แน่นอนไม่ใช่วินาที

เอกสาร MDN ใน Date.now


8

วิธีที่ง่ายกว่า:

var timeStamp=event.timestamp || new Date().getTime();

รู้ว่าeventมาจากไหน คุณต้องให้คำอธิบายที่ดีกว่าเกี่ยวกับวิธีการแก้ปัญหาแทนที่จะเขียนคำตอบ โปรด!
alexventuraio

ฉันกำลังจะเขียนวัตถุ Date () ใหม่คุณสามารถคอนโซล log (new Date ()) แล้วเรียดผ่านวิธีการที่เกี่ยวข้องภายใต้ Date / วัตถุ / ฟังก์ชันใหม่
sg28
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.